Author: tfmorris
Date: 2008-04-29 15:53:13-0700
New Revision: 14522

Modified:
   
trunk/src/argouml-app/src/org/argouml/persistence/ProfileConfigurationFilePersister.java

Log:
Issue 4946 - throw an exception if profile can't be resolved. Also includes 
Luis' patch (unused) to create a UserDefinedProfile from the XMI in the current 
project.

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/ProfileConfigurationFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/ProfileConfigurationFilePersister.java?view=diff&rev=14522&p1=trunk/src/argouml-app/src/org/argouml/persistence/ProfileConfigurationFilePersister.java&p2=trunk/src/argouml-app/src/org/argouml/persistence/ProfileConfigurationFilePersister.java&r1=14521&r2=14522
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/persistence/ProfileConfigurationFilePersister.java
    (original)
+++ 
trunk/src/argouml-app/src/org/argouml/persistence/ProfileConfigurationFilePersister.java
    2008-04-29 15:53:13-0700
@@ -25,20 +25,24 @@
 package org.argouml.persistence;

 

 import java.io.BufferedReader;

+import java.io.File;

+import java.io.FileWriter;

 import java.io.IOException;

 import java.io.InputStream;

 import java.io.InputStreamReader;

 import java.io.OutputStream;

 import java.io.PrintWriter;

-import java.io.StringReader;

 import java.io.StringWriter;

 import java.io.Writer;

 import java.net.URL;

 import java.util.ArrayList;

 import java.util.Collection;

 import java.util.Iterator;

+import java.util.List;

 

+import org.apache.log4j.Logger;

 import org.argouml.application.helpers.ApplicationVersion;

+import org.argouml.configuration.Configuration;

 import org.argouml.kernel.ProfileConfiguration;

 import org.argouml.kernel.Project;

 import org.argouml.kernel.ProjectMember;

@@ -47,6 +51,7 @@
 import org.argouml.model.XmiWriter;

 import org.argouml.profile.Profile;

 import org.argouml.profile.ProfileFacade;

+import org.argouml.profile.ProfileManager;

 import org.argouml.profile.UserDefinedProfile;

 

 /**

@@ -55,6 +60,9 @@
  * @author maurelio1234

  */

 public class ProfileConfigurationFilePersister extends MemberFilePersister {

+    

+    private static final Logger LOG = 

+        Logger.getLogger(ProfileConfigurationFilePersister.class);

 

     /*

      * @see org.argouml.persistence.MemberFilePersister#getMainTag()

@@ -105,24 +113,20 @@
                         }

                         xmi.append(line + "\n");

                     }

-                    for (Profile candidateProfile 

-                            : ProfileFacade.getManager().

-                                getRegisteredProfiles()) {

-                        if (candidateProfile instanceof UserDefinedProfile) {

-                            UserDefinedProfile userProfile = 

-                                (UserDefinedProfile) candidateProfile;

-                            if (userProfile.getDisplayName().equals(fileName)) 
{

-                                profile = userProfile;

-                                break;

-                            }

-                        }

-                    }

+                    ProfileManager profileManager = ProfileFacade.getManager();

+                    profile = getMatchingUserDefinedProfile(fileName, 

+                        profileManager);

                     if (profile == null) {

-                        // Use xmi as a fall back alternative when the 

-                        // file for the user defined profile isn't found by 
the 

+                        throw new XmiReferenceException("Profile: " + fileName,

+                                null);

+                        // Use xmi as a fall back alternative when the

+                        // file for the user defined profile isn't found by the

                         // profile manager.

-                        profile = new UserDefinedProfile(fileName, 

-                                new StringReader(xmi.toString()));

+//                        profile = new UserDefinedProfile(fileName,

+//                                new StringReader(xmi.toString()));

+//                        profile = createUserProfileDefinition(fileName, xmi,

+//                                profileManager);

+

                     }

                     

                     // consumes the </userDefined>

@@ -142,11 +146,82 @@
                     profiles);

             project.setProfileConfiguration(pc);

         } catch (Exception e) {

-            // LOG.error("Exception", e);

+            if (e instanceof OpenException) {

+                throw (OpenException) e;

+            }

             throw new OpenException(e);

         }

     }

 

+    /**

+     * Create a user defined profile from the current project using the backup

+     * XMI file from the current project.  Currently unused.

+     * <p>

+     * <em>NOTE:</em> This has the side effect of permanently registering the

+     * profile which may not be what the user wants.

+     * 

+     * @param fileName name of original XMI file that the author of the project

+     *                used when creating the UserDefinedProfile.

+     * @param contents the contents of the XMI file.

+     * @return the new profile

+     * @throws IOException on any i/o error

+     */

+    private Profile createUserProfileDefinition(String fileName,

+            StringBuffer contents, ProfileManager profileManager)

+        throws IOException {

+

+

+        Profile profile;

+        File profilesDirectory = getProfilesDirectory(profileManager);

+        File profileFile = new File(profilesDirectory, fileName);

+        FileWriter writer = new FileWriter(profileFile);

+        writer.write(contents.toString());

+        writer.close();

+        LOG.info("Wrote user defined profile \"" + profileFile

+                + "\", with size " + contents.length() + ".");

+        if (isSomeProfileDirectoryConfigured(profileManager))

+            profileManager.refreshRegisteredProfiles();

+        else

+            profileManager.addSearchPathDirectory(profilesDirectory

+                    .getAbsolutePath());

+        profile = getMatchingUserDefinedProfile(fileName, profileManager);

+        assert profile != null : "Profile should be found now.";

+        return profile;

+    }

+

+    private Profile getMatchingUserDefinedProfile(String fileName, 

+            ProfileManager profileManager) {

+        for (Profile candidateProfile 

+            : profileManager.getRegisteredProfiles()) {

+            if (candidateProfile instanceof UserDefinedProfile) {

+                UserDefinedProfile userProfile = 

+                    (UserDefinedProfile) candidateProfile;

+                if (userProfile.getDisplayName().equals(fileName)) {

+                    return userProfile;

+                }

+            }

+        }

+        return null;

+    }

+

+    private File getProfilesDirectory(ProfileManager profileManager) {

+        if (isSomeProfileDirectoryConfigured(profileManager)) {

+            List<String> directories = 

+                profileManager.getSearchPathDirectories();

+            return new File(directories.get(0));

+        } else {

+            File userSettingsFile = new File(

+                Configuration.getFactory().getConfigurationHandler().

+                    getDefaultPath());

+            return userSettingsFile.getParentFile();

+        }

+    }

+

+    private boolean isSomeProfileDirectoryConfigured(

+            ProfileManager profileManager) {

+        return profileManager.getSearchPathDirectories().size() > 0;

+    }

+

     /*

      * @see 
org.argouml.persistence.MemberFilePersister#save(org.argouml.kernel.ProjectMember,
 java.io.Writer, boolean)

      */


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

Reply via email to