You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2010/10/12 19:47:57 UTC

svn commit: r1021859 - in /openjpa/tools/trunk/openjpa-tools/src/main: java/org/apache/openjpa/swing/ java/org/apache/openjpa/swing/layout/ java/org/apache/openjpa/tools/metamodel/ resources/org/apache/openjpa/tools/metamodel/

Author: ppoddar
Date: Tue Oct 12 17:47:57 2010
New Revision: 1021859

URL: http://svn.apache.org/viewvc?rev=1021859&view=rev
Log:
Add tabular display, close/refresh actions

Modified:
    openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/ErrorDialog.java
    openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/layout/FRLayoutManager.java
    openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/tools/metamodel/MetamodelBrowser.java
    openjpa/tools/trunk/openjpa-tools/src/main/resources/org/apache/openjpa/tools/metamodel/localizer.properties

Modified: openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/ErrorDialog.java
URL: http://svn.apache.org/viewvc/openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/ErrorDialog.java?rev=1021859&r1=1021858&r2=1021859&view=diff
==============================================================================
--- openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/ErrorDialog.java (original)
+++ openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/ErrorDialog.java Tue Oct 12 17:47:57 2010
@@ -79,6 +79,7 @@ public final class ErrorDialog extends J
      */
     public ErrorDialog(JComponent owner, Icon icon, Throwable t) {
         super();
+        t.printStackTrace();
         setTitle(t.getClass().getName());
         setModal(true);
         if (icon != null && icon instanceof ImageIcon) 

Modified: openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/layout/FRLayoutManager.java
URL: http://svn.apache.org/viewvc/openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/layout/FRLayoutManager.java?rev=1021859&r1=1021858&r2=1021859&view=diff
==============================================================================
--- openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/layout/FRLayoutManager.java (original)
+++ openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/swing/layout/FRLayoutManager.java Tue Oct 12 17:47:57 2010
@@ -127,7 +127,7 @@ public class FRLayoutManager implements 
     
     private Map<Component,Rectangle2D> initializeBoundsRandom(Container parent) {
         Set<Component> components = layout.keySet();
-        size = parent.getSize();
+        size = parent.getPreferredSize();
         Insets insets = parent.getInsets();
         info("initializeBoundsRandom: " + toString("Parent Area ", size) + " No of components " 
                 + components.size() + " Layout components " + layout.size());
@@ -168,7 +168,7 @@ public class FRLayoutManager implements 
     
     private Map<Component,Rectangle2D> initializeBoundsGrid(Container parent) {
         Set<Component> components = layout.keySet();
-        size = parent.getSize();
+        size = parent.getPreferredSize();
         Insets insets = parent.getInsets();
         info("initializeBoundsGrid:" + toString("Parent Area ", size));
         Map<Component,Rectangle2D> bounds = new HashMap<Component,Rectangle2D>();
@@ -346,8 +346,8 @@ public class FRLayoutManager implements 
     public void layoutContainer(Container parent) {
 //        find(parent);
         if (isInitialized()) {
-            resize(parent.getSize(),size, parent.getInsets());
-            size = new Dimension(parent.getSize());
+            resize(parent.getPreferredSize(),size, parent.getInsets());
+            size = new Dimension(parent.getPreferredSize());
             _dirty = false;
             return;
         } 
@@ -359,7 +359,7 @@ public class FRLayoutManager implements 
         double[] quality = layoutQuality(bounds);                
         info("Initial layout quality " + quality[0] + " Overlap = " + quality[1] + 
                 " average edge length " + quality[3] + " of " + quality[2] + " edges");                
-        coefficient = Math.sqrt(area(parent.getSize())/layout.size());
+        coefficient = Math.sqrt(area(parent.getPreferredSize())/layout.size());
         boolean done = false;
         double temperature = 100;//area(parent.getSize())/Math.sqrt(components.length);
         int max = 20;

Modified: openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/tools/metamodel/MetamodelBrowser.java
URL: http://svn.apache.org/viewvc/openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/tools/metamodel/MetamodelBrowser.java?rev=1021859&r1=1021858&r2=1021859&view=diff
==============================================================================
--- openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/tools/metamodel/MetamodelBrowser.java (original)
+++ openjpa/tools/trunk/openjpa-tools/src/main/java/org/apache/openjpa/tools/metamodel/MetamodelBrowser.java Tue Oct 12 17:47:57 2010
@@ -14,6 +14,7 @@
 package org.apache.openjpa.tools.metamodel;
 
 import java.awt.BorderLayout;
+import java.awt.Component;
 import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.EventQueue;
@@ -27,23 +28,24 @@ import java.util.concurrent.ExecutionExc
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
 import javax.persistence.metamodel.Attribute;
-import javax.persistence.metamodel.ManagedType;
+import javax.persistence.metamodel.Metamodel;
 import javax.swing.AbstractAction;
 import javax.swing.Action;
-import javax.swing.JButton;
+import javax.swing.JComponent;
 import javax.swing.JFrame;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
 import javax.swing.JOptionPane;
-import javax.swing.JProgressBar;
 import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
 import javax.swing.JToolBar;
 import javax.swing.SwingWorker;
 
+import org.apache.openjpa.conf.OpenJPAVersion;
 import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.swing.ErrorDialog;
 import org.apache.openjpa.swing.Images;
 import org.apache.openjpa.swing.SwingHelper;
-import org.apache.openjpa.swing.graph.GraphPanel;
 import org.apache.openjpa.swing.print.PrintableDelegateComponent;
 
 /**
@@ -56,21 +58,45 @@ import org.apache.openjpa.swing.print.Pr
 @SuppressWarnings("serial")
 public class MetamodelBrowser extends JFrame implements Runnable {
     private JMenuBar menubar;
-    private JScrollPane scrollableView;
-    private GraphPanel<ManagedType<?>> graphView;
+    private JToolBar toolbar;
+    private JTabbedPane tabs;
 
-    private OpenUnitAction openUnitAction;
+    private OpenUnitAction  openUnitAction;
+    private CloseUnitAction closeUnitAction;
     private RefreshUnitAction refreshUnitAction;
     private ExitAction exitAction;
     private PrintAction printAction;
     private MaskAction maskEdgeAction;
     private HelpAction helpAction;
     private AboutAction aboutAction;
+    private Dimension VIEW_AREA = new Dimension(1500,1000);
+
+    private static String _about;
+    private static Localizer _loc;
+    
+    /**
+     * Statically validates that OpenJPA runtime is available.
+     */
+    static {
+        try {
+            _loc = Localizer.forPackage(MetamodelBrowser.class);
+            _about = "OpenJPA MetaModel Browser\r\n" +
+                     "Running on OpenJPA version " + 
+                     OpenJPAVersion.MAJOR_RELEASE+"." +OpenJPAVersion.MINOR_RELEASE;
+        } catch (Throwable e) {
+            JOptionPane.showMessageDialog(null, "Initialization Error\r\n" +
+                "Ensure OpenJPA libraries are available in classpath", "Classpath Problem", 
+                JOptionPane.ERROR_MESSAGE);
+            System.exit(1);
+        }
+    }
     
-    private static final Localizer _loc = Localizer.forPackage(MetamodelBrowser.class);
 
     /**
-     * @param args
+     * Main entry point initializes a look and feel and triggers the Swing console in
+     * a event dispatcher thread. 
+     * 
+     * @param args no argument
      */
     public static void main(String[] args) throws Exception {
         MetamodelUIManager.setLookAndFeel();
@@ -83,28 +109,30 @@ public class MetamodelBrowser extends JF
     
     public void run() {
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        Container content = getContentPane();
+        content.setLayout(new BorderLayout());
+
         createActions();
 
         menubar = createMenuBar();
-        graphView = createViewingArea();
-        JToolBar toolbar = createToolbar();
-
-        Container content = getContentPane();
-        content.setLayout(new BorderLayout());
+        toolbar = createToolbar();
+        tabs    = createViewingArea();
 
         setJMenuBar(menubar);
 
-        scrollableView = new JScrollPane(graphView);
-        scrollableView.setPreferredSize(new Dimension(1000, 800));
         content.add(toolbar, BorderLayout.NORTH);
-        content.add(scrollableView, BorderLayout.CENTER);
+        content.add(tabs, BorderLayout.CENTER);
         pack();
         SwingHelper.position(this, null);
         setVisible(true);
     }
 
+    /**
+     * Create action elements.
+     */
     void createActions() {
         openUnitAction    = new OpenUnitAction("action.open");
+        closeUnitAction   = new CloseUnitAction("action.close");
         refreshUnitAction = new RefreshUnitAction("action.refresh");
         printAction       = new PrintAction("action.print");
         exitAction        = new ExitAction("action.exit");
@@ -115,10 +143,14 @@ public class MetamodelBrowser extends JF
         aboutAction = new AboutAction("action.about");
     }
 
+    /**
+     * Create toolbar buttons.
+     */
     JToolBar createToolbar() {
         JToolBar bar = new JToolBar();
         bar.setFloatable(false);
         bar.add(openUnitAction);
+        bar.add(closeUnitAction);
         bar.add(refreshUnitAction);
         bar.add(printAction);
         bar.addSeparator();
@@ -126,12 +158,16 @@ public class MetamodelBrowser extends JF
         return bar;
     }
 
+    /**
+     * Creates the menu.
+     */
     JMenuBar createMenuBar() {
         JMenuBar bar = new JMenuBar();
 
         JMenu fileMenu = new JMenu("File");
         bar.add(fileMenu);
         fileMenu.add(openUnitAction);
+        fileMenu.add(closeUnitAction);
         fileMenu.add(refreshUnitAction);
         fileMenu.addSeparator();
         fileMenu.add(printAction);
@@ -150,13 +186,101 @@ public class MetamodelBrowser extends JF
 
         return bar;
     }
+    
+    /**
+     * Creates a tabbed pane as the main viewing area.
+     */
+    JTabbedPane createViewingArea() {
+        JTabbedPane tabs = new JTabbedPane();
+        tabs.setPreferredSize(VIEW_AREA);
+        return tabs;
+    }
+    
+    /**
+     * Adds a scrollable view in a new tab.
+     */
+    void addTab(String label, JComponent view) {
+        JScrollPane scroll = new JScrollPane(view);
+        scroll.setPreferredSize(VIEW_AREA);
+        scroll.setName(label);
+        tabs.add(label, scroll);
+        tabs.setSelectedComponent(scroll);
+    }
+    
+    void removeTab() {
+        Component c = tabs.getSelectedComponent();
+        if (c != null)
+            tabs.remove(c);
+    }
+    
+    void replaceTab(JComponent view) {
+        JScrollPane scroll = (JScrollPane)tabs.getSelectedComponent();
+        scroll.getViewport().setView(view);
+    }
 
-    GraphPanel<ManagedType<?>> createViewingArea() {
-        GraphPanel<ManagedType<?>> pane = new GraphPanel<ManagedType<?>>();
-        return pane;
+    
+    /**
+     * Show a modal error dialog.
+     */
+    void error(Throwable t) {
+        new ErrorDialog(t).setVisible(true);
+    }
+    
+    /**
+     * Show a modal warning message.
+     * @param title dialog title
+     * @param key localized message key
+     */
+    void warning(String title, String key) {
+        JOptionPane.showMessageDialog(this, _loc.get(key).toString(), title, JOptionPane.WARNING_MESSAGE);
+    }
+    
+    /**
+     * Gets the current visible component on the main viewing area.
+     */
+    JComponent getCurrentView() {
+        return (JComponent)((JScrollPane)tabs.getSelectedComponent()).getViewport().getView();
     }
     
+    String getCurrentUnit() {
+        Component c = tabs.getSelectedComponent();
+        return c.getName();
+    }
     
+    /**
+     * Create a Persistence Unit of given name.
+     * The unit is constructed such that the meta-model is accessible without an active
+     * database connection.
+     * 
+     * @param unitName is the name of the persistence unit.
+     */
+    EntityManagerFactory createUnit(final String unitName) {
+        final SwingWorker<EntityManagerFactory, Void> task = new SwingWorker<EntityManagerFactory, Void>() {
+            @Override
+            protected EntityManagerFactory doInBackground() throws Exception {
+                Map<String,Object> props = new HashMap<String, Object>();
+                props.put("openjpa.Id", unitName);
+                props.put("openjpa.BrokerFactory", InMemoryBrokerFactory.class.getName());
+                return Persistence.createEntityManagerFactory(unitName, props);
+           }
+        };
+        task.execute();
+        try {
+            return task.get();
+        } catch (ExecutionException ex) {
+            error(ex.getCause());
+        } catch (InterruptedException ie) {
+
+        }
+        return null;
+    }
+
+    /**
+     * Abstract root of all actions.
+     * The action qualifiers such as label, icon or tool tips are sourced from 
+     * standard OpenJPA's localization mechanics.  
+     *
+     */
     public abstract class BaseAction extends AbstractAction {
         public BaseAction(String key) {
             super();
@@ -167,7 +291,7 @@ public class MetamodelBrowser extends JF
             putValue(Action.LARGE_ICON_KEY,    Images.getIcon(_loc.get(key + ".icon").toString()));
         }
     }
-
+    
     /**
      * Opens a new persistence domain model to be displayed.
      * 
@@ -178,67 +302,74 @@ public class MetamodelBrowser extends JF
         }
 
         public void actionPerformed(ActionEvent e) {
-            final String unitName = JOptionPane.showInputDialog(MetamodelBrowser.this, "Persistence Unit",
-                    "Enter Persistence Unit Name", JOptionPane.PLAIN_MESSAGE);
-
-            final SwingWorker<EntityManagerFactory, Void> task = new SwingWorker<EntityManagerFactory, Void>() {
-                @Override
-                protected EntityManagerFactory doInBackground() throws Exception {
-                    firePropertyChange("message", "", "Opening persistence unit " + unitName);
-                    Map<String,Object> props = new HashMap<String, Object>();
-                    props.put("openjpa.BrokerFactory", "org.apache.openjpa.tools.metamodel.InMemoryBrokerFactory");
-                    EntityManagerFactory emf = Persistence.createEntityManagerFactory(unitName, props);
-                    return emf;
-                }
-            };
-            JProgressBar progressBar = new JProgressBar();
-            JButton cancel = new JButton(new AbstractAction() {
-                public void actionPerformed(ActionEvent e) {
-                    task.cancel(true);
-                }
-            });
-            cancel.setText("Abort");
-            progressBar.add(cancel);
-            progressBar.setIndeterminate(true);
-            progressBar.setVisible(true);
-            task.execute();
-            try {
-                EntityManagerFactory emf = task.get();
-                if (task.isCancelled()) {
-                    return;
-                }
-                MetamodelView newView = new MetamodelView(emf.getMetamodel());
-                graphView = newView;
-                scrollableView.setViewportView(graphView);
-                repaint();
-            } catch (ExecutionException ex) {
-                new org.apache.openjpa.swing.ErrorDialog(ex.getCause()).setVisible(true);
-            } catch (InterruptedException ie) {
-
+            final String unitName = JOptionPane.showInputDialog(MetamodelBrowser.this, 
+                    "Persistence Unit", "Enter Persistence Unit Name", JOptionPane.QUESTION_MESSAGE);
+            if (unitName == null) {
+                return;
+            }
+            if (unitName.trim().length() == 0) {
+                warning("Must specify Unit Name", "no-unit");
+                return;
             }
-            
+            EntityManagerFactory emf = createUnit(unitName);
+            if (emf == null) {
+                return;
+            }
+            Metamodel mm = emf.getMetamodel();
+            if (mm.getManagedTypes().isEmpty()) {
+                warning("Empty Model", "empty-model");
+                return;
+            }
+            MetamodelView newView = new MetamodelView(mm);
+            addTab(unitName, newView);
+            repaint();
         }
-
     }
 
-    public class CloseUnitAction extends BaseAction {
-        public CloseUnitAction(String name) {
+    /**
+     * Reloads the current unit.
+     * 
+     */
+    public class RefreshUnitAction extends BaseAction {
+        public RefreshUnitAction(String name) {
             super(name);
         }
 
         public void actionPerformed(ActionEvent e) {
+            String unitName = getCurrentUnit();
+            EntityManagerFactory emf = createUnit(unitName);
+            if (emf == null) {
+                return;
+            }
+            Metamodel mm = emf.getMetamodel();
+            if (mm.getManagedTypes().isEmpty()) {
+                warning("Empty Model", "empty-model");
+                return;
+            }
+            MetamodelView newView = new MetamodelView(mm);
+            replaceTab(newView);
+            repaint();
         }
     }
 
-    public class SaveUnitAction extends BaseAction {
-        public SaveUnitAction(String name) {
+    /**
+     * Closes the current unit.
+     *
+     */
+    public class CloseUnitAction extends BaseAction {
+        public CloseUnitAction(String name) {
             super(name);
         }
 
         public void actionPerformed(ActionEvent e) {
+            removeTab();
         }
     }
 
+    /**
+     * Prints the current view.
+     *
+     */
     public class PrintAction extends BaseAction {
         public PrintAction(String name) {
             super(name);
@@ -246,8 +377,8 @@ public class MetamodelBrowser extends JF
 
         public void actionPerformed(ActionEvent e) {
             PrinterJob printerJob = PrinterJob.getPrinterJob();
-            PrintableDelegateComponent printable = new PrintableDelegateComponent(MetamodelBrowser.this.graphView, printerJob
-                    .getPageFormat(null));
+            PrintableDelegateComponent printable = new PrintableDelegateComponent(getCurrentView(), 
+                printerJob.getPageFormat(null));
             printable.setScale(0.5);
             printerJob.setPrintable(printable);
             boolean print = printerJob.printDialog();
@@ -261,24 +392,26 @@ public class MetamodelBrowser extends JF
         }
     }
 
-    public class RefreshUnitAction extends BaseAction {
-        public RefreshUnitAction(String name) {
-            super(name);
-        }
-
-        public void actionPerformed(ActionEvent e) {
-        }
-    }
-
+    /**
+     * Exits the application.
+     *
+     */
     public class ExitAction extends BaseAction {
         public ExitAction(String name) {
             super(name);
         }
 
         public void actionPerformed(ActionEvent e) {
+            System.exit(0);
         }
     }
 
+    /**
+     * Masks selected edges.
+     * <br>
+     * <B>not implemented</B>
+     *
+     */
     public class MaskAction extends BaseAction {
         final Class<?> maskType;
 
@@ -288,25 +421,36 @@ public class MetamodelBrowser extends JF
         }
 
         public void actionPerformed(ActionEvent e) {
+            JOptionPane.showMessageDialog(MetamodelBrowser.this, "Not Implemented");
         }
     }
 
+    /**
+     * Shows help.
+     * <br>
+     * <B>not implemented</B>
+     *
+     */
     public class HelpAction extends BaseAction {
         public HelpAction(String name) {
             super(name);
         }
 
         public void actionPerformed(ActionEvent e) {
+            JOptionPane.showMessageDialog(MetamodelBrowser.this, "Not Implemented");
         }
     }
 
+    /**
+     * Shows typical about dialog box.
+     */
     public class AboutAction extends BaseAction {
         public AboutAction(String name) {
             super(name);
         }
 
         public void actionPerformed(ActionEvent e) {
-            JOptionPane.showMessageDialog(MetamodelBrowser.this, "OpenJPA MetaModel Browser");
+            JOptionPane.showMessageDialog(MetamodelBrowser.this, _about);
         }
     }
 }

Modified: openjpa/tools/trunk/openjpa-tools/src/main/resources/org/apache/openjpa/tools/metamodel/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/tools/trunk/openjpa-tools/src/main/resources/org/apache/openjpa/tools/metamodel/localizer.properties?rev=1021859&r1=1021858&r2=1021859&view=diff
==============================================================================
--- openjpa/tools/trunk/openjpa-tools/src/main/resources/org/apache/openjpa/tools/metamodel/localizer.properties (original)
+++ openjpa/tools/trunk/openjpa-tools/src/main/resources/org/apache/openjpa/tools/metamodel/localizer.properties Tue Oct 12 17:47:57 2010
@@ -32,10 +32,15 @@ icon.error: images/error.gif
 # <action>.icon    : The resource path for the icon for toolbar or button
 # -----------------------------------------------------------------------------
 action.open.name:Open...
-action.open.tooltip: "Open a Persistence Unit"
-action.open.help: "Open a Persistence Unit"
+action.open.tooltip: Open a Persistence Unit
+action.open.help: Open a Persistence Unit
 action.open.icon:images/open.png
 
+action.close.name:Close
+action.close.tooltip: Close Persistence Unit
+action.close.help: Close Persistence Unit
+action.close.icon:images/cancel.png
+
 action.print.name:Print
 action.print.icon:images/print.gif
 action.about.name:About