/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo 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. * * OpenFlexo is 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package cb.parser; import java.io.PrintStream; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import cb.petal.Association; import cb.petal.BooleanLiteral; import cb.petal.Class; import cb.petal.ClassAttribute; import cb.petal.DescendingVisitor; import cb.petal.Design; import cb.petal.FloatLiteral; import cb.petal.InheritanceRelationship; import cb.petal.IntegerLiteral; import cb.petal.List; import cb.petal.Location; import cb.petal.Operation; import cb.petal.Parameter; import cb.petal.Petal; import cb.petal.PetalFile; import cb.petal.PetalNode; import cb.petal.PetalObject; import cb.petal.Role; import cb.petal.StringLiteral; import cb.petal.Tag; import cb.petal.Tuple; import cb.petal.Value; /** * Print petal file exactly like Rose would with some limitations concerning indendattion, i.e., if you don't mind white space, input and * output files are identical. * * @version $Id: EOModelExtractor.java,v 1.3 2011/09/12 11:47:21 gpolet Exp $ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> */ public class EOModelExtractor extends DescendingVisitor { private PrintStream out; private int level = 0; private int column = 0, row = 1; public Hashtable<String, cb.petal.Class> classes; private Hashtable<Role, String> relations; public Vector<Class> orderedClasses; public EOModelExtractor(PrintStream out) { this.out = out; orderedClasses = new Vector<cb.petal.Class>(); classes = new Hashtable<String, Class>(); relations = new Hashtable<Role, String>(); } public void arrangeRelationship() { Enumeration en = classes.elements(); while (en.hasMoreElements()) { cb.petal.Class currentClass = (cb.petal.Class) en.nextElement(); Iterator it = relations.keySet().iterator(); while (it.hasNext()) { Role rel = (Role) it.next(); if (relations.get(rel).equals(getLabel(currentClass))) { currentClass.addRelationship(rel); System.out.println("adding " + getLabel(rel) + " to class " + getLabel(currentClass)); } } } } @Override public void visitObject(PetalObject obj) { for (Iterator i = obj.getPropertyList().iterator(); i.hasNext();) { ((PetalNode) i.next()).accept(this); } } @Override public void visit(cb.petal.Class obj) { String className = getLabel(obj); orderedClasses.add(obj); classes.put(className, obj); String superClass = getSuperClassLabel(obj); System.out.println("Class:" + className + (superClass.length() > 0 ? " extends " + superClass : "")); System.out.println("Description:" + obj.getDocumentation()); List classAttributes = obj.getClassAttributeList(); if (classAttributes != null && classAttributes.getChildCount() > 0) { for (int j = 0; j < classAttributes.getChildCount(); j++) { ClassAttribute attrib = (ClassAttribute) classAttributes.get(j); String attributeName = getLabel(attrib); System.out.println("\tAttribute:" + attributeName); System.out.println("\tDescription:" + attrib.getDocumentation()); } } visitObject(obj); } public static String getSuperClassLabel(cb.petal.Class obj) { List superClasses = obj.getSuperclassList(); if (superClasses == null || superClasses.getChildCount() == 0) { return ""; } if (superClasses.getChildCount() > 1) { return "MoreThanOne"; } InheritanceRelationship superClass = (InheritanceRelationship) superClasses.get(0); return getSupplierShortName(superClass); } public static String getSupplierShortName(Role role) { return role.getSupplier().substring(role.getSupplier().lastIndexOf(":") + 1); } public static String getSupplierShortName(InheritanceRelationship role) { return role.getSupplier().substring(role.getSupplier().lastIndexOf(":") + 1); } public static String getLabel(PetalObject object) { Iterator it = object.getParameterList().iterator(); if (it.hasNext()) { return (String) it.next(); } return "no_name"; } @Override public void visit(Association obj) { List roleList = obj.getRoles(); if (roleList != null && roleList.getChildCount() > 0) { if (roleList.getChildCount() == 2) { Role role1 = (Role) roleList.get(0); Role role2 = (Role) roleList.get(1); role1.commentaires = obj.getDocumentation() != null ? obj.getDocumentation() : ""; role2.commentaires = obj.getDocumentation() != null ? obj.getDocumentation() : ""; boolean isRole1ToOne = role1.getCardinality() != null && role1.getCardinality().equals("1"); boolean isRole2ToOne = role2.getCardinality() != null && role2.getCardinality().equals("1"); System.out.println("Relationship : " + getLabel(role1) + "(" + getSupplierShortName(role2) + (isRole1ToOne ? "-->" : "-->>") + getSupplierShortName(role1) + ")"); System.out.println("Relationship : " + getLabel(role2) + "(" + getSupplierShortName(role1) + (isRole2ToOne ? "-->" : "-->>") + getSupplierShortName(role2) + ")"); relations.put(role1, getSupplierShortName(role2)); relations.put(role2, getSupplierShortName(role1)); } else { System.out.println("Association with " + roleList.getChildCount() + " roles."); } } else { System.out.println("Association with no roles"); } } @Override public void visit(Operation op) { String opLabel = getLabel(op); StringBuffer params = new StringBuffer(""); List opParameters = op.getParameters(); if (opParameters != null && opParameters.getChildCount() > 0) { for (int j = 0; j < opParameters.getChildCount(); j++) { Parameter param = (Parameter) opParameters.get(j); String paramLabel = getLabel(param); String paramType = param.getType(); params.append(paramLabel).append(" ").append(paramType); if (j + 1 < opParameters.getChildCount()) { params.append(" ,"); } System.out.println("\tOperation:" + opLabel + "(" + params.toString() + ")"); System.out.println("\tDescription:" + (op.getDocumentation() != null ? op.getDocumentation() : "")); } } } public static String getOperationsDescription(cb.petal.Class obj) { List opList = obj.getOperationList(); StringBuffer answer = new StringBuffer(""); if (opList != null && opList.getChildCount() > 0) { for (int i = 0; i < opList.getChildCount(); i++) { Operation op = (Operation) opList.get(i); String opLabel = getLabel(op); StringBuffer params = new StringBuffer(""); List opParameters = op.getParameters(); if (opParameters != null && opParameters.getChildCount() > 0) { for (int j = 0; j < opParameters.getChildCount(); j++) { Parameter param = (Parameter) opParameters.get(j); String paramLabel = getLabel(param); String paramType = param.getType(); params.append(paramType).append(" ").append(paramLabel); if (j + 1 < opParameters.getChildCount()) { params.append(" ,"); } if (answer.length() > 0) { answer.append("\n\n"); } answer.append("Operation : " + opLabel + "(" + params.toString() + ")\n"); answer.append("\tDescription:" + (op.getDocumentation() != null ? op.getDocumentation() : "")); } } } } return answer.toString(); } @Override public void visit(Petal obj) { visitObject(obj); } @Override public void visit(Design obj) { visitObject(obj); } /* public void visit(Operation obj){} public void visit(Font obj){} public void visit(ClassAttribute obj){} public void visit(Defaults obj){} public void visit(Attribute obj){} public void visit(Processes obj){} public void visit(Properties obj){} public void visit(SubSystem obj){} public void visit(UseCase obj){} public void visit(UseCaseDiagram obj){} public void visit(Compartment obj){} public void visit(ItemLabel obj){} public void visit(Label obj){} public void visit(ClassCategory obj){} public void visit(LogicalCategory obj){} public void visit(UseCaseCategory obj){} public void visit(ClassView obj){} public void visit(CategoryView obj){} public void visit(Parameter obj){} public void visit(Role obj){} public void visit(ModView obj){} public void visit(SemanticInfo obj){} public void visit(UsesRelationship obj){} public void visit(RealizeRelationship obj){} public void visit(InheritanceRelationship obj){} public void visit(InstantiationRelationship obj){} public void visit(ConnectionRelationship obj){} public void visit(DependencyRelationship obj){} public void visit(SimpleViewObject obj){} public void visit(ClassDiagram obj){} public void visit(ImportView obj){} public void visit(InheritView obj){} public void visit(InstantiateView obj){} public void visit(ModVisView obj){} public void visit(ModuleDiagram obj){} public void visit(ProcessDiagram obj){} public void visit(SubSysView obj){} public void visit(VisibilityRelationship obj){} public void visit(Module obj){} public void visit(RoleView obj){} public void visit(SegLabel obj){} public void visit(AssociationViewNew obj){} public void visit(NoteView obj){} public void visit(InheritTreeView obj){} public void visit(AttachView obj){} public void visit(AssocAttachView obj){} public void visit(Mechanism obj){} public void visit(cb.petal.Object obj){} public void visit(Link obj){} public void visit(Message obj){} public void visit(Event obj){} public void visit(StateView obj){} public void visit(TransView obj){} public void visit(ActionTime obj){} public void visit(StateDiagram obj){} public void visit(State obj){} public void visit(StateTransition obj){} public void visit(SendEvent obj){} public void visit(Action obj){} public void visit(StateMachine obj){} public void visit(UsesView obj){} public void visit(InteractionDiagram obj){} public void visit(InterObjView obj){} public void visit(MessView obj){} public void visit(UseCaseView obj){} public void visit(LinkSelfView obj){} public void visit(LinkView obj){} public void visit(DataFlowView obj){} public void visit(ObjectView obj){} public void visit(FocusOfControl obj){} public void visit(SelfMessView obj){} public void visit(InterMessView obj){} public void visit(ObjectDiagram obj){} public void visit(ExternalDoc obj){} public void visit(ClassInstanceView obj){} public void visit(Processor obj){} public void visit(Process obj){} public void visit(Device obj){} public void visit(ProcessorView obj){} public void visit(DeviceView obj){} public void visit(ConnectionView obj){} public void visit(RealizeView obj){} public void visit(DependencyView obj){} public void visit(InterfaceView obj){} public void visit(ModuleVisibilityRelationship obj){} public void visit(Swimlane obj){} public void visit(Partition obj){} public void visit(ActivityStateView obj){} public void visit(DecisionView obj){} public void visit(SynchronizationView obj){} public void visit(ActivityDiagram obj){} public void visit(ActivityState obj){} public void visit(Decision obj){} public void visit(SynchronizationState obj){} public void visit(SimpleObject obj){} */ /* public void visit(List obj){} public void visit(Value obj){} public void visit(Tuple obj){} public void visit(Location obj){} public void visit(Tag obj){} public void visit(StringLiteral obj){} public void visit(BooleanLiteral obj){} public void visit(FloatLiteral obj){} public void visit(IntegerLiteral obj){} */ @Override public void visit(PetalFile obj) { obj.getPetal().accept(this); obj.getDesign().accept(this); } @Override public void visit(StringLiteral obj) { } @Override public void visit(BooleanLiteral obj) { } @Override public void visit(FloatLiteral obj) { } @Override public void visit(IntegerLiteral obj) { } @Override public void visit(Tag ref) { } @Override public void visit(Location loc) { } @Override public void visit(List list) { java.util.List c = list.getElements(); if (c.size() > 0) { for (Iterator i = c.iterator(); i.hasNext();) { ((PetalNode) i.next()).accept(this); } } } @Override public void visit(Value value) { } @Override public void visit(Tuple tuple) { } public static void main(String[] args) { PetalFile tree = PetalParser.parse(args); EOModelExtractor extractor = new EOModelExtractor(System.out); tree.accept(extractor); extractor.arrangeRelationship(); } }