Revision: 3655
Author: [email protected]
Date: Tue Jun 29 09:19:15 2010
Log: NEW - bug 2458: Create Critic Manager
http://trillian.sqlpower.ca/bugzilla/show_bug.cgi?id=2458

The critic settings are now being saved and loaded to a local file.

To make initializing the critic settings simpler the session always creates a default set of critics for the session and it is up to the loading code to decide what default critics to replace or remove in order to load its set of critics correctly. Currently the default is to clear all of the critics.
http://code.google.com/p/power-architect/source/detail?r=3655

Modified:
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticGrouping.java
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java
/trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectSessionPersister.java /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java /trunk/src/main/java/ca/sqlpower/architect/swingui/SwingUIProjectLoader.java

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticGrouping.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticGrouping.java Tue Jun 29 09:19:15 2010
@@ -150,4 +150,17 @@
     public List<CriticAndSettings> getSettings() {
         return Collections.unmodifiableList(settings);
     }
-}
+
+    @Override
+    public CriticManager getParent() {
+        return (CriticManager) super.getParent();
+    }
+
+    @Override
+    public void setParent(SPObject parent) {
+        if (!(parent instanceof CriticManager)) {
+ throw new IllegalArgumentException("Critic groups must be a child of a critic manager.");
+        }
+        super.setParent(parent);
+    }
+}
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Mon Jun 28 12:59:51 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Tue Jun 29 09:19:15 2010
@@ -231,4 +231,20 @@
     public List<CriticGrouping> getCriticGroupings() {
         return Collections.unmodifiableList(criticGroupings);
     }
-}
+
+    /**
+     * Clears all registered critics and their groups from the manager.
+     */
+    public void clear() {
+        try {
+            begin("Clearing manager");
+            for (int i = criticGroupings.size() - 1; i >= 0; i--) {
+                removeChild(criticGroupings.get(i));
+            }
+            commit();
+        } catch (Throwable t) {
+            rollback(t.getMessage());
+            throw new RuntimeException(t);
+        }
+    }
+}
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectSessionPersister.java Tue Jun 8 13:39:34 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectSessionPersister.java Tue Jun 29 09:19:15 2010
@@ -92,6 +92,8 @@
         architectProject.getCriticManager().setUUID(criticManagerUUID);
         criticManager.setLoaded(true);

+        architectProject.getCriticManager().clear();
+
List<PersistedSPObject> databases = new ArrayList<PersistedSPObject>();
         for (PersistedSPObject o : persistedObjects) {
if (o.getParentUUID().equals(architectProject.getRootObject().getUUID()) &&
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java Tue Jun 8 13:39:34 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java Tue Jun 29 09:19:15 2010
@@ -235,9 +235,6 @@
ArchitectSwingSessionImpl(final ArchitectSwingSessionContext context, String name)
     throws SQLObjectException {
this(context, new ArchitectSessionImpl(context, name, new ArchitectSwingProject())); - //XXX Unsure if this is the appropriate place for this method call. Likely to change
-        //before committing.
-        getWorkspace().getCriticManager().registerStartingCritics();
     }

     /**
@@ -362,7 +359,9 @@
                 }
             }
         });
- getWorkspace().getProjectSettings().addSPListener(settingsListener); + getWorkspace().getProjectSettings().addSPListener(settingsListener);
+
+        getWorkspace().getCriticManager().registerStartingCritics();
     }

     public void initGUI() throws SQLObjectException {
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/SwingUIProjectLoader.java Mon Jun 28 12:01:29 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/SwingUIProjectLoader.java Tue Jun 29 09:19:15 2010
@@ -41,6 +41,7 @@

 import org.apache.commons.digester.AbstractObjectCreationFactory;
 import org.apache.commons.digester.Digester;
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -50,6 +51,10 @@
 import ca.sqlpower.architect.UnclosableInputStream;
 import ca.sqlpower.architect.ProjectSettings.ColumnVisibility;
 import ca.sqlpower.architect.ddl.DDLGenerator;
+import ca.sqlpower.architect.ddl.critic.CriticAndSettings;
+import ca.sqlpower.architect.ddl.critic.CriticGrouping;
+import ca.sqlpower.architect.ddl.critic.CriticManager;
+import ca.sqlpower.architect.ddl.critic.CriticAndSettings.Severity;
 import ca.sqlpower.architect.olap.MondrianXMLReader;
 import ca.sqlpower.architect.olap.MondrianXMLWriter;
 import ca.sqlpower.architect.olap.OLAPObject;
@@ -91,7 +96,6 @@
 import ca.sqlpower.util.UserPrompter.UserPromptResponse;
 import ca.sqlpower.util.UserPrompterFactory.UserPromptType;
 import ca.sqlpower.xml.XMLHelper;
-import org.apache.commons.lang.StringUtils;

 /**
  * The SwingUIProject class is responsible for saving and loading projects.
@@ -259,7 +263,18 @@
CreateKettleJobSettingsFactory ckjsFactory = new CreateKettleJobSettingsFactory(); d.addFactoryCreate("architect-project/create-kettle-job-settings", ckjsFactory); //$NON-NLS-1$ d.addSetProperties("architect-project/create-kettle-job-settings"); //$NON-NLS-1$
-
+
+ CriticManagerFactory criticManagerFactory = new CriticManagerFactory(); + d.addFactoryCreate("architect-project/critic-manager", criticManagerFactory);
+        d.addSetProperties("architect-project/critic-manager");
+
+ CriticGroupingFactory criticGroupingFactory = new CriticGroupingFactory(); + d.addFactoryCreate("architect-project/critic-manager/critic-grouping", criticGroupingFactory); + d.addSetProperties("architect-project/critic-manager/critic-grouping");
+
+ CriticSettingsFactory criticSettingsFactory = new CriticSettingsFactory(); + d.addFactoryCreate("architect-project/critic-manager/critic-grouping/critic-settings", criticSettingsFactory);
+
         // olap factories

OLAPEditSessionFactory editSessionFactory = new OLAPEditSessionFactory();
@@ -640,6 +655,63 @@
         public Object createObject(Attributes arg0) throws Exception {
             return getSession().getPrintSettings();
         }
+
+    }
+
+ private class CriticGroupingFactory extends AbstractObjectCreationFactory {
+        @Override
+        public Object createObject(Attributes attr) throws Exception {
+            Object topItem = getDigester().peek();
+            if (!(topItem instanceof CriticManager)) {
+ logger.error("Expected parent CriticManager object on top of stack but found: " + topItem); //$NON-NLS-1$ + throw new IllegalStateException("Ancestor CriticManager object not found!"); //$NON-NLS-1$
+            }
+            CriticManager criticManager = (CriticManager) topItem;
+            String platformType = attr.getValue("platformType");
+            CriticGrouping group = new CriticGrouping(platformType);
+
+ criticManager.addChild(group, criticManager.getChildren(CriticGrouping.class).size());
+
+            return group;
+        }
+
+    }
+
+ private class CriticManagerFactory extends AbstractObjectCreationFactory {
+        @Override
+        public Object createObject(Attributes attr) throws Exception {
+            Object topItem = getDigester().peek();
+            if (!(topItem instanceof ArchitectSwingSessionImpl)) {
+ logger.error("Expected parent ArchitectSwingSessionImpl object on top of stack but found: " + topItem); //$NON-NLS-1$ + throw new IllegalStateException("Ancestor ArchitectSwingSessionImpl object not found!"); //$NON-NLS-1$
+            }
+ ArchitectSwingSessionImpl session = (ArchitectSwingSessionImpl) topItem;
+
+            session.getWorkspace().getCriticManager().clear();
+            return session.getWorkspace().getCriticManager();
+        }
+    }
+
+ private class CriticSettingsFactory extends AbstractObjectCreationFactory {
+        @Override
+        public Object createObject(Attributes attr) throws Exception {
+            Object topItem = getDigester().peek();
+            if (!(topItem instanceof CriticGrouping)) {
+ logger.error("Expected parent CriticGrouping object on top of stack but found: " + topItem); //$NON-NLS-1$ + throw new IllegalStateException("Ancestor CriticGrouping object not found!"); //$NON-NLS-1$
+            }
+            CriticGrouping group = (CriticGrouping) topItem;
+
+            String criticClassName = attr.getValue("class");
+ Class<?> criticClass = getClass().getClassLoader().loadClass(criticClassName); + CriticAndSettings criticSettings = (CriticAndSettings) criticClass.getConstructor().newInstance();
+
+            String severity = attr.getValue("severity");
+            criticSettings.setSeverity(Severity.valueOf(severity));
+
+            group.getParent().registerCritic(criticSettings);
+            return criticSettings;
+        }

     }

@@ -778,6 +850,7 @@
             saveCompareDMSettings(out);
             saveCreateKettleJobSettings(out);
             savePlayPen(out, getSession().getPlayPen(), true);
+            saveCriticSettings(out);
             saveProfiles(out);

             saveOLAP(out);
@@ -956,6 +1029,32 @@
         ioo.indent--;
         ioo.println(out, "</compare-dm-settings>"); //$NON-NLS-1$
     }
+
+    /**
+     * Writes the current critic settings for this project.
+     */
+    private void saveCriticSettings(PrintWriter out) throws IOException {
+ CriticManager criticManager = getSession().getWorkspace().getCriticManager();
+        ioo.println(out, "<critic-manager>");
+        ioo.indent++;
+        for (CriticGrouping group : criticManager.getCriticGroupings()) {
+            ioo.print(out, "<critic-grouping");
+ ioo.print(out, "platformType=\"" + group.getPlatformType() + "\""); + ioo.print(out, "enabled=\"" + Boolean.toString(group.isEnabled()) + "\"");
+            ioo.println(out, ">");
+            ioo.indent++;
+            for (CriticAndSettings settings : group.getSettings()) {
+                ioo.print(out, "<critic-settings");
+ ioo.print(out, "class=\"" + settings.getClass().getName() + "\""); + ioo.print(out, "severity=\"" + settings.getSeverity().name() + "\"");
+                ioo.println(out, "/>");
+            }
+            ioo.indent--;
+            ioo.println(out, "</critic-grouping>");
+        }
+        ioo.indent--;
+        ioo.println(out, "</critic-manager>");
+    }

private void saveLiquibaseSettings(PrintWriter out, LiquibaseSettings settings) {
                if (settings == null) return;

Reply via email to