Repository: cayenne
Updated Branches:
  refs/heads/master ec5df09b7 -> 9c07e1826


Remove code duplication in SelectQuery and SQLTemplate prefetch tabs


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/9c07e182
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/9c07e182
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/9c07e182

Branch: refs/heads/master
Commit: 9c07e1826e48df4a86de9110b553bd98388ac581
Parents: ec5df09
Author: stariy <stari...@gmail.com>
Authored: Mon Mar 5 11:59:55 2018 +0300
Committer: stariy <stari...@gmail.com>
Committed: Mon Mar 5 11:59:55 2018 +0300

----------------------------------------------------------------------
 .../cayenne/modeler/editor/PrefetchModel.java   | 130 +++++++++++++++++
 .../modeler/editor/SQLTemplatePrefetchTab.java  | 139 +-----------------
 .../modeler/editor/SelectQueryPrefetchTab.java  | 141 +------------------
 3 files changed, 140 insertions(+), 270 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/9c07e182/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/PrefetchModel.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/PrefetchModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/PrefetchModel.java
new file mode 100644
index 0000000..c671c66
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/PrefetchModel.java
@@ -0,0 +1,130 @@
+package org.apache.cayenne.modeler.editor;
+
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionException;
+import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.map.Relationship;
+
+import javax.swing.table.AbstractTableModel;
+import java.util.Map;
+
+/**
+ * A table model for the Prefetch table.
+ */
+class PrefetchModel extends AbstractTableModel {
+
+    private final Map<String, Integer> prefetchMap;
+
+    private final Object root;
+
+    private final String[] prefetches;
+
+    PrefetchModel(Map<String, Integer> prefetchMap, Object root) {
+        this.prefetchMap = prefetchMap;
+        this.prefetches = prefetchMap.keySet().toArray(new String[0]);
+        this.root = root;
+    }
+
+    @Override
+    public int getColumnCount() {
+        return 3;
+    }
+
+    @Override
+    public int getRowCount() {
+        return (prefetches != null) ? prefetches.length : 0;
+    }
+
+    @Override
+    public Object getValueAt(int row, int column) {
+        switch (column) {
+            case 0:
+                return prefetches[row];
+            case 1:
+                return isToMany(prefetches[row]) ? Boolean.TRUE : 
Boolean.FALSE;
+            case 2:
+                return getPrefetchTypeString(prefetchMap.get(prefetches[row]));
+            default:
+                throw new IndexOutOfBoundsException("Invalid column: " + 
column);
+        }
+    }
+
+    @Override
+    public Class getColumnClass(int column) {
+        switch (column) {
+            case 0:
+                return String.class;
+            case 1:
+                return Boolean.class;
+            case 2:
+                return String.class;
+            default:
+                throw new IndexOutOfBoundsException("Invalid column: " + 
column);
+        }
+    }
+
+    @Override
+    public String getColumnName(int column) {
+        switch (column) {
+            case 0:
+                return "Prefetch Path";
+            case 1:
+                return "To Many";
+            case 2:
+                return "Prefetch Type";
+            default:
+                throw new IndexOutOfBoundsException("Invalid column: " + 
column);
+        }
+    }
+
+    @Override
+    public boolean isCellEditable(int row, int column) {
+        return column == 2;
+    }
+
+    @Override
+    public void setValueAt(Object value, int row, int column) {
+        switch (column) {
+            case 2:
+                prefetchMap.put(prefetches[row], 
getPrefetchType((String)value));
+                break;
+        }
+    }
+
+    static int getPrefetchType(String semantics) {
+
+        //case 2: disjoint isn't use for SQLTemplate prefetch
+        switch (semantics){
+            case "Joint" :
+                return 1;
+            case "Disjoint":
+                return 2;
+            case "Disjoint by id":
+                return 3;
+            default: return 0;
+        }
+    }
+
+    private static String getPrefetchTypeString(int semantics) {
+        switch (semantics){
+            case 1 :
+                return SelectQueryPrefetchTab.JOINT_PREFETCH_SEMANTICS;
+            case 2:
+                return SelectQueryPrefetchTab.DISJOINT_PREFETCH_SEMANTICS;
+            case 3:
+                return 
SelectQueryPrefetchTab.DISJOINT_BY_ID_PREFETCH_SEMANTICS;
+        }
+        return SelectQueryPrefetchTab.UNDEFINED_SEMANTICS;
+    }
+
+    private boolean isToMany(String prefetch) {
+        // totally invalid path would result in ExpressionException
+        try {
+            Expression exp = ExpressionFactory.exp(prefetch);
+            Object object = exp.evaluate(root);
+            return object instanceof Relationship && ((Relationship) 
object).isToMany();
+        } catch (ExpressionException e) {
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9c07e182/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java
index 1375429..5136b86 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java
@@ -20,9 +20,6 @@
 package org.apache.cayenne.modeler.editor;
 
 import org.apache.cayenne.configuration.event.QueryEvent;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionException;
-import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.QueryDescriptor;
@@ -53,7 +50,6 @@ import javax.swing.JSplitPane;
 import javax.swing.JTable;
 import javax.swing.JToolBar;
 import javax.swing.ListSelectionModel;
-import javax.swing.table.AbstractTableModel;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableColumn;
 import javax.swing.table.TableModel;
@@ -73,10 +69,6 @@ public class SQLTemplatePrefetchTab extends JPanel 
implements PropertyChangeList
     // property for split pane divider size
     private static final String SPLIT_DIVIDER_LOCATION_PROPERTY = 
"query.orderings.divider.location";
 
-    private static final String JOINT_PREFETCH_SEMANTICS = "Joint";
-    private static final String DISJOINT_BY_ID_PREFETCH_SEMANTICS = "Disjoint 
by id";
-    private static final String UNDEFINED_SEMANTICS = "Undefined semantics";
-
     private static final Dimension BROWSER_CELL_DIM = new Dimension(150, 100);
     private static final Dimension TABLE_DIM = new Dimension(460, 60);
 
@@ -168,8 +160,8 @@ public class SQLTemplatePrefetchTab extends JPanel 
implements PropertyChangeList
     protected void setUpPrefetchBox(TableColumn column) {
 
         JComboBox<String> prefetchBox = new JComboBox<>();
-        prefetchBox.addItem(JOINT_PREFETCH_SEMANTICS);
-        prefetchBox.addItem(DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+        prefetchBox.addItem(SelectQueryPrefetchTab.JOINT_PREFETCH_SEMANTICS);
+        
prefetchBox.addItem(SelectQueryPrefetchTab.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
 
         prefetchBox.addActionListener(e -> 
Application.getInstance().getFrameController().getEditorView().getEventController().setDirty(true));
 
@@ -240,7 +232,6 @@ public class SQLTemplatePrefetchTab extends JPanel 
implements PropertyChangeList
         Icon removeIcon = ModelerUtil.buildIcon("icon-trash.png");
         remove.setIcon(removeIcon);
         
remove.setDisabledIcon(FilteredIconFactory.createDisabledIcon(removeIcon));
-
         remove.addActionListener(e -> {
             int selection = table.getSelectedRow();
             if (selection < 0) {
@@ -299,7 +290,7 @@ public class SQLTemplatePrefetchTab extends JPanel 
implements PropertyChangeList
     }
 
     protected TableModel createTableModel() {
-        return new PrefetchModel();
+        return new PrefetchModel(sqlTemplate.getPrefetchesMap(), 
sqlTemplate.getRoot());
     }
 
     public void addPrefetch(String prefetch) {
@@ -310,7 +301,7 @@ public class SQLTemplatePrefetchTab extends JPanel 
implements PropertyChangeList
         }
 
         //default value is joint
-        sqlTemplate.addPrefetch(prefetch, 
getPrefetchType(DISJOINT_BY_ID_PREFETCH_SEMANTICS));
+        sqlTemplate.addPrefetch(prefetch, 
PrefetchModel.getPrefetchType(SelectQueryPrefetchTab.DISJOINT_BY_ID_PREFETCH_SEMANTICS));
 
         // reset the model, since it is immutable
         table.setModel(createTableModel());
@@ -329,27 +320,6 @@ public class SQLTemplatePrefetchTab extends JPanel 
implements PropertyChangeList
         mediator.fireQueryEvent(new QueryEvent(this, sqlTemplate));
     }
 
-    boolean isToMany(String prefetch) {
-        if (sqlTemplate == null) {
-            return false;
-        }
-
-        Object root = sqlTemplate.getRoot();
-
-        // totally invalid path would result in ExpressionException
-        try {
-            Expression exp = ExpressionFactory.exp(prefetch);
-            Object object = exp.evaluate(root);
-            if (object instanceof Relationship) {
-                return ((Relationship) object).isToMany();
-            } else {
-                return false;
-            }
-        } catch (ExpressionException e) {
-            return false;
-        }
-    }
-
     /**
      * Updates split pane divider location in properties
      */
@@ -369,105 +339,4 @@ public class SQLTemplatePrefetchTab extends JPanel 
implements PropertyChangeList
         return SPLIT_DIVIDER_LOCATION_PROPERTY;
     }
 
-    protected int getPrefetchType(String semantics) {
-
-        //case 2: disjoint isn't use for SQLTemplate prefetch
-        switch (semantics){
-            case "Joint" :
-                return 1;
-            case "Disjoint by id":
-                return 3;
-            default: return 0;
-        }
-    }
-
-    protected String getPrefetchTypeString(int semantics) {
-        switch (semantics){
-            case 1 :
-                return JOINT_PREFETCH_SEMANTICS;
-            case 3:
-                return DISJOINT_BY_ID_PREFETCH_SEMANTICS;
-            default: return UNDEFINED_SEMANTICS;
-        }
-    }
-
-    /**
-     * A table model for the Prefetch table.
-     */
-    final class PrefetchModel extends AbstractTableModel {
-
-        String[] prefetches;
-
-        PrefetchModel() {
-            if (sqlTemplate != null) {
-                prefetches = 
sqlTemplate.getPrefetchesMap().keySet().toArray(new String[0]);
-            }
-        }
-
-        @Override
-        public int getColumnCount() {
-            return 3;
-        }
-
-        @Override
-        public int getRowCount() {
-            return (prefetches != null) ? prefetches.length : 0;
-        }
-
-        @Override
-        public Object getValueAt(int row, int column) {
-            switch (column) {
-                case 0:
-                    return prefetches[row];
-                case 1:
-                    return isToMany(prefetches[row]) ? Boolean.TRUE : 
Boolean.FALSE;
-                case 2:
-                    return 
getPrefetchTypeString(sqlTemplate.getPrefetchesMap().get(prefetches[row]));
-                default:
-                    throw new IndexOutOfBoundsException("Invalid column: " + 
column);
-            }
-        }
-
-        @Override
-        public Class getColumnClass(int column) {
-            switch (column) {
-                case 0:
-                    return String.class;
-                case 1:
-                    return Boolean.class;
-                case 2:
-                    return String.class;
-                default:
-                    throw new IndexOutOfBoundsException("Invalid column: " + 
column);
-            }
-        }
-
-        @Override
-        public String getColumnName(int column) {
-            switch (column) {
-                case 0:
-                    return "Prefetch Path";
-                case 1:
-                    return "To Many";
-                case 2:
-                    return "Prefetch Type";
-                default:
-                    throw new IndexOutOfBoundsException("Invalid column: " + 
column);
-            }
-        }
-
-        @Override
-        public boolean isCellEditable(int row, int column) {
-            return column == 2;
-        }
-
-        @Override
-        public void setValueAt(Object value, int row, int column) {
-            switch (column) {
-                case 2:
-                    sqlTemplate.addPrefetch(prefetches[row], 
getPrefetchType((String)value));
-                    break;
-            }
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9c07e182/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
index 1c4ac54..82719d8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
@@ -20,9 +20,6 @@
 package org.apache.cayenne.modeler.editor;
 
 import org.apache.cayenne.configuration.event.QueryEvent;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionException;
-import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
@@ -42,7 +39,6 @@ import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JToolBar;
-import javax.swing.table.AbstractTableModel;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableColumn;
 import javax.swing.table.TableModel;
@@ -54,10 +50,10 @@ import javax.swing.tree.TreeModel;
  */
 public class SelectQueryPrefetchTab extends SelectQueryOrderingTab {
 
-    private static final String JOINT_PREFETCH_SEMANTICS = "Joint";
-    private static final String DISJOINT_PREFETCH_SEMANTICS = "Disjoint";
-    private static final String DISJOINT_BY_ID_PREFETCH_SEMANTICS = "Disjoint 
by id";
-    private static final String UNDEFINED_SEMANTICS = "Undefined semantics";
+    static final String JOINT_PREFETCH_SEMANTICS = "Joint";
+    static final String DISJOINT_PREFETCH_SEMANTICS = "Disjoint";
+    static final String DISJOINT_BY_ID_PREFETCH_SEMANTICS = "Disjoint by id";
+    static final String UNDEFINED_SEMANTICS = "Undefined semantics";
 
     public SelectQueryPrefetchTab(ProjectController mediator) {
         super(mediator);
@@ -110,7 +106,6 @@ public class SelectQueryPrefetchTab extends 
SelectQueryOrderingTab {
         Icon removeIcon = ModelerUtil.buildIcon("icon-trash.png");
         remove.setIcon(removeIcon);
         
remove.setDisabledIcon(FilteredIconFactory.createDisabledIcon(removeIcon));
-        
         remove.addActionListener(e -> {
             int selection = table.getSelectedRow();
 
@@ -147,7 +142,7 @@ public class SelectQueryPrefetchTab extends 
SelectQueryOrderingTab {
     }
 
     protected TableModel createTableModel() {
-        return new PrefetchModel();
+        return new PrefetchModel(selectQuery.getPrefetchesMap(), 
selectQuery.getRoot());
     }
 
     public void addPrefetch(String prefetch) {
@@ -158,7 +153,7 @@ public class SelectQueryPrefetchTab extends 
SelectQueryOrderingTab {
         }
 
         //default value id disjoint
-        selectQuery.addPrefetch(prefetch, 
getPrefetchType(DISJOINT_PREFETCH_SEMANTICS));
+        selectQuery.addPrefetch(prefetch, 
PrefetchModel.getPrefetchType(DISJOINT_PREFETCH_SEMANTICS));
        
         // reset the model, since it is immutable
         table.setModel(createTableModel());
@@ -177,128 +172,4 @@ public class SelectQueryPrefetchTab extends 
SelectQueryOrderingTab {
         mediator.fireQueryEvent(new QueryEvent(this, selectQuery));
     }
 
-    boolean isToMany(String prefetch) {
-        if (selectQuery == null) {
-            return false;
-        }
-
-        Object root = selectQuery.getRoot();
-
-        // totally invalid path would result in ExpressionException
-        try {
-            Expression exp = ExpressionFactory.exp(prefetch);
-            Object object = exp.evaluate(root);
-            if (object instanceof Relationship) {
-                return ((Relationship) object).isToMany();
-            } else {
-                return false;
-            }
-        } catch (ExpressionException e) {
-            return false;
-        }
-    }
-
-    protected int getPrefetchType(String semantics) {
-        switch (semantics){
-            case "Joint" :
-                return 1;
-            case "Disjoint":
-                return 2;
-            case "Disjoint by id":
-                return 3;
-            default: return 0;
-        }
-    }
-
-    protected String getPrefetchTypeString(int semantics) {
-        switch (semantics){
-            case 1 :
-                return JOINT_PREFETCH_SEMANTICS;
-            case 2:
-                return DISJOINT_PREFETCH_SEMANTICS;
-            case 3:
-                return DISJOINT_BY_ID_PREFETCH_SEMANTICS;
-            default: return UNDEFINED_SEMANTICS;
-        }
-    }
-
-    /**
-     * A table model for the Prefetch table.
-     */
-    final class PrefetchModel extends AbstractTableModel {
-
-        String[] prefetches;
-
-        PrefetchModel() {
-            if (selectQuery != null) {
-                prefetches = 
selectQuery.getPrefetchesMap().keySet().toArray(new String[0]);
-            }
-        }
-
-        @Override
-        public int getColumnCount() {
-            return 3;
-        }
-
-        @Override
-        public int getRowCount() {
-            return (prefetches != null) ? prefetches.length : 0;
-        }
-
-        @Override
-        public Object getValueAt(int row, int column) {
-            switch (column) {
-                case 0:
-                    return prefetches[row];
-                case 1:
-                    return isToMany(prefetches[row]) ? Boolean.TRUE : 
Boolean.FALSE;
-                case 2:
-                    return 
getPrefetchTypeString(selectQuery.getPrefetchesMap().get(prefetches[row]));
-                default:
-                    throw new IndexOutOfBoundsException("Invalid column: " + 
column);
-            }
-        }
-
-        @Override
-        public Class getColumnClass(int column) {
-            switch (column) {
-                case 0:
-                    return String.class;
-                case 1:
-                    return Boolean.class;
-                case 2:
-                    return String.class;
-                default:
-                    throw new IndexOutOfBoundsException("Invalid column: " + 
column);
-            }
-        }
-
-        @Override
-        public String getColumnName(int column) {
-            switch (column) {
-                case 0:
-                    return "Prefetch Path";
-                case 1:
-                    return "To Many";
-                case 2:
-                    return "Prefetch Type";
-                default:
-                    throw new IndexOutOfBoundsException("Invalid column: " + 
column);
-            }
-        }
-
-        @Override
-        public boolean isCellEditable(int row, int column) {
-            return column == 2;
-        }
-
-        @Override
-        public void setValueAt(Object value, int row, int column) {
-            switch (column) {
-                case 2:
-                    selectQuery.addPrefetch(prefetches[row], 
getPrefetchType((String)value));
-                    break;
-            }
-        }
-    }
 }

Reply via email to