Author: euluis
Date: 2008-02-26 16:30:49-0800
New Revision: 14160

Modified:
   trunk/src/app/src/org/argouml/profile/FileModelLoader.java
   trunk/src/app/src/org/argouml/profile/ResourceModelLoader.java
   trunk/src/app/src/org/argouml/profile/URLModelLoader.java
   trunk/src/app/src/org/argouml/profile/internal/ProfileManagerImpl.java
   trunk/src/app/tests/org/argouml/kernel/TestProjectWithProfiles.java
   trunk/src/app/tests/org/argouml/persistence/TestXmiFilePersister.java
   trunk/src/model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java
   trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java
   trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReferenceResolverImpl.java
   
trunk/src/model-mdr/tests/org/argouml/model/mdr/TestReadCompressedFilesAndHref.java

Log:
issue 4946: fixes the failing reopen of models that depend on profiles 
contained in a module; TODO: fix for user defined profiles

Modified: trunk/src/app/src/org/argouml/profile/FileModelLoader.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/app/src/org/argouml/profile/FileModelLoader.java?view=diff&rev=14160&p1=trunk/src/app/src/org/argouml/profile/FileModelLoader.java&p2=trunk/src/app/src/org/argouml/profile/FileModelLoader.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/app/src/org/argouml/profile/FileModelLoader.java  (original)
+++ trunk/src/app/src/org/argouml/profile/FileModelLoader.java  2008-02-26 
16:30:49-0800
@@ -26,6 +26,7 @@
 
 import java.io.File;
 import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.Collection;
 
 import org.apache.log4j.Logger;
@@ -44,7 +45,8 @@
         LOG.info("Loading profile from file'" + modelFilename + "'");
         try {
             File modelFile = new File(modelFilename);
-            return super.loadModel(modelFile.toURI().toURL());
+            URL url = modelFile.toURI().toURL();
+            return super.loadModel(url, url.toString());
         } catch (MalformedURLException e) {
             throw new ProfileException("Model file not found!");
         }

Modified: trunk/src/app/src/org/argouml/profile/ResourceModelLoader.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/app/src/org/argouml/profile/ResourceModelLoader.java?view=diff&rev=14160&p1=trunk/src/app/src/org/argouml/profile/ResourceModelLoader.java&p2=trunk/src/app/src/org/argouml/profile/ResourceModelLoader.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/app/src/org/argouml/profile/ResourceModelLoader.java      
(original)
+++ trunk/src/app/src/org/argouml/profile/ResourceModelLoader.java      
2008-02-26 16:30:49-0800
@@ -60,10 +60,12 @@
         clazz = c;
     }
 
-
+    /*
+     * @see org.argouml.profile.ProfileModelLoader#loadModel(java.lang.String)
+     */
     public Collection loadModel(String path) throws ProfileException {
         LOG.info("Loading profile from resource'" + path + "'");
-        return super.loadModel(clazz.getResource(path));
+        return super.loadModel(clazz.getResource(path), path);
     }
 
 }

Modified: trunk/src/app/src/org/argouml/profile/URLModelLoader.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/app/src/org/argouml/profile/URLModelLoader.java?view=diff&rev=14160&p1=trunk/src/app/src/org/argouml/profile/URLModelLoader.java&p2=trunk/src/app/src/org/argouml/profile/URLModelLoader.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/app/src/org/argouml/profile/URLModelLoader.java   (original)
+++ trunk/src/app/src/org/argouml/profile/URLModelLoader.java   2008-02-26 
16:30:49-0800
@@ -44,16 +44,21 @@
 
     /**
      * @param url the url/system id to load
+     * @param publicId the publicId for which the model will be known - must 
be 
+     *        equal in different machines in order to be possible to load the 
+     *        model
      * @return the model
      * @throws ProfileException if the XMIReader couldn't read the profile
      */
-    public Collection loadModel(URL url) throws ProfileException {
+    public Collection loadModel(URL url, String publicId) 
+        throws ProfileException {
         if (url == null) {
             throw new ProfileException("Null profile URL");
         }
         try {
             XmiReader xmiReader = Model.getXmiReader();
             InputSource inputSource = new InputSource(url.toExternalForm());
+            inputSource.setPublicId(publicId);
             Collection elements = xmiReader.parse(inputSource, true);
             return elements;
         } catch (UmlException e) {

Modified: trunk/src/app/src/org/argouml/profile/internal/ProfileManagerImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/app/src/org/argouml/profile/internal/ProfileManagerImpl.java?view=diff&rev=14160&p1=trunk/src/app/src/org/argouml/profile/internal/ProfileManagerImpl.java&p2=trunk/src/app/src/org/argouml/profile/internal/ProfileManagerImpl.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/app/src/org/argouml/profile/internal/ProfileManagerImpl.java      
(original)
+++ trunk/src/app/src/org/argouml/profile/internal/ProfileManagerImpl.java      
2008-02-26 16:30:49-0800
@@ -30,8 +30,11 @@
 import java.util.List;
 import java.util.StringTokenizer;
 
+import org.apache.log4j.Logger;
 import org.argouml.configuration.Configuration;
 import org.argouml.configuration.ConfigurationKey;
+import org.argouml.model.Model;
+import org.argouml.model.UmlException;
 import org.argouml.profile.Profile;
 import org.argouml.profile.ProfileException;
 import org.argouml.profile.ProfileManager;
@@ -43,6 +46,9 @@
  * @author Marcos Aurélio
  */
 public class ProfileManagerImpl implements ProfileManager {
+    
+    private static final Logger LOG = Logger.getLogger(
+            ProfileManagerImpl.class);
 
     private static final String DIRECTORY_SEPARATOR = "*";
 
@@ -229,6 +235,11 @@
         if (path != null && !searchDirectories.contains(path)) {
             searchDirectories.add(path);
             updateSearchDirectoriesConfiguration();
+            try {
+                Model.getXmiReader().addSearchPath(path);
+            } catch (UmlException e) {
+                LOG.error("Couldn't retrive XMI Reader from Model.", e);
+            }
         }
     }
 
@@ -242,6 +253,11 @@
         if (path != null) {
             searchDirectories.remove(path);
             updateSearchDirectoriesConfiguration();
+            try {
+                Model.getXmiReader().removeSearchPath(path);
+            } catch (UmlException e) {
+                LOG.error("Couldn't retrive XMI Reader from Model.", e);
+            }
         }
     }
 

Modified: trunk/src/app/tests/org/argouml/kernel/TestProjectWithProfiles.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/app/tests/org/argouml/kernel/TestProjectWithProfiles.java?view=diff&rev=14160&p1=trunk/src/app/tests/org/argouml/kernel/TestProjectWithProfiles.java&p2=trunk/src/app/tests/org/argouml/kernel/TestProjectWithProfiles.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/app/tests/org/argouml/kernel/TestProjectWithProfiles.java 
(original)
+++ trunk/src/app/tests/org/argouml/kernel/TestProjectWithProfiles.java 
2008-02-26 16:30:49-0800
@@ -228,6 +228,7 @@
             new UserDefinedProfile(userDefinedProfileFile);
         ProfileManager profileManager = ProfileFacade.getManager();
         profileManager.registerProfile(userDefinedProfile);
+        profileManager.addSearchPathDirectory(testCaseDir.getAbsolutePath());
         Project project = ProjectManager.getManager().makeEmptyProject();
         project.getProfileConfiguration().addProfile(userDefinedProfile);
         // create a dependency between the project's model and the user 
defined 

Modified: trunk/src/app/tests/org/argouml/persistence/TestXmiFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/app/tests/org/argouml/persistence/TestXmiFilePersister.java?view=diff&rev=14160&p1=trunk/src/app/tests/org/argouml/persistence/TestXmiFilePersister.java&p2=trunk/src/app/tests/org/argouml/persistence/TestXmiFilePersister.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/app/tests/org/argouml/persistence/TestXmiFilePersister.java       
(original)
+++ trunk/src/app/tests/org/argouml/persistence/TestXmiFilePersister.java       
2008-02-26 16:30:49-0800
@@ -55,8 +55,8 @@
      * @see junit.framework.TestCase#setUp()
      */
     public void setUp() throws Exception {
-       super.setUp();
-        InitializeModel.initializeDefault();
+        super.setUp();
+        InitializeModel.initializeMDR();
         new InitProfileSubsystem().init();
     }
 
@@ -68,12 +68,11 @@
      */
     public void testSave() throws Exception {
         Project p = ProjectManager.getManager().makeEmptyProject();
-        Object clazz = Model.getCoreFactory().buildClass(p.getModel());
-        Object returnType =
-            ProjectManager.getManager()
+        Object clazz = Model.getCoreFactory().buildClass(
+                Model.getModelManagementFactory().getRootModel());
+        Object returnType = ProjectManager.getManager()
                .getCurrentProject().getDefaultReturnType();
-        Object oper =
-            Model.getCoreFactory().buildOperation(clazz, returnType);
+        Object oper = Model.getCoreFactory().buildOperation(clazz, returnType);
         Model.getCoreHelper().setType(
                 Model.getFacade().getParameter(oper, 0),
                 p.findType("String"));
@@ -100,7 +99,7 @@
      */
     public void testCreateSaveAndLoadYieldsCorrectModel() throws Exception {
         Project project = ProjectManager.getManager().makeEmptyProject();
-        Object model = project.getModel();
+        Object model = Model.getModelManagementFactory().getRootModel();
         assertNotNull(model);
         Object classifier = Model.getCoreFactory().buildClass("Foo", model);
         assertNotNull(project.findType("Foo", false));
@@ -109,11 +108,12 @@
         // This depends on the default profile configuration containing the
         // type Integer to test properly.  Otherwise it will get created in
         // the main project, defeating the purpose
-        Object intType = project.findType("Integer");
+        Object intType = project.findType("Integer", false);
+        assertNotNull(intType);
         Object attribute = 
             Model.getCoreFactory().buildAttribute2(classifier, intType);
         Model.getCoreHelper().setName(attribute, "profileTypedAttribute");
-        File file = File.createTempFile("ArgoTestCreateSaveAndLoad", "xmi");
+        File file = File.createTempFile("ArgoTestCreateSaveAndLoad", ".xmi");
         XmiFilePersister persister = new XmiFilePersister();
         project.preSave();
         persister.save(project, file);

Modified: 
trunk/src/model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java?view=diff&rev=14160&p1=trunk/src/model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java&p2=trunk/src/model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java   
(original)
+++ trunk/src/model-mdr/src/org/argouml/model/mdr/MDRModelImplementation.java   
2008-02-26 16:30:49-0800
@@ -31,8 +31,10 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
 import javax.jmi.model.ModelPackage;
 import javax.jmi.model.MofPackage;
@@ -178,6 +180,13 @@
      */
     private Map<String, XmiReference> objectToId = 
         Collections.synchronizedMap(new HashMap<String, XmiReference>());
+    
+    /**
+     * Set of known public IDs of models that could be used to resolve URLs 
+     * from model element IDs.
+     */
+    private Set<String> publicIds = 
+        Collections.synchronizedSet(new HashSet<String>());
 
     /**
      * @return Returns the root UML Factory package for user model.
@@ -659,6 +668,10 @@
     protected Map<String, XmiReference> getObjectToId() {
         return objectToId;
     }
+    
+    Set<String> getPublicIds() {
+        return publicIds;
+    }
 
     public CommandStack getCommandStack() {
         return new DefaultCommandStack();

Modified: trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java?view=diff&rev=14160&p1=trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java&p2=trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java    
(original)
+++ trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReaderImpl.java    
2008-02-26 16:30:49-0800
@@ -143,7 +143,9 @@
             config.setUnknownElementsIgnored(true);
 
             resolver = new XmiReferenceResolverImpl(new RefPackage[] {extent},
-                    config, modelImpl.getObjectToId(), searchDirs, profile);
+                    config, modelImpl.getObjectToId(), 
+                    modelImpl.getPublicIds(), searchDirs, profile, 
+                    inputSource.getPublicId());
             config.setReferenceResolver(resolver);
             
             XMIReader xmiReader =

Modified: 
trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReferenceResolverImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReferenceResolverImpl.java?view=diff&rev=14160&p1=trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReferenceResolverImpl.java&p2=trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReferenceResolverImpl.java&r1=14159&r2=14160
==============================================================================
--- trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReferenceResolverImpl.java 
(original)
+++ trunk/src/model-mdr/src/org/argouml/model/mdr/XmiReferenceResolverImpl.java 
2008-02-26 16:30:49-0800
@@ -36,6 +36,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.jmi.reflect.RefObject;
 import javax.jmi.reflect.RefPackage;
@@ -79,19 +80,9 @@
         "/org/argouml/profile/profiles/";
     private static final String PROFILE_BASE_URL = 
         "http://argouml.org/profiles/uml14";;
-    private static final String PROFILE_FILE = "default-uml14.xmi";
-    private static final String PROFILE_URL = 
-        PROFILE_BASE_URL + PROFILE_FILE;
     
     private Map<String, Object> idToObjects = 
         Collections.synchronizedMap(new HashMap<String, Object>());
-    
-    /**
-     * Map of basic profile filename to the full URL that can be used to find
-     * it.
-     */
-    private Map<String, URL> profileFileMap =
-            Collections.synchronizedMap(new HashMap<String, URL>());
 
     /**
      * Map indexed by MOF ID.
@@ -114,7 +105,7 @@
      * Copied from AndroMDA 3.1 by Ludo (rastaman).
      * see org.andromda.repositories.mdr.MDRXmiReferenceResolverContext
      */
-    private static List<String> modulesPath = new ArrayList<String>();
+    private List<String> modulesPath = new ArrayList<String>();
 
     /**
      * Module to URL map to cache things we've already found.
@@ -132,6 +123,10 @@
     private Map<String, String> reverseUrlMap = new HashMap<String, String>();
     
     private boolean profile;
+
+    private Set<String> modelsPublicIds;
+
+    private String modelPublicId;
     
     /**
      * Constructor.
@@ -139,12 +134,15 @@
      * (see also {link org.netbeans.api.xmi.XMIReferenceResolver})
      */
     XmiReferenceResolverImpl(RefPackage[] extents, XMIInputConfig config,
-            Map<String, XmiReference> objectToIdMap, List<String> searchDirs,
-            boolean isProfile) {
+            Map<String, XmiReference> objectToIdMap, Set<String> publicIds, 
+            List<String> searchDirs, boolean isProfile, String publicId) {
         super(extents, config);
         objectsToId = objectToIdMap;
         modulesPath = searchDirs;
         profile = isProfile;
+        modelsPublicIds = publicIds;
+        modelPublicId = publicId;
+        if (isProfile) modelsPublicIds.add(publicId);
     }
 
     /**
@@ -181,7 +179,12 @@
         }
 
         if (profile) {
-            systemId = PROFILE_BASE_URL + getSuffix(systemId);
+            if (systemId.contains(PROFILE_RESOURCE_PATH))
+                systemId = PROFILE_BASE_URL + getSuffix(systemId);
+            else if (systemId.contains("file:/")) {
+                // user defined profile - systemId is OK
+            } else 
+                systemId = PROFILE_BASE_URL + modelPublicId;
         } else if (systemId == topSystemId) {
             systemId = null;
         } else if (reverseUrlMap.get(systemId) != null) {
@@ -248,36 +251,6 @@
     /////////////////////////////////////////////////////
 
     /**
-     * Return the module search paths as a String array.
-     * @return String[] An array with all the module search paths
-     */
-    public static String[] getModuleSearchPath() {
-        return modulesPath.toArray(new String[modulesPath.size()]);
-    }
-    
-    /**
-     * Add a path to module search path. Can be used by modules to register new
-     * paths to metamodels facades / profiles.
-     * 
-     * @param path
-     *            The path to add to the module search paths
-     */
-    public static void addModuleSearchPath(String path) {
-        if (!modulesPath.contains(path)) {
-            modulesPath.add(path);
-        }
-    }
-    
-    /**
-     * Remove a path from the list of modules search paths.
-     * 
-     * @param path The path to remove
-     */
-    public static void removeModuleSearchPath(String path) {
-        modulesPath.remove(path);
-    }
-
-    /**
      * Convert a System ID from an HREF (typically filespec-like) to a URL.
      * Copied from AndroMDA 3.1 by Ludo (rastaman)
      * see @link org.andromda.repositories.mdr.MDRXmiReferenceResolverContext
@@ -361,18 +334,15 @@
      *         found)
      */
     private String findModuleURL(String moduleName) {
-        
-        String[] moduleSearchPath = getModuleSearchPath();
-        
-        if (moduleSearchPath == null || moduleSearchPath.length == 0) {
+        if (modulesPath == null) {
             return null;
         }
 
         if (LOG.isDebugEnabled()) {
-            LOG.debug("findModuleURL: moduleSearchPath.length="
-                    + moduleSearchPath.length);
+            LOG.debug("findModuleURL: modulesPath.size() = " 
+                    + modulesPath.size());
         }
-        for (String moduleDirectory : moduleSearchPath) {
+        for (String moduleDirectory : modulesPath) {
             File candidate = new File(moduleDirectory, moduleName);
             if (LOG.isDebugEnabled())
                 LOG.debug("candidate '" + candidate.toString() + "' exists="
@@ -436,9 +406,12 @@
         final String dot = ".";
         String modelName = systemId;
         if (systemId.startsWith(PROFILE_BASE_URL)) {
-            modelName = PROFILE_RESOURCE_PATH
-                    + systemId.substring(PROFILE_BASE_URL.length());
-            // TODO: Look for profiles in user specified directory as well
+            String publicId = systemId.substring(PROFILE_BASE_URL.length());
+            if (modelsPublicIds.contains(publicId)) {
+                modelName = publicId;
+            } else { 
+                modelName = PROFILE_RESOURCE_PATH + publicId;
+            }
         } else {
             int filenameIndex = systemId.lastIndexOf("/");
             if (filenameIndex > 0) {
@@ -463,7 +436,8 @@
         if (modelUrl == null) {
             modelUrl = this.getClass().getResource(modelName);
         }
-        // TODO: Is this adequate for finding profiles in Java WebStart jars? 
- tfm
+        // TODO: Is this adequate for finding profiles in Java WebStart jars? 
+        //       - tfm
         if (modelUrl == null) {
             if (CLASSPATH_MODEL_SUFFIXES != null
                     && CLASSPATH_MODEL_SUFFIXES.length > 0) {

Modified: 
trunk/src/model-mdr/tests/org/argouml/model/mdr/TestReadCompressedFilesAndHref.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/model-mdr/tests/org/argouml/model/mdr/TestReadCompressedFilesAndHref.java?view=diff&rev=14160&p1=trunk/src/model-mdr/tests/org/argouml/model/mdr/TestReadCompressedFilesAndHref.java&p2=trunk/src/model-mdr/tests/org/argouml/model/mdr/TestReadCompressedFilesAndHref.java&r1=14159&r2=14160
==============================================================================
--- 
trunk/src/model-mdr/tests/org/argouml/model/mdr/TestReadCompressedFilesAndHref.java
 (original)
+++ 
trunk/src/model-mdr/tests/org/argouml/model/mdr/TestReadCompressedFilesAndHref.java
 2008-02-26 16:30:49-0800
@@ -31,6 +31,7 @@
 
 import org.apache.log4j.Logger;
 import org.xml.sax.InputSource;
+
 /**
  * Test read models. 
  * TODO: Move this test into argouml base when we will want to read also zip 
@@ -55,14 +56,10 @@
         File mdaIsHere = new File (ANDROMDA_HOME);
         if (mdaIsHere.exists()) {
             LOG.info("Begin testReadCompressedFileAndHref()");        
-            //Remove the dependency to argouml base for the moment
-            // org.argouml.persistence.ProjectFilePersister persister =
-            //     org.argouml.persistence.PersistenceManager
-            //         .getInstance().getPersisterFromFileName(testModel);
             XmiReaderImpl reader = new XmiReaderImpl(modelImplementation,
                     (RefPackage) modelImplementation.getMofPackage());
+            reader.addSearchPath(ANDROMDA_HOME + "/andromda/xml.zips");
             try {
-                //persister.doLoad(new File(testModel));
                 reader.parse(
                         new InputSource(new FileInputStream(testModel)), 
false);
             } catch (Exception e) {
@@ -78,7 +75,5 @@
      */
     protected void setUp() throws Exception {
         super.setUp();
-        XmiReferenceResolverImpl.addModuleSearchPath(ANDROMDA_HOME
-                + "/andromda/xml.zips");
     }
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to