svn commit: r13169 - trunk/src_new/org/argouml: kernel persistence uml

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: tfmorris
Date: 2007-07-27 15:26:33-0700
New Revision: 13169

Modified:
   trunk/src_new/org/argouml/kernel/Project.java
   trunk/src_new/org/argouml/kernel/ProjectImpl.java
   trunk/src_new/org/argouml/persistence/ModelMemberFilePersister.java
   trunk/src_new/org/argouml/persistence/XmiFilePersister.java
   trunk/src_new/org/argouml/persistence/ZipFilePersister.java
   trunk/src_new/org/argouml/uml/Profile.java
   trunk/src_new/org/argouml/uml/ProfileJava.java

Log:
Add support profiles & user models with:

 - multiple linked XMI files

 - multiple top level packages

Modified: trunk/src_new/org/argouml/kernel/Project.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/kernel/Project.java?view=diff&rev=13169&p1=trunk/src_new/org/argouml/kernel/Project.java&p2=trunk/src_new/org/argouml/kernel/Project.java&r1=13168&r2=13169
==============================================================================
--- trunk/src_new/org/argouml/kernel/Project.java	(original)
+++ trunk/src_new/org/argouml/kernel/Project.java	2007-07-27 15:26:33-0700
@@ -445,17 +445,34 @@
 
     /**
      * @param theDefaultModel a uml model
+     * @deprecated for 0.25.4 by tfmorris. Use 
+     *          {@link #setProfiles(Collection)}.
      */
+    @Deprecated
     public void setDefaultModel(Object theDefaultModel);
 
     /**
+     * @param packages a Collection of packages containing profiles.
+     */
+    public void setProfiles(Collection packages);
+
+    /**
      * Get the default model.
      *
      * @return A model.
+     * @deprecated for 0.25.4 by tfmorris. Use {@link #getProfiles()}.
      */
+    @Deprecated
     public Object getDefaultModel();
 
     /**
+     * Get the collection of profile packages.
+     *
+     * @return collection of Packages containing profiles.
+     */
+    public Object getProfiles();
+
+    /**
      * Find a type by name in the default model.
      *
      * @param name the name.
@@ -464,17 +481,42 @@
     public Object findTypeInDefaultModel(String name);
 
     /**
-     * Returns the root.
-     * @return MModel
+     * Returns the root package.
+     * 
+     * @return the Package which is the root
+     * @deprecated for 0.25.4 by tfmorris - use {@link #getRoots()} to
+     *             packages/model elements which are at the top level. TODO: We
+     *             probably need a getDefaultNamespace() method or something
+     *             similar to replace some uses of this.
      */
+    @Deprecated
     public Object getRoot();
 
     /**
-     * Sets the root.
-     * @param root The root to set, a uml model
+     * Sets the root package.
+     * @param root The root to set, a UML Package
+     * @deprecated for 0.25.4 by tfmorris - use {@link #setRoots}.
      */
+    @Deprecated
     public void setRoot(Object root);
 
+
+    /**
+     * Return a collection of top level Model Elements. Normally for ArgoUML
+     * created models, this will be a single Package or Model, but other tools
+     * may allow more liberal structures.
+     * 
+     * @return Collection of top level ModelElements
+     */
+    public Collection getRoots();
+
+    /**
+     * Set the top level ModelElements for this project.
+     * 
+     * @param elements Collection of top level ModelElements
+     */
+    public void setRoots(Collection elements);
+    
     /**
      * Returns true if the given name is a valid name for a diagram. Valid means
      * that it does not occur as a name for a diagram yet.

Modified: trunk/src_new/org/argouml/kernel/ProjectImpl.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/kernel/ProjectImpl.java?view=diff&rev=13169&p1=trunk/src_new/org/argouml/kernel/ProjectImpl.java&p2=trunk/src_new/org/argouml/kernel/ProjectImpl.java&r1=13168&r2=13169
==============================================================================
--- trunk/src_new/org/argouml/kernel/ProjectImpl.java	(original)
+++ trunk/src_new/org/argouml/kernel/ProjectImpl.java	2007-07-27 15:26:33-0700
@@ -58,6 +58,7 @@
 import org.argouml.uml.ProjectMemberModel;
 import org.argouml.uml.cognitive.ProjectMemberTodoList;
 import org.argouml.uml.diagram.ArgoDiagram;
+import org.argouml.uml.diagram.DiagramFactory;
 import org.argouml.uml.diagram.ProjectMemberDiagram;
 import org.tigris.gef.presentation.Fig;
 import org.tigris.gef.undo.Memento;
@@ -117,15 +118,20 @@
     private int persistenceVersion;
 
     /**
-     * Instances of the uml model.
+     * Instances of the UML model.
      */
     private final List models = new ArrayList();
+    
+    private Object root;
+    private Collection roots = new HashSet();
+    
 
     /**
-     * Instances of the uml diagrams.
+     * Instances of the UML diagrams.
      */
     private final List<ArgoDiagram> diagrams = new ArrayList<ArgoDiagram>();
-    private Object defaultModel;
+    
+    private Collection<Object> profilePackages = new HashSet<Object>();
     private Object currentNamespace;
     private Map<String, Object> uuidRefs;
     private transient VetoableChangeSupport vetoSupport;
@@ -180,7 +186,7 @@
             // load the default model
             // this is NOT the way how it should be since this makes argo
             // depend on Java even more.
-            setDefaultModel(profile.getProfileModel());
+            setProfiles(profile.getProfilePackages());
         } catch (ProfileException e) {
             // TODO: how are we going to handle exceptions here?
             // I think we need a ProjectException.
@@ -362,6 +368,7 @@
         // fire indeterminate change to avoid copying vector
         if (!models.contains(model)) {
             models.add(model);
+            roots.add(model);
         }
         setCurrentNamespace(model);
         setSaveEnabled(true);
@@ -377,16 +384,10 @@
             if (diagrams.size() == 1) {
                 // We're deleting the last diagram so lets create a new one
                 // TODO: Once we go MDI we won't need this.
-                Object treeRoot =
-                    Model.getModelManagementFactory().getRootModel();
-                // TODO: This is the center of a very large dependency cycle
-                // Just refuse to delete the last diagram for now - tfm
-                LOG.error("Can't delete last diagram in the project");
-                return;
-//                defaultDiagram =
-//                    DiagramFactory.getInstance().createDefaultDiagram(
-//                	    treeRoot);
-//                addMember(defaultDiagram);
+                defaultDiagram =
+                    DiagramFactory.getInstance().createDefaultDiagram(
+                            getRoot());
+                addMember(defaultDiagram);
             } else {
                 // Make the topmost diagram (that is not the one being deleted)
                 // current.
@@ -522,7 +523,7 @@
     public Collection getModels() {
         Set ret = new HashSet();
         ret.addAll(models);
-        ret.add(defaultModel);
+        ret.addAll(profilePackages);
         return ret;
     }
 
@@ -574,6 +575,7 @@
         }
         cls = findTypeInDefaultModel(s);
         // hey, now we should move it to the model the user is working in
+        // TODO: Remove this when we support linked profiles - tfm - 20070726
         if (cls != null) {
             cls =
                 Model.getModelManagementHelper()
@@ -612,29 +614,34 @@
         return figs;
     }
 
+    private Object findTypeInPackages(String name, Collection namespaces) {
+        for (Object namespace : namespaces) {
+            Object type = findTypeInModel(name, namespace);
+            if (type != null) {
+                return type;
+            }
+        }
+        return null;
+    }
 
-    public Object findTypeInModel(String s, Object ns) {
-
-        if (!Model.getFacade().isANamespace(ns)) {
+    public Object findTypeInModel(String typeName, Object namespace) {
+        if (typeName == null) {
+            throw new IllegalArgumentException("typeName must be non-null");
+        }
+        if (!Model.getFacade().isANamespace(namespace)) {
             throw new IllegalArgumentException(
-                    "Looking for the classifier " + s
-                    + " in a non-namespace object of " + ns
+                    "Looking for the classifier " + typeName
+                    + " in a non-namespace object of " + namespace
                     + ". A namespace was expected.");
     	}
 
         Collection allClassifiers =
             Model.getModelManagementHelper()
-	        .getAllModelElementsOfKind(ns,
+	        .getAllModelElementsOfKind(namespace,
 	                Model.getMetaTypes().getClassifier());
 
-        Object[] classifiers = allClassifiers.toArray();
-        Object classifier = null;
-
-        for (int i = 0; i < classifiers.length; i++) {
-
-            classifier = classifiers[i];
-            if (Model.getFacade().getName(classifier) != null
-            		&& Model.getFacade().getName(classifier).equals(s)) {
+        for (Object classifier : allClassifiers) {
+            if (typeName.equals(Model.getFacade().getName(classifier))) {
                 return classifier;
             }
         }
@@ -905,6 +912,7 @@
     }
 
 
+    @SuppressWarnings("deprecation")
     public void setDefaultModel(Object theDefaultModel) {
 
         if (!Model.getFacade().isAModel(theDefaultModel)) {
@@ -913,53 +921,109 @@
                     + theDefaultModel.getClass().getName());
         }
 
-        defaultModel = theDefaultModel;
+        profilePackages.clear();
+        profilePackages.add(theDefaultModel);
         defaultModelTypeCache = new HashMap<String, Object>();
     }
 
 
-    public Object getDefaultModel() {
-        return defaultModel;
+    public void setProfiles(Collection packages) {
+
+        for (Object pkg : packages) {
+            if (!Model.getFacade().isAPackage(pkg)) {
+                throw new IllegalArgumentException(
+                        "Profiles must be of type Package. Received a "
+                                + pkg.getClass().getName());
+            }
+        }
+
+        profilePackages.clear();
+        profilePackages.addAll(packages);
+        defaultModelTypeCache = new HashMap<String, Object>();
     }
 
+    @SuppressWarnings("deprecation")
+    public Object getDefaultModel() {
+        // First priority is Model for best backward compatibility
+        for (Object pkg : profilePackages) {
+            if (Model.getFacade().isAModel(pkg)) {
+                return pkg;
+            }
+        }
+        // then a Package
+        for (Object pkg : profilePackages) {
+            if (Model.getFacade().isAPackage(pkg)) {
+                return pkg;
+            }
+        }
+        // if all else fails, just the first element
+        return profilePackages.iterator().next();
+    }
+    
+    public Collection getProfiles() {
+        return profilePackages;
+    }
 
     public Object findTypeInDefaultModel(String name) {
         if (defaultModelTypeCache.containsKey(name)) {
             return defaultModelTypeCache.get(name);
         }
 
-        Object result = findTypeInModel(name, getDefaultModel());
+        Object result = findTypeInPackages(name, profilePackages);
         defaultModelTypeCache.put(name, result);
         return result;
     }
 
 
+    @SuppressWarnings("deprecation")
     public Object getRoot() {
-        return Model.getModelManagementFactory().getRootModel();
+        return root;
     }
 
 
-    public void setRoot(Object root) {
+    @SuppressWarnings("deprecation")
+    public void setRoot(Object theRoot) {
 
-        if (root == null) {
+        if (theRoot == null) {
             throw new IllegalArgumentException(
         	    "A root model element is required");
         }
-        if (!Model.getFacade().isAModel(root)) {
+        if (!Model.getFacade().isAModel(theRoot)) {
             throw new IllegalArgumentException(
         	    "The root model element must be a model - got "
-        	    + root.getClass().getName());
+        	    + theRoot.getClass().getName());
         }
 
         Object treeRoot = Model.getModelManagementFactory().getRootModel();
         if (treeRoot != null) {
             models.remove(treeRoot);
         }
-        Model.getModelManagementFactory().setRootModel(root);
-        addModel(root);
+        root = theRoot;
+        // TODO: We don't really want to do the following, but I'm not sure
+        // what depends on it - tfm - 20070725
+        Model.getModelManagementFactory().setRootModel(theRoot);
+        addModel(theRoot);
+    }
+
+    
+    public Collection getRoots() {
+        return roots;
     }
 
 
+    public void setRoots(Collection elements) {
+        for (Object element : elements) {
+            if (!Model.getFacade().isAPackage(element)) {
+                LOG.warn("Top level element other than package found - " 
+                        + Model.getFacade().getName(element));
+            }
+            if (Model.getFacade().isAModel(element)) {
+                addModel(element);
+            }
+        }
+        roots = elements;
+    }
+
     public boolean isValidDiagramName(String name) {
         boolean rv = true;
         for (ArgoDiagram diagram : diagrams) {
@@ -1020,18 +1084,21 @@
 
         members.clear();
 
-        for (Object model : models) {
-            LOG.debug("Deleting project model "
+        for (Object model : roots) {
+            LOG.debug("Deleting root element "
                     + Model.getFacade().getName(model));
             Model.getUmlFactory().delete(model);
         }
+        roots.clear();
         models.clear();
 
-        if (defaultModel != null) {
-            LOG.debug("Deleting profile model "
-                    + Model.getFacade().getName(defaultModel));
-            Model.getUmlFactory().delete(defaultModel);
-            defaultModel = null;
+        if (profilePackages != null) {
+            for (Object pkg : profilePackages) {
+                LOG.debug("Deleting profile element "
+                        + Model.getFacade().getName(pkg));
+                Model.getUmlFactory().delete(pkg);
+            }
+            profilePackages.clear();
         }
 
         diagrams.clear();
@@ -1054,7 +1121,7 @@
         version = null;
         searchpath = null;
         historyFile = null;
-        defaultModel = null;
+        profilePackages = null;
         currentNamespace = null;
         vetoSupport = null;
         activeDiagram = null;

Modified: trunk/src_new/org/argouml/persistence/ModelMemberFilePersister.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/persistence/ModelMemberFilePersister.java?view=diff&rev=13169&p1=trunk/src_new/org/argouml/persistence/ModelMemberFilePersister.java&p2=trunk/src_new/org/argouml/persistence/ModelMemberFilePersister.java&r1=13168&r2=13169
==============================================================================
--- trunk/src_new/org/argouml/persistence/ModelMemberFilePersister.java	(original)
+++ trunk/src_new/org/argouml/persistence/ModelMemberFilePersister.java	2007-07-27 15:26:33-0700
@@ -96,7 +96,7 @@
         // Created xmireader with method getErrors to check if parsing went well
         try {
             source.setEncoding(Argo.getEncoding());
-            readModels(project, source);
+            readModels(source);
             mmodel = getCurModel();
         } catch (OpenException e) {
             PersistenceManager.getInstance().setLastLoadStatus(false);
@@ -229,7 +229,6 @@
     }
     
     private Object curModel;
-    private Project proj;
     private HashMap uUIDRefs;
 
     private Collection elementsRead;
@@ -245,13 +244,6 @@
     }
 
     /**
-     * @param p the project
-     */
-    public void setProject(Project p) {
-        proj = p;
-    }
-
-    /**
      * Return XMI id to object map for the most recently read XMI file.
      * 
      * @return the UUID
@@ -271,7 +263,7 @@
      * @param xmiExtensionParser the XmiExtensionParser
      * @throws OpenException when there is an IO error
      */
-    public synchronized void readModels(Project p, URL url,
+    public synchronized void readModels(URL url,
             XmiExtensionParser xmiExtensionParser) throws OpenException {
         LOG.info("=======================================");
         LOG.info("== READING MODEL " + url);
@@ -283,7 +275,7 @@
                     url.openStream(), xmiExtensionParser, 100000, null));
             
             source.setSystemId(url.toString());
-            readModels(p, source);
+            readModels(source);
         } catch (IOException ex) {
             throw new OpenException(ex);
         }
@@ -295,11 +287,9 @@
      * @param source The InputSource
      * @throws OpenException If an error occur while reading the source
      */
-    public synchronized void readModels(Project p, InputSource source)
+    public synchronized void readModels(InputSource source)
         throws OpenException {
 
-        proj = p;
-
         XmiReader reader = null;
         try {
             reader = Model.getXmiReader();

Modified: trunk/src_new/org/argouml/persistence/XmiFilePersister.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/persistence/XmiFilePersister.java?view=diff&rev=13169&p1=trunk/src_new/org/argouml/persistence/XmiFilePersister.java&p2=trunk/src_new/org/argouml/persistence/XmiFilePersister.java&r1=13168&r2=13169
==============================================================================
--- trunk/src_new/org/argouml/persistence/XmiFilePersister.java	(original)
+++ trunk/src_new/org/argouml/persistence/XmiFilePersister.java	2007-07-27 15:26:33-0700
@@ -244,7 +244,7 @@
             ModelMemberFilePersister modelPersister =
                 new ModelMemberFilePersister();
             
-            modelPersister.readModels(p, source);
+            modelPersister.readModels(source);
             Object model = modelPersister.getCurModel();
             progressMgr.nextPhase();
             Model.getUmlHelper().addListenersToModel(model);
@@ -254,6 +254,7 @@
             modelPersister.registerDiagrams(p);
             
             p.setRoot(model);
+            p.setRoots(modelPersister.getElementsRead());
             File defaultProjectFile = new File(file.getPath() + ".zargo");
             // Make sure the file doesn't exist so the user will 
             // get prompted to choose a new name

Modified: trunk/src_new/org/argouml/persistence/ZipFilePersister.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/persistence/ZipFilePersister.java?view=diff&rev=13169&p1=trunk/src_new/org/argouml/persistence/ZipFilePersister.java&p2=trunk/src_new/org/argouml/persistence/ZipFilePersister.java&r1=13168&r2=13169
==============================================================================
--- trunk/src_new/org/argouml/persistence/ZipFilePersister.java	(original)
+++ trunk/src_new/org/argouml/persistence/ZipFilePersister.java	2007-07-27 15:26:33-0700
@@ -238,7 +238,7 @@
             ModelMemberFilePersister modelPersister =
                 new ModelMemberFilePersister();
             
-            modelPersister.readModels(p, is);
+            modelPersister.readModels(is);
             Object model = modelPersister.getCurModel();
             Model.getUmlHelper().addListenersToModel(model);
             p.setUUIDRefs(modelPersister.getUUIDRefs());
@@ -247,6 +247,7 @@
             modelPersister.registerDiagrams(p);
 
             p.setRoot(model);
+            p.setRoots(modelPersister.getElementsRead());
             ProjectManager.getManager().setSaveEnabled(false);
             return p;
         } catch (IOException e) {

Modified: trunk/src_new/org/argouml/uml/Profile.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/Profile.java?view=diff&rev=13169&p1=trunk/src_new/org/argouml/uml/Profile.java&p2=trunk/src_new/org/argouml/uml/Profile.java&r1=13168&r2=13169
==============================================================================
--- trunk/src_new/org/argouml/uml/Profile.java	(original)
+++ trunk/src_new/org/argouml/uml/Profile.java	2007-07-27 15:26:33-0700
@@ -25,6 +25,7 @@
 
 package org.argouml.uml;
 
+import java.util.Collection;
 import java.util.Iterator;
 /**
  *   This abstract class captures the configurable behavior of Argo.
@@ -54,8 +55,15 @@
     /**
      * @return the UML Model that contains the profile model
      * @throws ProfileException if failed to get profile.
+     * @deprecated for 0.25.4 by tfmorris.  Use {@link #getProfilePackages()}.
      */
     public abstract Object getProfileModel() throws ProfileException;
+
+    /**
+     * @return the UML Model that contains the profile model
+     * @throws ProfileException if failed to get profile.
+     */
+    public abstract Collection getProfilePackages() throws ProfileException;
     
     /**
      * Set the filename to load the profile model from.  This will be

Modified: trunk/src_new/org/argouml/uml/ProfileJava.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src_new/org/argouml/uml/ProfileJava.java?view=diff&rev=13169&p1=trunk/src_new/org/argouml/uml/ProfileJava.java&p2=trunk/src_new/org/argouml/uml/ProfileJava.java&r1=13168&r2=13169
==============================================================================
--- trunk/src_new/org/argouml/uml/ProfileJava.java	(original)
+++ trunk/src_new/org/argouml/uml/ProfileJava.java	2007-07-27 15:26:33-0700
@@ -31,6 +31,7 @@
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.zip.ZipEntry;
@@ -45,7 +46,7 @@
 import org.xml.sax.InputSource;
 
 /**
- * This class implements the abstract class Profile for use in modelling
+ * This class implements the abstract class Profile for use in modeling
  * Java language projects.  Eventually, this class may be replaced by
  * a configurable profile.
  *
@@ -57,7 +58,7 @@
  * the argo.user.properties file.
  * 
  * TODO: This is an i18n nightmare.  Tons of hardcoded strings and
- * string concatentation.  Change to use message formatting. - tfm 20060226
+ * string concatenation.  Change to use message formatting. - tfm 20060226
  *
  * @author Curt Arnold
  */
@@ -67,12 +68,14 @@
      */
     private static final Logger LOG = Logger.getLogger(ProfileJava.class);
 
-    private Object defaultModel;
+    private Object profileModel;
+    
+    private Collection profileElements;
     
     static final String DEFAULT_PROFILE = 
                             "/org/argouml/model/mdr/profiles/default-uml14.xmi";
     
-    private String defaultModelFilename;
+    private String profileFilename;
 
     /**
      * The constructor.
@@ -275,19 +278,30 @@
 	return value;
     }
 
-    /*
-     * @see org.argouml.uml.Profile#getProfileModel()
-     */
+
+    @SuppressWarnings("deprecation")
     public Object getProfileModel() throws ProfileException {
-        if (defaultModel == null) {
-            defaultModel = loadProfileModel();
+        if (profileModel == null) {
+            for (Object pkg : getProfilePackages()) {
+                if (Model.getFacade().isAPackage(pkg)) {
+                    profileModel = pkg;
+                    return profileModel;
+                }
+            }
+            profileModel = getProfilePackages().iterator().next();
+        }
+        return profileModel;
+    }
+
+
+    public Collection getProfilePackages() throws ProfileException {
+        if (profileElements == null) {
+            profileElements = loadProfileModel();
         }
-        return defaultModel;
+        return profileElements;
     }
     
-    /*
-     * @see org.argouml.uml.Profile#setProfileModelFilename(java.lang.String)
-     */
+
     public void setProfileModelFilename(String name) throws ProfileException {
         if (loadProfile(name) != null) {
             Configuration.setString(Argo.KEY_DEFAULT_MODEL, name);
@@ -296,18 +310,16 @@
         }
     }
     
-    /*
-     * @see org.argouml.uml.Profile#getProfileModelFilename()
-     */
+
     public String getProfileModelFilename() {
-        if (defaultModelFilename == null) {
+        if (profileFilename == null) {
             // TODO: Can we remove the use of this property
             // and just use the config file setting? - tfm 20060227
-            defaultModelFilename  = System.getProperty("argo.defaultModel",
+            profileFilename  = System.getProperty("argo.defaultModel",
                     Configuration.getString(Argo.KEY_DEFAULT_MODEL,
                             DEFAULT_PROFILE));            
         }
-        return defaultModelFilename;
+        return profileFilename;
     }
 
     /**
@@ -322,33 +334,34 @@
      * 
      * @return the profile model object or null
      */
-    public Object loadProfileModel() {
-        Object profileModel = null;
+    private Collection loadProfileModel() {
+        Collection elements = new ArrayList();
         String modelFilename = getProfileModelFilename();
 
         if (modelFilename != null) {
-            profileModel = loadProfile(modelFilename);
-            if (profileModel != null) {
-                return profileModel;
+            elements.addAll(loadProfile(modelFilename));
+            if (!elements.isEmpty()) {
+                return elements;
             }
         }
 
         if (!(DEFAULT_PROFILE.equals(modelFilename))) {
             LOG.warn("Falling back to default profile '" 
                     + DEFAULT_PROFILE + "'");
-            profileModel = loadProfile(DEFAULT_PROFILE);
-            if (profileModel != null) {
-                defaultModelFilename = DEFAULT_PROFILE;
-                return profileModel;
+            elements.addAll(loadProfile(DEFAULT_PROFILE));
+            if (!elements.isEmpty()) {
+                profileFilename = DEFAULT_PROFILE;
+                return elements;
             }
         }
 
         LOG.error("Failed to load any profile - returning empty model");
-        defaultModelFilename = "";
-        return Model.getModelManagementFactory().createModel();
+        profileFilename = "";
+        elements.add(Model.getModelManagementFactory().createModel());
+        return elements;
     }
     
-    private Object loadProfile(String modelFilename) {
+    private Collection loadProfile(String modelFilename) {
         LOG.info("Loading profile '" + modelFilename + "'");
         InputStream is = null;
         //
@@ -402,14 +415,7 @@
                 XmiReader xmiReader = Model.getXmiReader();
                 InputSource inputSource = new InputSource(is);
                 LOG.info("Loaded profile '" + modelFilename + "'");
-                Collection elements = xmiReader.parse(inputSource, true);
-                if (elements.size() != 1) {
-                    LOG.error("Error loading profile '" + modelFilename
-                            + "' expected 1 top level element" + " found "
-                            + elements.size());
-                    return null;
-                }
-                return elements.iterator().next();
+                return xmiReader.parse(inputSource, true);
             } catch (UmlException e) {
                 LOG.error("Exception while loading profile '" 
                         + modelFilename + "'", e);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.