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]
