/* ======================================================================== * PlantUML : a free UML diagram generator * ======================================================================== * * (C) Copyright 2009-2017, Arnaud Roques * * Project Info: http://plantuml.com * * This file is part of PlantUML. * * Licensed under The MIT License (Massachusetts Institute of Technology License) * * See http://opensource.org/licenses/MIT * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * Original Author: Arnaud Roques */ package net.sourceforge.plantuml.cucadiagram; import java.util.Map; import net.sourceforge.plantuml.StringUtils; public class Code implements Comparable { private final String fullName; private final String separator; private Code(String fullName, String separator) { if (fullName == null) { throw new IllegalArgumentException(); } this.fullName = fullName; this.separator = separator; } // public String getNamespaceSeparator() { // return separator; // } public Code withSeparator(String separator) { if (separator == null) { throw new IllegalArgumentException(); } if (this.separator != null && this.separator.equals(separator) == false) { throw new IllegalStateException(); } return new Code(fullName, separator); } public static Code of(String code) { return of(code, null); } public static Code of(String code, String separator) { if (code == null) { return null; } return new Code(code, separator); } public final String getFullName() { return fullName; } @Override public String toString() { return fullName + "(" + separator + ")"; } @Override public int hashCode() { return fullName.hashCode(); } @Override public boolean equals(Object obj) { final Code other = (Code) obj; return this.fullName.equals(other.fullName); } public Code addSuffix(String suffix) { return new Code(fullName + suffix, separator); } public int compareTo(Code other) { return this.fullName.compareTo(other.fullName); } public Code eventuallyRemoveStartingAndEndingDoubleQuote(String format) { return Code.of(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(fullName, format), separator); } private final String getNamespace(Map leafs) { String name = this.getFullName(); if (separator == null) { throw new IllegalArgumentException(toString()); } do { final int x = name.lastIndexOf(separator); if (x == -1) { return null; } name = name.substring(0, x); } while (leafs.containsKey(Code.of(name, separator))); return name; } public final Code getShortName(Map leafs) { if (separator == null) { throw new IllegalArgumentException(); } final String code = this.getFullName(); final String namespace = getNamespace(leafs); if (namespace == null) { return Code.of(code, separator); } return Code.of(code.substring(namespace.length() + separator.length()), separator); } public final Code getFullyQualifiedCode(IGroup g) { if (separator == null) { throw new IllegalArgumentException(); } final String full = this.getFullName(); if (full.startsWith(separator)) { return Code.of(full.substring(separator.length()), separator); } if (full.contains(separator)) { return Code.of(full, separator); } if (EntityUtils.groupRoot(g)) { return Code.of(full, separator); } final Code namespace2 = g.getNamespace2(); if (namespace2 == null) { return Code.of(full, separator); } return Code.of(namespace2.fullName + separator + full, separator); } }