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)) &&