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");
}
}
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.