/* ======================================================================== * PlantUML : a free UML diagram generator * ======================================================================== * * (C) Copyright 2009-2017, Arnaud Roques * * Project Info: http://plantuml.com * * If you like this project or if you find it useful, you can support us at: * * http://plantuml.com/patreon (only 1$ per month!) * http://plantuml.com/paypal * * This file is part of PlantUML. * * PlantUML is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PlantUML distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * * Original Author: Arnaud Roques * * */ package net.sourceforge.plantuml.cucadiagram.entity; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import net.sourceforge.plantuml.cucadiagram.Bodier; import net.sourceforge.plantuml.cucadiagram.Code; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.cucadiagram.GroupRoot; import net.sourceforge.plantuml.cucadiagram.GroupType; import net.sourceforge.plantuml.cucadiagram.IEntity; import net.sourceforge.plantuml.cucadiagram.IGroup; import net.sourceforge.plantuml.cucadiagram.ILeaf; import net.sourceforge.plantuml.cucadiagram.LeafType; import net.sourceforge.plantuml.cucadiagram.Link; import net.sourceforge.plantuml.cucadiagram.LongCode; import net.sourceforge.plantuml.cucadiagram.Stereotype; import net.sourceforge.plantuml.skin.VisibilityModifier; public class EntityFactory { private final Map leafs = new Protect(new LinkedHashMap()); private final List links = new ArrayList(); private final Map groups = new Protect(new LinkedHashMap()); private int rawLayout; private final IGroup rootGroup = new GroupRoot(this); private final Set hiddenTypes; private final Set hiddenStereotype; public EntityFactory(Set hiddenTypes, Set hiddenStereotype) { this.hiddenTypes = hiddenTypes; this.hiddenStereotype = hiddenStereotype; } public boolean isHidden(ILeaf leaf) { if (hiddenTypes.contains(leaf.getLeafType())) { return true; } final Stereotype stereotype = leaf.getStereotype(); if (stereotype != null && hiddenStereotype.contains(stereotype.getLabel(false))) { return true; } return false; } public ILeaf createLeaf(Code code, Display display, LeafType entityType, IGroup parentContainer, Set hides, String namespaceSeparator) { if (entityType == null) { throw new IllegalArgumentException(); } final Bodier bodier = new Bodier(entityType, hides); final LongCode longCode = getLongCode(code, namespaceSeparator); final EntityImpl result = new EntityImpl(this, code, bodier, parentContainer, entityType, longCode, namespaceSeparator, rawLayout); result.setDisplay(display); return result; } private LongCode getLongCode(Code code, String namespaceSeparator) { final LongCode result = LongCode.of(code.getFullName(), namespaceSeparator); // if (result.toString().equals(code.toString()) == false) { // System.err.println("result=" + result); // System.err.println(" code =" + code); // throw new UnsupportedOperationException(); // } return result; } public IGroup createGroup(Code code, Display display, Code namespace2, GroupType groupType, IGroup parentContainer, Set hides, String namespaceSeparator) { if (groupType == null) { throw new IllegalArgumentException(); } final Bodier bodier = new Bodier(null, hides); final LongCode longCode = getLongCode(code, namespaceSeparator); final EntityImpl result = new EntityImpl(this, code, bodier, parentContainer, groupType, namespace2, longCode, namespaceSeparator, rawLayout); if (Display.isNull(display) == false) { result.setDisplay(display); } return result; } public IGroup getRootGroup() { return rootGroup; } public final Map getLeafs() { return Collections.unmodifiableMap(leafs); } public void addLeaf(ILeaf entity) { leafs.put(entity.getCode(), entity); } public void incRawLayout() { rawLayout++; } void removeLeaf(Code code) { final IEntity removed = leafs.remove(code); if (removed == null) { throw new IllegalArgumentException(); } } public void addGroup(IGroup group) { groups.put(group.getCode(), group); } void removeGroup(Code code) { final IEntity removed = groups.remove(code); if (removed == null) { throw new IllegalArgumentException(); } } public final Map getGroups() { return Collections.unmodifiableMap(groups); } public final List getLinks() { return Collections.unmodifiableList(links); } public void addLink(Link link) { links.add(link); } public void removeLink(Link link) { final boolean ok = links.remove(link); if (ok == false) { throw new IllegalArgumentException(); } } public IGroup muteToGroup(Code code, Code namespace2, GroupType type, IGroup parent) { final ILeaf leaf = getLeafs().get(code); ((EntityImpl) leaf).muteToGroup(namespace2, type, parent); final IGroup result = (IGroup) leaf; removeLeaf(code); return result; } static class Protect implements Map { private final Map m; public Protect(Map data) { this.m = data; } public O remove(Object key) { if (key instanceof Code == false) { throw new IllegalArgumentException(); } return m.remove(key); } public O get(Object key) { if (key instanceof Code == false) { throw new IllegalArgumentException(); } return m.get(key); } public Set keySet() { return m.keySet(); } public void putAll(Map m) { this.m.putAll(m); } public boolean containsKey(Object key) { if (key instanceof Code == false) { throw new IllegalArgumentException(); } return m.containsKey(key); } public boolean isEmpty() { return m.isEmpty(); } public O put(Code key, O value) { if (key instanceof Code == false) { throw new IllegalArgumentException(); } return m.put(key, value); } public boolean containsValue(Object value) { return m.containsValue(value); } public Set> entrySet() { return m.entrySet(); } public Collection values() { return m.values(); } public void clear() { m.clear(); } public int size() { return m.size(); } } }