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

Removed the type value from the critic, criticizer, and criticism classes as generics will not work for the desired behaviour. In the future we may want to add a method that returns the object types the critic is interested in.
http://code.google.com/p/power-architect/source/detail?r=3593

Modified:
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Critic.java
/trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticAndSettings.java
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticism.java
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismBucket.java
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismEvent.java
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticizer.java
/trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/CommentCritic.java /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/PhysicalNameCritic.java /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/PrimaryKeyCritic.java /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/RelationshipMappingTypeCritic.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/Critic.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Critic.java Wed Jun 9 10:53:53 2010
@@ -34,17 +34,15 @@
  * be used.
  * <p>
  * Classes of this type must be immutable.
- *
- * @param <S> The object type that will be analyzed to be criticized.
  */
-public interface Critic<S> {
+public interface Critic {

     /**
      * Analyzes the subject and returns a set of criticisms if there are
* problems with the object. This should not change the subject in any way
      * including causing the subject to populate.
      */
-    public List<Criticism<S>> criticize(S subject);
+    public List<Criticism> criticize(Object subject);

     /**
* The error level this critic was defined to be at when it was created.
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticAndSettings.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticAndSettings.java Wed Jun 9 10:53:53 2010
@@ -28,13 +28,12 @@
 import ca.sqlpower.object.annotation.Constructor;
 import ca.sqlpower.object.annotation.ConstructorParameter;
 import ca.sqlpower.object.annotation.Mutator;
-import ca.sqlpower.sqlobject.SQLObject;

 /**
* The settings of a specific {...@link Critic}. Includes if the critic is enabled
  * and any additional settings to decide how to criticize the object model.
  */
-public abstract class CriticAndSettings extends AbstractSPObject implements CriticSettings, Critic<SQLObject> { +public abstract class CriticAndSettings extends AbstractSPObject implements CriticSettings, Critic {

     /**
      * Defines an absolute ordering of the child types of this class.
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Wed Jun 9 10:53:53 2010
@@ -34,7 +34,6 @@
 import ca.sqlpower.object.SPObject;
 import ca.sqlpower.object.annotation.Constructor;
 import ca.sqlpower.object.annotation.NonProperty;
-import ca.sqlpower.sqlobject.SQLObject;

 /**
* A collection of settings that defines what critics are enabled in the system
@@ -121,8 +120,8 @@
* Returns a list of critics to calculate criticisms of objects passed to
      * them. These critics are immutable after they are created.
      */
-    public List<Critic<SQLObject>> createCritics() {
- List<Critic<SQLObject>> critics = new ArrayList<Critic<SQLObject>>();
+    public List<Critic> createCritics() {
+        List<Critic> critics = new ArrayList<Critic>();
         for (CriticGrouping grouping : criticGroupings) {
             if (!grouping.isEnabled()) continue;
for (CriticAndSettings singleSettings : grouping.getSettings()) {
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticism.java Tue Jun 8 13:39:34 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticism.java Wed Jun 9 10:53:53 2010
@@ -26,13 +26,10 @@
* If the enabled {...@link Critic}s in the system find problems with the project
  * it will create criticisms. The criticisms can be used by users to help
  * understand errors in their model and do quick fixes for them as well.
- *
- * @param <S>
- *            The object type this criticism can be found on.
  */
-public class Criticism<S> {
-
-    private final S subject;
+public class Criticism {
+
+    private final Object subject;
     private final String description;
     private final QuickFix[] fixes;

@@ -40,16 +37,16 @@
* The critic that created this criticism. Used to revalidate the criticism
      * and find out the error level of the criticism.
      */
-    private final Critic<S> critic;
-
- public Criticism(S subject, String description, Critic<S> critic, QuickFix ... fixes) {
+    private final Critic critic;
+
+ public Criticism(Object subject, String description, Critic critic, QuickFix ... fixes) {
         this.subject = subject;
         this.description = description;
         this.critic = critic;
         this.fixes = fixes;
     }

-    public S getSubject() {
+    public Object getSubject() {
         return subject;
     }

@@ -61,7 +58,7 @@
         return Arrays.asList(fixes);
     }

-    public Critic<S> getCritic() {
+    public Critic getCritic() {
         return critic;
     }
 }
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismBucket.java Tue Jun 8 13:39:34 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismBucket.java Wed Jun 9 10:53:53 2010
@@ -29,22 +29,22 @@
* creates them so the creation of the {...@link Criticism}s is easier to done on a
  * separate thread.
  */
-public class CriticismBucket<S> {
+public class CriticismBucket {

     /**
* The collection of most recent criticisms of the objects last passed to
      * this criticizer.
      */
- private final List<Criticism<S>> criticisms = new ArrayList<Criticism<S>>();
+    private final List<Criticism> criticisms = new ArrayList<Criticism>();

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

-    public void updateCriticismsToMatch(Criticizer<S> criticizer) {
+    public void updateCriticismsToMatch(Criticizer criticizer) {
         clearCriticisms();
-        List<Criticism<S>> newCriticisms = criticizer.getCriticisms();
+        List<Criticism> newCriticisms = criticizer.getCriticisms();
         criticisms.addAll(newCriticisms);
         int index = criticisms.size();
-        for (Criticism<S> newCriticism : newCriticisms) {
+        for (Criticism newCriticism : newCriticisms) {
             for (int i = listeners.size() - 1; i >=0; i--) {
listeners.get(i).criticismAdded(new CriticismEvent(newCriticism, index));
             }
@@ -56,17 +56,17 @@
      * Removes all current criticisms from the criticizer.
      */
     private void clearCriticisms() {
- ArrayList<Criticism<S>> oldCriticisms = new ArrayList<Criticism<S>>(criticisms); + ArrayList<Criticism> oldCriticisms = new ArrayList<Criticism>(criticisms);
         criticisms.clear();
         for (int i = oldCriticisms.size() - 1; i >= 0; i--) {
-            Criticism<S> oldCriticism = oldCriticisms.get(i);
+            Criticism oldCriticism = oldCriticisms.get(i);
             for (int j = listeners.size() - 1; j >=0; j--) {
listeners.get(j).criticismRemoved(new CriticismEvent(oldCriticism, i));
             }
         }
     }

-    public List<Criticism<S>> getCriticisms() {
+    public List<Criticism> getCriticisms() {
         return Collections.unmodifiableList(criticisms);
     }

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismEvent.java Tue Jun 8 13:39:34 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticismEvent.java Wed Jun 9 10:53:53 2010
@@ -24,15 +24,15 @@
  */
 public class CriticismEvent {

-    private final Criticism<?> criticism;
+    private final Criticism criticism;
     private final int index;

-    public CriticismEvent(Criticism<?> criticism, int index) {
+    public CriticismEvent(Criticism criticism, int index) {
         this.criticism = criticism;
         this.index = index;
     }

-    public Criticism<?> getCriticism() {
+    public Criticism getCriticism() {
         return criticism;
     }

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticizer.java Tue Jun 8 13:39:34 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/Criticizer.java Wed Jun 9 10:53:53 2010
@@ -27,30 +27,27 @@
* 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.
- *
- * @param <S>
- *            The object type that can be criticized with this criticizer.
  */
-public class Criticizer<S> {
-
-    private final List<Critic<S>> critics;
+public class Criticizer {
+
+    private final List<Critic> critics;

     /**
* The collection of criticisms of the objects last calculated by this criticizer.
      */
-    private final List<Criticism<S>> criticisms;
-
-    public Criticizer(List<Critic<S>> critics) {
- this.critics = Collections.unmodifiableList(new ArrayList<Critic<S>>(critics));
-        criticisms = new ArrayList<Criticism<S>>();
+    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.
      */
-    public void criticize(S subject) {
-        for (Critic<S> critic : critics) {
-            List<Criticism<S>> newCriticisms = critic.criticize(subject);
+    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
         }
@@ -63,7 +60,7 @@
      *
      * @return an unmodifiable list of criticisms
      */
-    public List<Criticism<S>> getCriticisms() {
+    public List<Criticism> getCriticisms() {
         return criticisms;
     }

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/CommentCritic.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/CommentCritic.java Wed Jun 9 10:53:53 2010
@@ -30,7 +30,6 @@
 import ca.sqlpower.object.annotation.Constructor;
 import ca.sqlpower.object.annotation.ConstructorParameter;
 import ca.sqlpower.sqlobject.SQLColumn;
-import ca.sqlpower.sqlobject.SQLObject;
 import ca.sqlpower.sqlobject.SQLTable;

 public class CommentCritic extends CriticAndSettings {
@@ -50,7 +49,7 @@
         this.maxTableCommentLength = maxLengthTable;
     }

-    public List<Criticism<SQLObject>> criticize(final SQLObject so) {
+    public List<Criticism> criticize(final Object so) {

if (!(so instanceof SQLTable || so instanceof SQLColumn)) return Collections.emptyList();

@@ -65,9 +64,9 @@
             maxLength = getMaxColumnCommentLength();
         }

- List<Criticism<SQLObject>> criticisms = new ArrayList<Criticism<SQLObject>>();
+        List<Criticism> criticisms = new ArrayList<Criticism>();
if (remarks != null && remarks.length() > maxLength && maxLength > 0) {
-            criticisms.add(new Criticism<SQLObject>(
+            criticisms.add(new Criticism(
                     so,
                     "Comment too long for " + getPlatformName(),
                     this,
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/PhysicalNameCritic.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/PhysicalNameCritic.java Wed Jun 9 10:53:53 2010
@@ -24,8 +24,8 @@
 import java.util.List;
 import java.util.regex.Pattern;

-import ca.sqlpower.architect.ddl.critic.CriticAndSettings;
 import ca.sqlpower.architect.ddl.critic.Critic;
+import ca.sqlpower.architect.ddl.critic.CriticAndSettings;
 import ca.sqlpower.architect.ddl.critic.Criticism;
 import ca.sqlpower.architect.ddl.critic.QuickFix;
 import ca.sqlpower.object.annotation.Accessor;
@@ -69,14 +69,17 @@

     }

-    public List<Criticism<SQLObject>> criticize(final SQLObject so) {
+    public List<Criticism> criticize(final Object subject) {
+ if (!(subject instanceof SQLObject)) return Collections.emptyList();
+
+        final SQLObject so = (SQLObject) subject;
         String physName = so.getPhysicalName();

         if (physName == null) return Collections.emptyList();

- List<Criticism<SQLObject>> criticisms = new ArrayList<Criticism<SQLObject>>();
+        List<Criticism> criticisms = new ArrayList<Criticism>();
         if (physName.length() > getMaxNameLength()) {
-            criticisms.add(new Criticism<SQLObject>(
+            criticisms.add(new Criticism(
                     so,
                     "Physical name too long for " + getPlatformName(),
                     this,
@@ -89,7 +92,7 @@
                     }));
         }
         if (!getLegalNamePattern().matcher(physName).matches()) {
-            criticisms.add(new Criticism<SQLObject>(
+            criticisms.add(new Criticism(
                     so,
                     "Physical name not legal for " + getPlatformName(),
                     this
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/PrimaryKeyCritic.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/PrimaryKeyCritic.java Wed Jun 9 10:53:53 2010
@@ -24,7 +24,6 @@

 import ca.sqlpower.architect.ddl.critic.CriticAndSettings;
 import ca.sqlpower.architect.ddl.critic.Criticism;
-import ca.sqlpower.sqlobject.SQLObject;
 import ca.sqlpower.sqlobject.SQLTable;

 /**
@@ -36,12 +35,12 @@
super(StarterPlatformTypes.GENERIC.getName(), "Non-empty primary key");
     }

-    public List<Criticism<SQLObject>> criticize(final SQLObject so) {
+    public List<Criticism> criticize(final Object so) {
         if (!(so instanceof SQLTable)) return Collections.emptyList();
         SQLTable t = (SQLTable) so;
- List<Criticism<SQLObject>> criticisms = new ArrayList<Criticism<SQLObject>>();
+        List<Criticism> criticisms = new ArrayList<Criticism>();
         if (t.getPkSize() == 0) {
- criticisms.add(new Criticism<SQLObject>(t, "Table has no primary key defined", this)); + criticisms.add(new Criticism(t, "Table has no primary key defined", this));
         }
         return criticisms;
     }
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/RelationshipMappingTypeCritic.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/RelationshipMappingTypeCritic.java Wed Jun 9 10:53:53 2010
@@ -28,7 +28,6 @@
 import ca.sqlpower.architect.ddl.critic.Criticism;
 import ca.sqlpower.architect.ddl.critic.QuickFix;
 import ca.sqlpower.sqlobject.SQLColumn;
-import ca.sqlpower.sqlobject.SQLObject;
 import ca.sqlpower.sqlobject.SQLRelationship;
 import ca.sqlpower.sqlobject.SQLTable;

@@ -47,10 +46,10 @@
* is more difficult to make safe when we move the critics to the background
      * thread.
      */
-    public List<Criticism<SQLObject>> criticize(SQLObject so) {
+    public List<Criticism> criticize(Object so) {
if (!(so instanceof SQLRelationship)) return Collections.emptyList();
         SQLRelationship subject = (SQLRelationship) so;
- List<Criticism<SQLObject>> criticisms = new ArrayList<Criticism<SQLObject>>();
+        List<Criticism> criticisms = new ArrayList<Criticism>();
         for (SQLRelationship.ColumnMapping cm : subject.getChildren(
                 SQLRelationship.ColumnMapping.class)) {
if (ArchitectUtils.columnsDiffer(cm.getFkColumn(), cm.getPkColumn())) {
@@ -58,7 +57,7 @@
                 final SQLTable parentTable = parentColumn.getParent();
                 final SQLColumn childColumn = cm.getFkColumn();
                 final SQLTable childTable = childColumn.getParent();
-                criticisms.add(new Criticism<SQLObject>(
+                criticisms.add(new Criticism(
                         subject,
"Columns related by FK constraint have different types",
                         this,
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectFrame.java Tue Jun 8 13:39:34 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectFrame.java Wed Jun 9 10:53:53 2010
@@ -137,7 +137,6 @@
 import ca.sqlpower.enterprise.client.SPServerInfo;
 import ca.sqlpower.sqlobject.SQLColumn;
 import ca.sqlpower.sqlobject.SQLDatabase;
-import ca.sqlpower.sqlobject.SQLObject;
 import ca.sqlpower.sqlobject.SQLObjectException;
 import ca.sqlpower.sqlobject.undo.NotifyingUndoManager;
 import ca.sqlpower.swingui.DataEntryPanelBuilder;
@@ -1292,7 +1291,7 @@
* Updates the critic panel to use the criticisms in the given criticizer.
      * Will also display the critic panel if it is not visible.
      */
-    public void updateCriticPanel(Criticizer<SQLObject> criticizer) {
+    public void updateCriticPanel(Criticizer criticizer) {
criticPanel.getCriticismBucket().updateCriticismsToMatch(criticizer);
         criticPanel.getPanel().setVisible(true);
         final double screenHeight = splitPane.getHeight();
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticPanel.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticPanel.java Wed Jun 9 10:53:53 2010
@@ -32,7 +32,6 @@
 import ca.sqlpower.architect.ddl.critic.CriticismBucket;
 import ca.sqlpower.architect.ddl.critic.CriticAndSettings.Severity;
 import ca.sqlpower.architect.swingui.ArchitectSwingSession;
-import ca.sqlpower.sqlobject.SQLObject;
 import ca.sqlpower.swingui.SPSUtils;
 import ca.sqlpower.swingui.table.FancyExportableJTable;

@@ -89,13 +88,13 @@
* The criticisms in the panel can be updated in this bucket to be valid
      * criticisms of the current project.
      */
-    private final CriticismBucket<SQLObject> criticismBucket;
+    private final CriticismBucket criticismBucket;

     private final ArchitectSwingSession session;

     public CriticPanel(ArchitectSwingSession session) {
         this.session = session;
-        criticismBucket = new CriticismBucket<SQLObject>();
+        criticismBucket = new CriticismBucket();

CriticismTableModel tableModel = new CriticismTableModel(session.getWorkspace(),
                 criticismBucket);
@@ -116,7 +115,7 @@
         return panel;
     }

-    public CriticismBucket<SQLObject> getCriticismBucket() {
+    public CriticismBucket getCriticismBucket() {
         return criticismBucket;
     }

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticismTableModel.java Tue Jun 8 14:56:35 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticismTableModel.java Wed Jun 9 10:53:53 2010
@@ -30,7 +30,7 @@

 public class CriticismTableModel extends AbstractTableModel {

-    private final CriticismBucket<?> criticizer;
+    private final CriticismBucket criticizer;

private final CriticismListener criticListener = new CriticismListener() {

@@ -49,7 +49,7 @@
      */
     private final ArchitectSwingProject project;

- public CriticismTableModel(ArchitectSwingProject project, CriticismBucket<?> criticizer) { + public CriticismTableModel(ArchitectSwingProject project, CriticismBucket criticizer) {
         this.project = project;
         this.criticizer = criticizer;
         criticizer.addCriticismListener(criticListener);
@@ -88,7 +88,7 @@
     }

     public Object getValueAt(int rowIndex, int columnIndex) {
-        Criticism<?> rowVal = criticizer.getCriticisms().get(rowIndex);
+        Criticism rowVal = criticizer.getCriticisms().get(rowIndex);
         if (columnIndex == 0) {
             return rowVal.getCritic().getSeverity();
         } else if (columnIndex == 1) {
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticizeAction.java Tue Jun 8 13:39:34 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/critic/CriticizeAction.java Wed Jun 9 10:53:53 2010
@@ -57,14 +57,13 @@
      * Call to do a full critique of the given session's play pen.
      */
     public void criticize() {
-        Criticizer<SQLObject> criticizer = new Criticizer<SQLObject>(
+        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);
         }
-        //XXX Train wreck.
         session.getArchitectFrame().updateCriticPanel(criticizer);
     }

@@ -80,7 +79,7 @@
      *             attempt to populate it fails
      */
     @SuppressWarnings("unchecked")
- private void recursivelyCriticize(SQLObject root, Criticizer<SQLObject> criticizer) throws SQLObjectException { + private void recursivelyCriticize(SQLObject root, Criticizer criticizer) throws SQLObjectException {

         // skip types that don't warrant criticism
         if ( (!(root instanceof SQLDatabase)) &&

Reply via email to