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);
- }
- }
-}
+}