Revision: 3594
Author: [email protected]
Date: Wed Jun  9 11:52:17 2010
Log: NEW - bug 2458: Create Critic Manager
http://trillian.sqlpower.ca/bugzilla/show_bug.cgi?id=2458

The CriticManager now handles doing the full criticizing instead of having the action store how the descendants of objects are traversed. The CriticManager uses a Criticizer to do the criticizing and the Criticizer has the current implementation of how to traverse the objects and decides which critics are given an object. In the future we may want to make different
Criticizers for different types of object graphs to traverse.
http://code.google.com/p/power-architect/source/detail?r=3594

Modified:
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismBucket.java
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticizer.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectFrame.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticPanel.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticismTableModel.java /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticizeAction.java

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Wed Jun 9 10:53:53 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Wed Jun 9 11:52:17 2010
@@ -115,12 +115,13 @@
         addChild(newGrouping, criticGroupings.size());
         newGrouping.addChild(critic, 0);
     }
-
+
     /**
- * Returns a list of critics to calculate criticisms of objects passed to
-     * them. These critics are immutable after they are created.
+ * Returns a list of criticisms calculated by critics in this manager based + * on the object passed to them. These criticisms are immutable after they
+     * are created.
      */
-    public List<Critic> createCritics() {
+    public List<Criticism> criticize(Object root) {
         List<Critic> critics = new ArrayList<Critic>();
         for (CriticGrouping grouping : criticGroupings) {
             if (!grouping.isEnabled()) continue;
@@ -129,7 +130,8 @@
                 critics.add(singleSettings);
             }
         }
-        return Collections.unmodifiableList(critics);
+        Criticizer criticizer = new Criticizer(critics);
+        return Collections.unmodifiableList(criticizer.criticize(root));
     }

     @Override
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismBucket.java Wed Jun 9 10:53:53 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismBucket.java Wed Jun 9 11:52:17 2010
@@ -24,10 +24,13 @@
 import java.util.List;

 /**
- * This bucket holds all of the current criticisms about the state of the system. - * The bucket of current criticisms is separate from the {...@link Criticizer} which - * creates them so the creation of the {...@link Criticism}s is easier to done on a
- * separate thread.
+ * This bucket holds all of the current criticisms about the state of the
+ * system. The bucket of current criticisms is separate from the
+ * {...@link Criticizer} which creates them so the creation of the
+ * {...@link Criticism}s is easier to done on a separate thread. Additionally, the + * criticism bucket can decide if criticisms being added should be appended to + * the existing list of criticisms, replace criticisms, or clear the list to
+ * start over.
  */
 public class CriticismBucket {

@@ -39,9 +42,8 @@

private final List<CriticismListener> listeners = new ArrayList<CriticismListener>();

-    public void updateCriticismsToMatch(Criticizer criticizer) {
+    public void updateCriticismsToMatch(List<Criticism> newCriticisms) {
         clearCriticisms();
-        List<Criticism> newCriticisms = criticizer.getCriticisms();
         criticisms.addAll(newCriticisms);
         int index = criticisms.size();
         for (Criticism newCriticism : newCriticisms) {
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticizer.java Wed Jun 9 10:53:53 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticizer.java Wed Jun 9 11:52:17 2010
@@ -23,46 +23,79 @@
 import java.util.Collections;
 import java.util.List;

+import ca.sqlpower.object.SPObject;
+import ca.sqlpower.sqlobject.SQLDatabase;
+import ca.sqlpower.sqlobject.SQLObjectException;
+import ca.sqlpower.sqlobject.SQLRelationship;
+import ca.sqlpower.sqlobject.SQLTable;
+import ca.sqlpower.sqlobject.SQLRelationship.SQLImportedKey;
+
 /**
* A Criticizer uses a collection of critics to analyze objects and come up with * criticisms based on the given objects. This object is immutable and can only
- * create a new set of criticisms.
+ * create a new set of criticisms. The criticizer is used to define how the
+ * object and its descendants will be traversed as well as which critics will be
+ * informed of objects to criticize.
+ * <p>
+ * Package private because classes outside of the critics do not need to know about
+ * the implementation.
  */
-public class Criticizer {
+class Criticizer {

     private final List<Critic> critics;

-    /**
- * The collection of criticisms of the objects last calculated by this criticizer.
-     */
-    private final List<Criticism> criticisms;
-
     public Criticizer(List<Critic> critics) {
this.critics = Collections.unmodifiableList(new ArrayList<Critic>(critics));
-        criticisms = new ArrayList<Criticism>();
     }

     /**
-     * Runs one object through the list of active critics.
+ * Runs an object through the list of active critics. This will also criticize all
+     * descendants if it is an {...@link SPObject}.
      */
-    public void criticize(Object subject) {
-        for (Critic critic : critics) {
-            List<Criticism> newCriticisms = critic.criticize(subject);
-            criticisms.addAll(newCriticisms);
- // TODO record the critic-subject combination so it can be wiped out later
-        }
+    public List<Criticism> criticize(Object subject) {
+        return recursivelyCriticize(subject);
     }

     /**
-     * Returns a linear view of the criticisms.
-     * <p>
-     * XXX decide what should dictate the order
      *
-     * @return an unmodifiable list of criticisms
+     * @param root
+     *            The SQLObject to criticize
+     * @param criticizer
+     *            The criticizer that will examine the subtree at root and
+     *            accumulate criticisms about it
+     * @throws SQLObjectException
+ * if the (sub)tree under root is not already populated, and an
+     *             attempt to populate it fails
      */
-    public List<Criticism> getCriticisms() {
+    @SuppressWarnings("unchecked")
+    private List<Criticism> recursivelyCriticize(Object root) {
+        List<Criticism> criticisms = new ArrayList<Criticism>();
+
+        // skip types that don't warrant criticism
+        if ( (!(root instanceof SQLDatabase)) &&
+             (!(root instanceof SQLRelationship.ColumnMapping)) ) {
+            for (Critic critic : critics) {
+                List<Criticism> newCriticisms = critic.criticize(root);
+                criticisms.addAll(newCriticisms);
+ // TODO record the critic-subject combination so it can be wiped out later
+            }
+        }
+
+        if (root instanceof SPObject) {
+ for (SPObject child : (List<SPObject>) ((SPObject) root).getChildren()) {
+                try {
+                    if (child instanceof SQLImportedKey
+ && ((SQLTable) root).getImportedKeys().contains(child)) { + // skip contents of every imported keys folder, or else we will visit every relationship twice
+                        continue;
+                    }
+                } catch (SQLObjectException e) {
+                    throw new RuntimeException(e);
+                }
+                recursivelyCriticize(child);
+            }
+        }
         return criticisms;
     }
-

 }
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectFrame.java Wed Jun 9 10:53:53 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectFrame.java Wed Jun 9 11:52:17 2010
@@ -70,7 +70,7 @@
 import ca.sqlpower.architect.ArchitectSession;
 import ca.sqlpower.architect.CoreUserSettings;
 import ca.sqlpower.architect.UserSettings;
-import ca.sqlpower.architect.ddl.critic.Criticizer;
+import ca.sqlpower.architect.ddl.critic.Criticism;
 import ca.sqlpower.architect.enterprise.ArchitectClientSideSession;
 import ca.sqlpower.architect.enterprise.ProjectLocation;
 import ca.sqlpower.architect.layout.ArchitectLayout;
@@ -1288,11 +1288,11 @@
     }

     /**
- * Updates the critic panel to use the criticisms in the given criticizer.
+     * Updates the critic panel to use the criticisms.
      * Will also display the critic panel if it is not visible.
      */
-    public void updateCriticPanel(Criticizer criticizer) {
- criticPanel.getCriticismBucket().updateCriticismsToMatch(criticizer);
+    public void updateCriticPanel(List<Criticism> criticisms) {
+ criticPanel.getCriticismBucket().updateCriticismsToMatch(criticisms);
         criticPanel.getPanel().setVisible(true);
         final double screenHeight = splitPane.getHeight();
double viewHeight = Math.min(criticPanel.getPanel().getPreferredSize().getHeight(),
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticPanel.java Wed Jun 9 10:53:53 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticPanel.java Wed Jun 9 11:52:17 2010
@@ -96,8 +96,7 @@
         this.session = session;
         criticismBucket = new CriticismBucket();

- CriticismTableModel tableModel = new CriticismTableModel(session.getWorkspace(),
-                criticismBucket);
+ CriticismTableModel tableModel = new CriticismTableModel(criticismBucket); FancyExportableJTable table = new FancyExportableJTable(tableModel);
         table.setDefaultRenderer(Severity.class, tableRenderer);
         panel = new JPanel(new BorderLayout());
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticismTableModel.java Wed Jun 9 10:53:53 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticismTableModel.java Wed Jun 9 11:52:17 2010
@@ -26,7 +26,6 @@
 import ca.sqlpower.architect.ddl.critic.CriticismEvent;
 import ca.sqlpower.architect.ddl.critic.CriticismListener;
 import ca.sqlpower.architect.ddl.critic.CriticAndSettings.Severity;
-import ca.sqlpower.architect.swingui.ArchitectSwingProject;

 public class CriticismTableModel extends AbstractTableModel {

@@ -43,14 +42,7 @@
         }
     };

-    /**
- * The project that holds a critic manager to access critic settings. The
-     * settings will be used to display the criticisms.
-     */
-    private final ArchitectSwingProject project;
-
- public CriticismTableModel(ArchitectSwingProject project, CriticismBucket criticizer) {
-        this.project = project;
+    public CriticismTableModel(CriticismBucket criticizer) {
         this.criticizer = criticizer;
         criticizer.addCriticismListener(criticListener);
     }
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticizeAction.java Wed Jun 9 10:53:53 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticizeAction.java Wed Jun 9 11:52:17 2010
@@ -24,16 +24,10 @@

 import javax.swing.Icon;

-import ca.sqlpower.architect.ddl.critic.Criticizer;
+import ca.sqlpower.architect.ddl.critic.Criticism;
 import ca.sqlpower.architect.swingui.ArchitectSwingSession;
 import ca.sqlpower.architect.swingui.Messages;
 import ca.sqlpower.architect.swingui.action.AbstractArchitectAction;
-import ca.sqlpower.sqlobject.SQLDatabase;
-import ca.sqlpower.sqlobject.SQLObject;
-import ca.sqlpower.sqlobject.SQLObjectException;
-import ca.sqlpower.sqlobject.SQLRelationship;
-import ca.sqlpower.sqlobject.SQLTable;
-import ca.sqlpower.sqlobject.SQLRelationship.SQLImportedKey;
 import ca.sqlpower.swingui.SPSUtils;

 /**
@@ -57,43 +51,9 @@
      * Call to do a full critique of the given session's play pen.
      */
     public void criticize() {
-        Criticizer criticizer = new Criticizer(
-                session.getWorkspace().getCriticManager().createCritics());
-        try {
-            recursivelyCriticize(session.getTargetDatabase(), criticizer);
-        } catch (SQLObjectException ex) {
- throw new RuntimeException("Unexpected exception (because playpen is already populted)", ex);
-        }
-        session.getArchitectFrame().updateCriticPanel(criticizer);
+ List<Criticism> criticisms = session.getWorkspace().getCriticManager().criticize(
+                session.getTargetDatabase());
+        session.getArchitectFrame().updateCriticPanel(criticisms);
     }

-    /**
-     *
-     * @param root
-     *            The SQLObject to criticize
-     * @param criticizer
-     *            The criticizer that will examine the subtree at root and
-     *            accumulate criticisms about it
-     * @throws SQLObjectException
- * if the (sub)tree under root is not already populated, and an
-     *             attempt to populate it fails
-     */
-    @SuppressWarnings("unchecked")
- private void recursivelyCriticize(SQLObject root, Criticizer criticizer) throws SQLObjectException {
-
-        // skip types that don't warrant criticism
-        if ( (!(root instanceof SQLDatabase)) &&
-             (!(root instanceof SQLRelationship.ColumnMapping)) ) {
-            criticizer.criticize(root);
-        }
-
-        for (SQLObject child : (List<SQLObject>) root.getChildren()) {
-            if (child instanceof SQLImportedKey
- && ((SQLTable) root).getImportedKeys().contains(child)) { - // skip contents of every imported keys folder, or else we will visit every relationship twice
-                continue;
-            }
-            recursivelyCriticize(child, criticizer);
-        }
-    }
-}
+}

Reply via email to