cayenne-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From aadamc...@apache.org
Subject [03/17] cayenne git commit: CAY-2026 Java 7
Date Sat, 12 Sep 2015 10:02:31 GMT
http://git-wip-us.apache.org/repos/asf/cayenne/blob/26d8434d/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
----------------------------------------------------------------------
diff --git a/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java b/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
index c58d3d0..dfb9d8f 100644
--- a/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
+++ b/itests/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
@@ -147,16 +147,11 @@ public class CayenneGeneratorIntegrationTest {
     }
 
     private void assertContents(File f, String className, String packageName, String extendsName) throws Exception {
-
-        BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
-
-        try {
+        
+        try(BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f)))) {
             assertPackage(in, packageName);
             assertClass(in, className, extendsName);
-        } finally {
-            in.close();
-        }
-
+        } 
     }
 
     private void assertPackage(BufferedReader in, String packageName) throws Exception {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/26d8434d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
index 4b5e2fe..4466ce4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
@@ -22,7 +22,6 @@ package org.apache.cayenne.modeler.action;
 import java.awt.Frame;
 import java.awt.event.ActionEvent;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 
@@ -44,105 +43,90 @@ import org.apache.commons.logging.LogFactory;
 import org.xml.sax.InputSource;
 
 /**
- * Modeler action that imports a DataMap into a project from an arbitrary location.
+ * Modeler action that imports a DataMap into a project from an arbitrary
+ * location.
  * 
  * @since 1.1
  */
 public class ImportDataMapAction extends CayenneAction {
 
-    private static Log logObj = LogFactory.getLog(ImportDataMapAction.class);
-
-    public static String getActionName() {
-        return "Import DataMap";
-    }
-
-    public ImportDataMapAction(Application application) {
-        super(getActionName(), application);
-    }
-
-    public void performAction(ActionEvent e) {
-        importDataMap();
-    }
-
-    protected void importDataMap() {
-        File dataMapFile = selectDataMap(Application.getFrame());
-        if (dataMapFile == null) {
-            return;
-        }
-
-        DataMap newMap;
-
-        try {
-
-            URL url = dataMapFile.toURI().toURL();
-
-            InputStream in = url.openStream();
-
-            try {
-                InputSource inSrc = new InputSource(in);
-                inSrc.setSystemId(dataMapFile.getAbsolutePath());
-                newMap = new MapLoader().loadDataMap(inSrc);
-            }
-            finally {
-                try {
-                    in.close();
-                }
-                catch (IOException ioex) {
-                }
-            }
-
-            DataChannelDescriptor domain = (DataChannelDescriptor) getProjectController()
-                    .getProject()
-                    .getRootNode();
-
-            if (newMap.getName() != null) {
-                newMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, domain, newMap.getName()));
-            }
-            else {
-                newMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, domain));
-            }
-            
-            Resource baseResource = domain.getConfigurationSource();
-
-            if (baseResource != null) {
-                Resource dataMapResource = baseResource.getRelativeResource(newMap.getName());
-                newMap.setConfigurationSource(dataMapResource);
-            }
-
-            getProjectController().addDataMap(this, newMap);
-        }
-        catch (Exception ex) {
-            logObj.info("Error importing DataMap.", ex);
-            JOptionPane.showMessageDialog(
-                    Application.getFrame(),
-                    "Error reading DataMap: " + ex.getMessage(),
-                    "Can't Open DataMap",
-                    JOptionPane.OK_OPTION);
-        }
-    }
-
-    protected File selectDataMap(Frame f) {
-
-        // find start directory in preferences
-        FSPath lastDir = getApplication().getFrameController().getLastDirectory();
-
-        // configure dialog
-        JFileChooser chooser = new JFileChooser();
-        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
-        lastDir.updateChooser(chooser);
-
-        chooser.addChoosableFileFilter(FileFilters.getDataMapFilter());
-
-        int status = chooser.showDialog(f, "Select DataMap");
-        if (status == JFileChooser.APPROVE_OPTION) {
-            File file = chooser.getSelectedFile();
-
-            // save to preferences...
-            lastDir.updateFromChooser(chooser);
-
-            return file;
-        }
-
-        return null;
-    }
+	private static Log logObj = LogFactory.getLog(ImportDataMapAction.class);
+
+	public static String getActionName() {
+		return "Import DataMap";
+	}
+
+	public ImportDataMapAction(Application application) {
+		super(getActionName(), application);
+	}
+
+	public void performAction(ActionEvent e) {
+		importDataMap();
+	}
+
+	protected void importDataMap() {
+		File dataMapFile = selectDataMap(Application.getFrame());
+		if (dataMapFile == null) {
+			return;
+		}
+
+		DataMap newMap;
+
+		try {
+
+			URL url = dataMapFile.toURI().toURL();
+
+			try (InputStream in = url.openStream();) {
+				InputSource inSrc = new InputSource(in);
+				inSrc.setSystemId(dataMapFile.getAbsolutePath());
+				newMap = new MapLoader().loadDataMap(inSrc);
+			}
+
+			DataChannelDescriptor domain = (DataChannelDescriptor) getProjectController().getProject().getRootNode();
+
+			if (newMap.getName() != null) {
+				newMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, domain, newMap.getName()));
+			} else {
+				newMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, domain));
+			}
+
+			Resource baseResource = domain.getConfigurationSource();
+
+			if (baseResource != null) {
+				Resource dataMapResource = baseResource.getRelativeResource(newMap.getName());
+				newMap.setConfigurationSource(dataMapResource);
+			}
+
+			getProjectController().addDataMap(this, newMap);
+		} catch (Exception ex) {
+			logObj.info("Error importing DataMap.", ex);
+			JOptionPane.showMessageDialog(Application.getFrame(), "Error reading DataMap: " + ex.getMessage(),
+					"Can't Open DataMap", JOptionPane.OK_OPTION);
+		}
+	}
+
+	protected File selectDataMap(Frame f) {
+
+		// find start directory in preferences
+		FSPath lastDir = getApplication().getFrameController().getLastDirectory();
+
+		// configure dialog
+		JFileChooser chooser = new JFileChooser();
+		chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+		lastDir.updateChooser(chooser);
+
+		chooser.addChoosableFileFilter(FileFilters.getDataMapFilter());
+
+		int status = chooser.showDialog(f, "Select DataMap");
+		if (status == JFileChooser.APPROVE_OPTION) {
+			File file = chooser.getSelectedFile();
+
+			// save to preferences...
+			lastDir.updateFromChooser(chooser);
+
+			return file;
+		}
+
+		return null;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/26d8434d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
index f5060cb..3ca4a9f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
@@ -37,201 +37,188 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 
 /**
- * A subclass of ConnectionWizard that tests configured DataSource, but does not keep an
- * open connection.
+ * A subclass of ConnectionWizard that tests configured DataSource, but does not
+ * keep an open connection.
  * 
  */
 public class DataSourceWizard extends CayenneController {
 
-    protected DataSourceWizardView view;
-
-    protected DBConnectionInfo altDataSource;
-    protected String altDataSourceKey;
-    protected ObjectBinding dataSourceBinding;
-    protected Map dataSources;
-
-    protected String dataSourceKey;
-
-    // this object is a clone of an object selected from the dropdown, as we need to allow
-    // local temporary modifications
-    protected DBConnectionInfo connectionInfo;
-
-    protected boolean canceled;
-
-    public DataSourceWizard(CayenneController parent, String title,
-            String altDataSourceKey, DBConnectionInfo altDataSource) {
-        super(parent);
-
-        this.view = createView();
-        this.view.setTitle(title);
-        this.altDataSource = altDataSource;
-        this.altDataSourceKey = altDataSourceKey;
-        this.connectionInfo = new DBConnectionInfo();
-        
-        initBindings();
-    }
-
-    /**
-     * Creates swing dialog for this wizard
-     */
-    protected DataSourceWizardView createView() {
-        return new DataSourceWizardView(this);
-    }
-
-    protected void initBindings() {
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        dataSourceBinding = builder.bindToComboSelection(
-                view.getDataSources(),
-                "dataSourceKey");
-
-        builder.bindToAction(view.getCancelButton(), "cancelAction()");
-        builder.bindToAction(view.getOkButton(), "okAction()");
-        builder.bindToAction(view.getConfigButton(), "dataSourceConfigAction()");
-    }
-
-    public String getDataSourceKey() {
-        return dataSourceKey;
-    }
-
-    public void setDataSourceKey(String dataSourceKey) {
-        this.dataSourceKey = dataSourceKey;
-
-        // update a clone object that will be used to obtain connection...
-        DBConnectionInfo currentInfo = (DBConnectionInfo) dataSources.get(dataSourceKey);
-        if (currentInfo != null) {
-            currentInfo.copyTo(connectionInfo);
-        }
-        else {
-            connectionInfo = new DBConnectionInfo();
-        }
-
-        view.getConnectionInfo().setConnectionInfo(connectionInfo);
-    }
-
-    /**
-     * Main action method that pops up a dialog asking for user selection. Returns true if
-     * the selection was confirmed, false - if canceled.
-     */
-    public boolean startupAction() {
-        this.canceled = true;
-
-        refreshDataSources();
-
-        view.pack();
-        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-        view.setModal(true);
-        makeCloseableOnEscape();
-        centerView();
-        view.setVisible(true);
-
-        return !canceled;
-    }
-
-    public DBConnectionInfo getConnectionInfo() {
-        return connectionInfo;
-    }
-
-    /**
-     * Tests that the entered information is valid and can be used to open a conneciton.
-     * Does not store the open connection.
-     */
-    public void okAction() {
-        DBConnectionInfo info = getConnectionInfo();
-        ClassLoadingService classLoader = getApplication().getClassLoadingService();
-
-        // try making an adapter...
-        try {
-            info.makeAdapter(classLoader);
-        }
-        catch (Throwable th) {
-            reportError("DbAdapter Error", th);
-            return;
-        }
-
-        // doing connection testing...
-        // attempt opening the connection, and close it right away
-        try {
-            Connection connection = info.makeDataSource(classLoader).getConnection();
-            try {
-                connection.close();
-            }
-            catch (SQLException ex) {
-                // ignore close error
-            }
-        }
-        catch (Throwable th) {
-            reportError("Connection Error", th);
-            return;
-        }
-
-        // set success flag, and unblock the caller...
-        canceled = false;
-        view.dispose();
-    }
-
-    public void cancelAction() {
-        canceled = true;
-        view.dispose();
-    }
-
-    /**
-     * Opens preferences panel to allow configuration of DataSource presets.
-     */
-    public void dataSourceConfigAction() {
-        PreferenceDialog prefs = new PreferenceDialog(this);
-        prefs.showDataSourceEditorAction(dataSourceKey);
-        refreshDataSources();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    protected void refreshDataSources() {
-        this.dataSources = getApplication()
-                .getCayenneProjectPreferences()
-                .getDetailObject(DBConnectionInfo.class)
-                .getChildrenPreferences();
-
-        // 1.2 migration fix - update data source adapter names
-        Iterator it = dataSources.values().iterator();
-
-        final String _12package = "org.objectstyle.cayenne.";
-        while (it.hasNext()) {
-            DBConnectionInfo info = (DBConnectionInfo) it.next();
-            if (info.getDbAdapter() != null && info.getDbAdapter().startsWith(_12package)) {
-                info.setDbAdapter("org.apache.cayenne."
-                        + info.getDbAdapter().substring(_12package.length()));
-
-               // info.getObjectContext().commitChanges();
-            }
-        }
-
-        if (altDataSourceKey != null
-                && !dataSources.containsKey(altDataSourceKey)
-                && altDataSource != null) {
-            dataSources.put(altDataSourceKey, altDataSource);
-        }
-
-        Object[] keys = dataSources.keySet().toArray();
-        Arrays.sort(keys);
-        view.getDataSources().setModel(new DefaultComboBoxModel(keys));
-
-        if (getDataSourceKey() == null) {
-            String key = null;
-
-            if (altDataSourceKey != null) {
-                key = altDataSourceKey;
-            }
-            else if (keys.length > 0) {
-                key = keys[0].toString();
-            }
-
-            setDataSourceKey(key);
-            dataSourceBinding.updateView();
-        }
-    }
+	protected DataSourceWizardView view;
+
+	protected DBConnectionInfo altDataSource;
+	protected String altDataSourceKey;
+	protected ObjectBinding dataSourceBinding;
+	protected Map dataSources;
+
+	protected String dataSourceKey;
+
+	// this object is a clone of an object selected from the dropdown, as we
+	// need to allow
+	// local temporary modifications
+	protected DBConnectionInfo connectionInfo;
+
+	protected boolean canceled;
+
+	public DataSourceWizard(CayenneController parent, String title, String altDataSourceKey,
+			DBConnectionInfo altDataSource) {
+		super(parent);
+
+		this.view = createView();
+		this.view.setTitle(title);
+		this.altDataSource = altDataSource;
+		this.altDataSourceKey = altDataSourceKey;
+		this.connectionInfo = new DBConnectionInfo();
+
+		initBindings();
+	}
+
+	/**
+	 * Creates swing dialog for this wizard
+	 */
+	protected DataSourceWizardView createView() {
+		return new DataSourceWizardView(this);
+	}
+
+	protected void initBindings() {
+		BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
+
+		dataSourceBinding = builder.bindToComboSelection(view.getDataSources(), "dataSourceKey");
+
+		builder.bindToAction(view.getCancelButton(), "cancelAction()");
+		builder.bindToAction(view.getOkButton(), "okAction()");
+		builder.bindToAction(view.getConfigButton(), "dataSourceConfigAction()");
+	}
+
+	public String getDataSourceKey() {
+		return dataSourceKey;
+	}
+
+	public void setDataSourceKey(String dataSourceKey) {
+		this.dataSourceKey = dataSourceKey;
+
+		// update a clone object that will be used to obtain connection...
+		DBConnectionInfo currentInfo = (DBConnectionInfo) dataSources.get(dataSourceKey);
+		if (currentInfo != null) {
+			currentInfo.copyTo(connectionInfo);
+		} else {
+			connectionInfo = new DBConnectionInfo();
+		}
+
+		view.getConnectionInfo().setConnectionInfo(connectionInfo);
+	}
+
+	/**
+	 * Main action method that pops up a dialog asking for user selection.
+	 * Returns true if the selection was confirmed, false - if canceled.
+	 */
+	public boolean startupAction() {
+		this.canceled = true;
+
+		refreshDataSources();
+
+		view.pack();
+		view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+		view.setModal(true);
+		makeCloseableOnEscape();
+		centerView();
+		view.setVisible(true);
+
+		return !canceled;
+	}
+
+	public DBConnectionInfo getConnectionInfo() {
+		return connectionInfo;
+	}
+
+	/**
+	 * Tests that the entered information is valid and can be used to open a
+	 * conneciton. Does not store the open connection.
+	 */
+	public void okAction() {
+		DBConnectionInfo info = getConnectionInfo();
+		ClassLoadingService classLoader = getApplication().getClassLoadingService();
+
+		// try making an adapter...
+		try {
+			info.makeAdapter(classLoader);
+		} catch (Throwable th) {
+			reportError("DbAdapter Error", th);
+			return;
+		}
+
+		// doing connection testing...
+		// attempt opening the connection, and close it right away
+		try {
+
+			try (Connection connection = info.makeDataSource(classLoader).getConnection();) {
+				//
+			} catch (SQLException ex) {
+				// ignore close error
+			}
+		} catch (Throwable th) {
+			reportError("Connection Error", th);
+			return;
+		}
+
+		// set success flag, and unblock the caller...
+		canceled = false;
+		view.dispose();
+	}
+
+	public void cancelAction() {
+		canceled = true;
+		view.dispose();
+	}
+
+	/**
+	 * Opens preferences panel to allow configuration of DataSource presets.
+	 */
+	public void dataSourceConfigAction() {
+		PreferenceDialog prefs = new PreferenceDialog(this);
+		prefs.showDataSourceEditorAction(dataSourceKey);
+		refreshDataSources();
+	}
+
+	public Component getView() {
+		return view;
+	}
+
+	protected void refreshDataSources() {
+		this.dataSources = getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
+				.getChildrenPreferences();
+
+		// 1.2 migration fix - update data source adapter names
+		Iterator it = dataSources.values().iterator();
+
+		final String _12package = "org.objectstyle.cayenne.";
+		while (it.hasNext()) {
+			DBConnectionInfo info = (DBConnectionInfo) it.next();
+			if (info.getDbAdapter() != null && info.getDbAdapter().startsWith(_12package)) {
+				info.setDbAdapter("org.apache.cayenne." + info.getDbAdapter().substring(_12package.length()));
+
+				// info.getObjectContext().commitChanges();
+			}
+		}
+
+		if (altDataSourceKey != null && !dataSources.containsKey(altDataSourceKey) && altDataSource != null) {
+			dataSources.put(altDataSourceKey, altDataSource);
+		}
+
+		Object[] keys = dataSources.keySet().toArray();
+		Arrays.sort(keys);
+		view.getDataSources().setModel(new DefaultComboBoxModel(keys));
+
+		if (getDataSourceKey() == null) {
+			String key = null;
+
+			if (altDataSourceKey != null) {
+				key = altDataSourceKey;
+			} else if (keys.length > 0) {
+				key = keys[0].toString();
+			}
+
+			setDataSourceKey(key);
+			dataSourceBinding.updateView();
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/26d8434d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
index e10d373..19c031c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
@@ -271,10 +271,10 @@ public class DataSourcePreferences extends CayenneController {
 
 			// connect via Cayenne DriverDataSource - it addresses some driver
 			// issues...
-			Connection c = new DriverDataSource(driver, currentDataSource.getUrl(), currentDataSource.getUserName(),
-					currentDataSource.getPassword()).getConnection();
-			try {
-				c.close();
+
+			try (Connection c = new DriverDataSource(driver, currentDataSource.getUrl(),
+					currentDataSource.getUserName(), currentDataSource.getPassword()).getConnection();) {
+				// do nothing...
 			} catch (SQLException e) {
 				// i guess we can ignore this...
 			}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/26d8434d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/SaveAsImageAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/SaveAsImageAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/SaveAsImageAction.java
index 5815e6d..18d285a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/SaveAsImageAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/SaveAsImageAction.java
@@ -41,68 +41,60 @@ import org.jgraph.JGraph;
  * Action for saving graph as image
  */
 public class SaveAsImageAction extends CayenneAction {
-    private static final Log logObj = LogFactory.getLog(SaveAsImageAction.class);
-    
-    private final DataDomainGraphTab dataDomainGraphTab;
-    
-    public SaveAsImageAction(DataDomainGraphTab dataDomainGraphTab, Application application) {
-        super("Save As Image", application);
-        this.dataDomainGraphTab = dataDomainGraphTab;
-        setEnabled(true);
-    }
-    
-    @Override
-    public String getIconName() {
-        return "icon-save-as-image.png";
-    }
-    
-    @Override
-    public void performAction(ActionEvent e) {
-        // find start directory in preferences
-        FSPath lastDir = getApplication().getFrameController().getLastDirectory();
-
-        // configure dialog
-        JFileChooser chooser = new JFileChooser();
-        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
-        lastDir.updateChooser(chooser);
-        
-        chooser.setAcceptAllFileFilterUsed(false);
-        
-        String ext = "png";
-        chooser.addChoosableFileFilter(FileFilters.getExtensionFileFilter(ext, "PNG Images"));
-        
-        int status = chooser.showSaveDialog(Application.getFrame());
-        if (status == JFileChooser.APPROVE_OPTION) {
-            lastDir.updateFromChooser(chooser);
-            
-            String path = chooser.getSelectedFile().getPath();
-            if (!path.endsWith("." + ext)) {
-                path += "." + ext;
-            }
-            
-            try {                
-                OutputStream out = new FileOutputStream(path);
-                
-                JGraph graph = dataDomainGraphTab.getGraph();
-                BufferedImage img = graph.getImage(null, 0);
-                
-                try {
-                    ImageIO.write(img, ext, out);
-                    out.flush();
-                }
-                finally {
-                    out.close();
-                }
-            }
-            catch (IOException ex) {
-                logObj.error("Could not save image", ex);
-                JOptionPane.showMessageDialog(
-                        Application.getFrame(),
-                        "Could not save image.",
-                        "Error saving image",
-                        JOptionPane.ERROR_MESSAGE
-                );
-            }
-        }
-    }
+	private static final Log logObj = LogFactory.getLog(SaveAsImageAction.class);
+
+	private final DataDomainGraphTab dataDomainGraphTab;
+
+	public SaveAsImageAction(DataDomainGraphTab dataDomainGraphTab, Application application) {
+		super("Save As Image", application);
+		this.dataDomainGraphTab = dataDomainGraphTab;
+		setEnabled(true);
+	}
+
+	@Override
+	public String getIconName() {
+		return "icon-save-as-image.png";
+	}
+
+	@Override
+	public void performAction(ActionEvent e) {
+		// find start directory in preferences
+		FSPath lastDir = getApplication().getFrameController().getLastDirectory();
+
+		// configure dialog
+		JFileChooser chooser = new JFileChooser();
+		chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+		lastDir.updateChooser(chooser);
+
+		chooser.setAcceptAllFileFilterUsed(false);
+
+		String ext = "png";
+		chooser.addChoosableFileFilter(FileFilters.getExtensionFileFilter(ext, "PNG Images"));
+
+		int status = chooser.showSaveDialog(Application.getFrame());
+		if (status == JFileChooser.APPROVE_OPTION) {
+			lastDir.updateFromChooser(chooser);
+
+			String path = chooser.getSelectedFile().getPath();
+			if (!path.endsWith("." + ext)) {
+				path += "." + ext;
+			}
+
+			try {
+
+				JGraph graph = dataDomainGraphTab.getGraph();
+				BufferedImage img = graph.getImage(null, 0);
+
+				try (OutputStream out = new FileOutputStream(path);) {
+					ImageIO.write(img, ext, out);
+					out.flush();
+				}
+
+			} catch (IOException ex) {
+				logObj.error("Could not save image", ex);
+				JOptionPane.showMessageDialog(Application.getFrame(), "Could not save image.", "Error saving image",
+						JOptionPane.ERROR_MESSAGE);
+			}
+		}
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/26d8434d/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelHelper.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelHelper.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelHelper.java
index 1925eaf..b78b068 100644
--- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelHelper.java
+++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelHelper.java
@@ -36,428 +36,403 @@ import org.apache.cayenne.wocompat.parser.Parser;
 import org.apache.commons.collections.IteratorUtils;
 
 /**
- * Helper class used by EOModelProcessor. EOModelHelper loads an EOModel from the
- * specified location and gives its users access to the untyped EOModel information.
+ * Helper class used by EOModelProcessor. EOModelHelper loads an EOModel from
+ * the specified location and gives its users access to the untyped EOModel
+ * information.
  */
 public class EOModelHelper {
 
-    private Parser plistParser = new Parser();
-    protected URL modelUrl;
-    protected Map entityIndex;
-    protected Map entityClassIndex;
-    protected Map entityQueryIndex;
-    protected Map entityClientClassIndex;
-    protected DataMap dataMap;
-    private Map prototypeValues;
-
-    /**
-     * Creates helper instance and tries to locate EOModel and load index file.
-     * 
-     * @deprecated since 4.0, use {@link #EOModelHelper(URL)}.
-     */
-    @Deprecated
-    public EOModelHelper(String path) throws Exception {
-        this(new File(path).toURI().toURL());
-    }
-
-    public EOModelHelper(URL modelUrl) throws Exception {
-
-        this.modelUrl = modelUrl;
-        this.dataMap = new DataMap(findModelName(modelUrl.toExternalForm()));
-
-        // load index file
-        List modelIndex = (List) loadModelIndex().get("entities");
-
-        // load entity indices
-        entityIndex = new HashMap();
-        entityClassIndex = new HashMap();
-        entityClientClassIndex = new HashMap();
-        entityQueryIndex = new HashMap();
-
-        Iterator it = modelIndex.iterator();
-        while (it.hasNext()) {
-            Map info = (Map) it.next();
-            String name = (String) info.get("name");
-
-            entityIndex.put(name, loadEntityIndex(name));
-            entityQueryIndex.put(name, loadQueryIndex(name));
-            entityClassIndex.put(name, info.get("className"));
-            Map entityPlistMap = entityPListMap(name);
-
-            // get client class information
-            Map internalInfo = (Map) entityPlistMap.get("internalInfo");
-
-            if (internalInfo != null) {
-                String clientClassName = (String) internalInfo
-                        .get("_javaClientClassName");
-                entityClientClassIndex.put(name, clientClassName);
-            }
-        }
-
-        it = modelIndex.iterator();
-        while (it.hasNext()) {
-            Map info = (Map) it.next();
-            String name = (String) info.get("name");
-            Map entityPlistMap = entityPListMap(name);
-            List classProperties = (List) entityPlistMap.get("classProperties");
-            if (classProperties == null) {
-                classProperties = Collections.EMPTY_LIST;
-            }
-
-            // get client class information
-            Map internalInfo = (Map) entityPlistMap.get("internalInfo");
-
-            List clientClassProperties = (internalInfo != null) ? (List) internalInfo
-                    .get("_clientClassPropertyNames") : null;
-
-            // guard against no internal info and no client class properties
-            if (clientClassProperties == null) {
-                clientClassProperties = Collections.EMPTY_LIST;
-            }
-
-            // there is a bug in EOModeler it sometimes keeps outdated properties in
-            // the client property list. This removes them
-            clientClassProperties.retainAll(classProperties);
-
-            // remove all properties from the entity properties that are already defined
-            // in
-            // a potential parent class.
-            String parentEntity = (String) entityPlistMap.get("parent");
-            while (parentEntity != null) {
-                Map parentEntityPListMap = entityPListMap(parentEntity);
-                List parentClassProps = (List) parentEntityPListMap
-                        .get("classProperties");
-                classProperties.removeAll(parentClassProps);
-                // get client class information of parent
-                Map parentInternalInfo = (Map) parentEntityPListMap.get("internalInfo");
-
-                if (parentInternalInfo != null) {
-                    List parentClientClassProps = (List) parentInternalInfo
-                            .get("_clientClassPropertyNames");
-                    clientClassProperties.removeAll(parentClientClassProps);
-                }
-
-                parentEntity = (String) parentEntityPListMap.get("parent");
-            }
-
-            // put back processed properties to the map
-            entityPlistMap.put("classProperties", classProperties);
-            // add client classes directly for easier access
-            entityPlistMap.put("clientClassProperties", clientClassProperties);
-        }
-    }
-
-    /**
-     * Performs Objective C data types conversion to Java types.
-     * 
-     * @since 1.1
-     * @return String representation for Java type corresponding to String representation
-     *         of Objective C type.
-     */
-    public String javaTypeForEOModelerType(String valueClassName, String valueType) {
-        if (valueClassName == null) {
-            return null;
-        }
-
-        if (valueClassName.equals("NSString")) {
-            return String.class.getName();
-        }
-
-        if (valueClassName.equals("NSNumber")) {
-            Class numericClass = numericAttributeClass(valueType);
-            return (numericClass != null) ? numericClass.getName() : Number.class
-                    .getName();
-        }
-
-        if (valueClassName.equals("NSCalendarDate"))
-            return "java.sql.Timestamp";
-
-        if (valueClassName.equals("NSDecimalNumber")) {
-            Class numericClass = numericAttributeClass(valueType);
-            return (numericClass != null) ? numericClass.getName() : BigDecimal.class
-                    .getName();
-        }
-
-        if (valueClassName.equals("NSData"))
-            return "byte[]";
-
-        // don't know what the class is mapped to...
-        // do some minimum sanity check and use as is
-        try {
-            return Class.forName(valueClassName).getName();
-        }
-        catch (ClassNotFoundException aClassNotFoundException) {
-            try {
-                return Class.forName("java.lang." + valueClassName).getName();
-            }
-            catch (ClassNotFoundException anotherClassNotFoundException) {
-                try {
-                    return Class.forName("java.util." + valueClassName).getName();
-                }
-                catch (ClassNotFoundException yetAnotherClassNotFoundException) {
-                    try {
-                        return ClassLoader
-                                .getSystemClassLoader()
-                                .loadClass(valueClassName)
-                                .getName();
-                    }
-                    catch (ClassNotFoundException e) {
-                        // likely a custom class
-                        return valueClassName;
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @since 1.1
-     */
-    // TODO: create a lookup map, maybe XML-loaded...
-    protected Class numericAttributeClass(String valueType) {
-        if (valueType == null) {
-            return null;
-        }
-        else if ("b".equals(valueType)) {
-            return Byte.class;
-        }
-        else if ("s".equals(valueType)) {
-            return Short.class;
-        }
-        else if ("i".equals(valueType)) {
-            return Integer.class;
-        }
-        else if ("l".equals(valueType)) {
-            return Long.class;
-        }
-        else if ("f".equals(valueType)) {
-            return Float.class;
-        }
-        else if ("d".equals(valueType)) {
-            return Double.class;
-        }
-        else if ("B".equals(valueType)) {
-            return BigDecimal.class;
-        }
-        else if ("c".equals(valueType)) {
-            return Boolean.class;
-        }
-        else {
-            return null;
-        }
-    }
-
-    /** Returns a DataMap associated with this helper. */
-    public DataMap getDataMap() {
-        return dataMap;
-    }
-
-    /** Returns EOModel location as URL. */
-    public URL getModelUrl() {
-        return modelUrl;
-    }
-
-    /**
-     * Returns an iterator of model names.
-     */
-    public Iterator modelNames() {
-        return entityClassIndex.keySet().iterator();
-    }
-
-    /**
-     * Returns a list of model entity names.
-     * 
-     * @since 1.1
-     */
-    public List modelNamesAsList() {
-        return new ArrayList(entityClassIndex.keySet());
-    }
-
-    public Map getPrototypeAttributeMapFor(String aPrototypeAttributeName) {
-        if (prototypeValues == null) {
-
-            Map eoPrototypesEntityMap = this.entityPListMap("EOPrototypes");
-
-            // no prototypes
-            if (eoPrototypesEntityMap == null) {
-                prototypeValues = Collections.EMPTY_MAP;
-            }
-            else {
-                List eoPrototypeAttributes = (List) eoPrototypesEntityMap
-                        .get("attributes");
-
-                prototypeValues = new HashMap();
-                Iterator it = eoPrototypeAttributes.iterator();
-                while (it.hasNext()) {
-                    Map attrMap = (Map) it.next();
-
-                    String attrName = (String) attrMap.get("name");
-
-                    // TODO: why are we copying the original map? can we just use it as
-                    // is?
-                    Map prototypeAttrMap = new HashMap();
-                    prototypeValues.put(attrName, prototypeAttrMap);
-
-                    prototypeAttrMap.put("name", attrMap.get("name"));
-                    prototypeAttrMap.put("prototypeName", attrMap.get("prototypeName"));
-                    prototypeAttrMap.put("columnName", attrMap.get("columnName"));
-                    prototypeAttrMap.put("valueClassName", attrMap.get("valueClassName"));
-                    prototypeAttrMap.put("width", attrMap.get("width"));
-                    prototypeAttrMap.put("allowsNull", attrMap.get("allowsNull"));
-                    prototypeAttrMap.put("scale", attrMap.get("scale"));
-                    prototypeAttrMap.put("valueType", attrMap.get("valueType"));
-                }
-            }
-        }
-
-        Map aMap = (Map) prototypeValues.get(aPrototypeAttributeName);
-        if (null == aMap)
-            aMap = Collections.EMPTY_MAP;
-
-        return aMap;
-    }
-
-    /** Returns an info map for the entity called <code>entityName</code>. */
-    public Map entityPListMap(String entityName) {
-        return (Map) entityIndex.get(entityName);
-    }
-
-    /**
-     * Returns the iterator over EOFetchSpecification names for a given entity.
-     * 
-     * @since 1.1
-     */
-    public Iterator queryNames(String entityName) {
-        Map queryPlist = (Map) entityQueryIndex.get(entityName);
-        if (queryPlist == null || queryPlist.isEmpty()) {
-            return IteratorUtils.EMPTY_ITERATOR;
-        }
-
-        return queryPlist.keySet().iterator();
-    }
-
-    /**
-     * Returns a map containing EOFetchSpecification information for entity name and query
-     * name. Returns null if no such query is found.
-     * 
-     * @since 1.1
-     */
-    public Map queryPListMap(String entityName, String queryName) {
-        Map queryPlist = (Map) entityQueryIndex.get(entityName);
-        if (queryPlist == null || queryPlist.isEmpty()) {
-            return null;
-        }
-
-        return (Map) queryPlist.get(queryName);
-    }
-
-    public String entityClass(String entityName, boolean getClientClass) {
-        if (getClientClass) {
-            return (String) entityClientClassIndex.get(entityName);
-        }
-        else {
-            return (String) entityClassIndex.get(entityName);
-        }
-    }
-
-    /** Loads EOModel index and returns it as a map. */
-    protected Map loadModelIndex() throws Exception {
-        InputStream indexIn = openIndexStream();
-        try {
-            plistParser.ReInit(indexIn);
-            return (Map) plistParser.propertyList();
-        }
-        finally {
-            indexIn.close();
-        }
-    }
-
-    /**
-     * Loads EOEntity information and returns it as a map.
-     */
-    protected Map loadEntityIndex(String entityName) throws Exception {
-        InputStream entIn = openEntityStream(entityName);
-        try {
-            plistParser.ReInit(entIn);
-            return (Map) plistParser.propertyList();
-        }
-        finally {
-            entIn.close();
-        }
-    }
-
-    /**
-     * Loads EOFetchSpecification information and returns it as a map.
-     */
-    protected Map loadQueryIndex(String entityName) throws Exception {
-        InputStream queryIn = null;
-
-        // catch file open exceptions since not all entities have query files....
-        try {
-            queryIn = openQueryStream(entityName);
-        }
-        catch (IOException ioex) {
-            return Collections.EMPTY_MAP;
-        }
-
-        try {
-            plistParser.ReInit(queryIn);
-            return (Map) plistParser.propertyList();
-        }
-        finally {
-            queryIn.close();
-        }
-    }
-
-    /** Returns EOModel name based on its path. */
-    protected String findModelName(String path) {
-        // strip trailing slashes
-        if (path.endsWith("/") || path.endsWith("\\")) {
-            path = path.substring(0, path.length() - 1);
-        }
-
-        // strip path components
-        int i1 = path.lastIndexOf("/");
-        int i2 = path.lastIndexOf("\\");
-        int i = (i1 > i2) ? i1 : i2;
-        if (i >= 0) {
-            path = path.substring(i + 1);
-        }
-
-        // strip .eomodeld suffix
-        if (path.endsWith(".eomodeld")) {
-            path = path.substring(0, path.length() - ".eomodeld".length());
-        }
-
-        return path;
-    }
-
-    /**
-     * Returns InputStream to read an EOModel index file.
-     */
-    protected InputStream openIndexStream() throws Exception {
-        return new URL(modelUrl, "index.eomodeld").openStream();
-    }
-
-    /**
-     * Returns InputStream to read an EOEntity plist file.
-     * 
-     * @param entityName name of EOEntity to be loaded.
-     * @return InputStream to read an EOEntity plist file or null if
-     *         <code>entityname.plist</code> file can not be located.
-     */
-    protected InputStream openEntityStream(String entityName) throws Exception {
-        return new URL(modelUrl, entityName + ".plist").openStream();
-    }
-
-    /**
-     * Returns InputStream to read an EOFetchSpecification plist file.
-     * 
-     * @param entityName name of EOEntity to be loaded.
-     * @return InputStream to read an EOEntity plist file or null if
-     *         <code>entityname.plist</code> file can not be located.
-     */
-    protected InputStream openQueryStream(String entityName) throws Exception {
-        return new URL(modelUrl, entityName + ".fspec").openStream();
-    }
+	private Parser plistParser = new Parser();
+	protected URL modelUrl;
+	protected Map entityIndex;
+	protected Map entityClassIndex;
+	protected Map entityQueryIndex;
+	protected Map entityClientClassIndex;
+	protected DataMap dataMap;
+	private Map prototypeValues;
+
+	/**
+	 * Creates helper instance and tries to locate EOModel and load index file.
+	 * 
+	 * @deprecated since 4.0, use {@link #EOModelHelper(URL)}.
+	 */
+	@Deprecated
+	public EOModelHelper(String path) throws Exception {
+		this(new File(path).toURI().toURL());
+	}
+
+	public EOModelHelper(URL modelUrl) throws Exception {
+
+		this.modelUrl = modelUrl;
+		this.dataMap = new DataMap(findModelName(modelUrl.toExternalForm()));
+
+		// load index file
+		List modelIndex = (List) loadModelIndex().get("entities");
+
+		// load entity indices
+		entityIndex = new HashMap();
+		entityClassIndex = new HashMap();
+		entityClientClassIndex = new HashMap();
+		entityQueryIndex = new HashMap();
+
+		Iterator it = modelIndex.iterator();
+		while (it.hasNext()) {
+			Map info = (Map) it.next();
+			String name = (String) info.get("name");
+
+			entityIndex.put(name, loadEntityIndex(name));
+			entityQueryIndex.put(name, loadQueryIndex(name));
+			entityClassIndex.put(name, info.get("className"));
+			Map entityPlistMap = entityPListMap(name);
+
+			// get client class information
+			Map internalInfo = (Map) entityPlistMap.get("internalInfo");
+
+			if (internalInfo != null) {
+				String clientClassName = (String) internalInfo.get("_javaClientClassName");
+				entityClientClassIndex.put(name, clientClassName);
+			}
+		}
+
+		it = modelIndex.iterator();
+		while (it.hasNext()) {
+			Map info = (Map) it.next();
+			String name = (String) info.get("name");
+			Map entityPlistMap = entityPListMap(name);
+			List classProperties = (List) entityPlistMap.get("classProperties");
+			if (classProperties == null) {
+				classProperties = Collections.EMPTY_LIST;
+			}
+
+			// get client class information
+			Map internalInfo = (Map) entityPlistMap.get("internalInfo");
+
+			List clientClassProperties = (internalInfo != null) ? (List) internalInfo.get("_clientClassPropertyNames")
+					: null;
+
+			// guard against no internal info and no client class properties
+			if (clientClassProperties == null) {
+				clientClassProperties = Collections.EMPTY_LIST;
+			}
+
+			// there is a bug in EOModeler it sometimes keeps outdated
+			// properties in
+			// the client property list. This removes them
+			clientClassProperties.retainAll(classProperties);
+
+			// remove all properties from the entity properties that are already
+			// defined
+			// in
+			// a potential parent class.
+			String parentEntity = (String) entityPlistMap.get("parent");
+			while (parentEntity != null) {
+				Map parentEntityPListMap = entityPListMap(parentEntity);
+				List parentClassProps = (List) parentEntityPListMap.get("classProperties");
+				classProperties.removeAll(parentClassProps);
+				// get client class information of parent
+				Map parentInternalInfo = (Map) parentEntityPListMap.get("internalInfo");
+
+				if (parentInternalInfo != null) {
+					List parentClientClassProps = (List) parentInternalInfo.get("_clientClassPropertyNames");
+					clientClassProperties.removeAll(parentClientClassProps);
+				}
+
+				parentEntity = (String) parentEntityPListMap.get("parent");
+			}
+
+			// put back processed properties to the map
+			entityPlistMap.put("classProperties", classProperties);
+			// add client classes directly for easier access
+			entityPlistMap.put("clientClassProperties", clientClassProperties);
+		}
+	}
+
+	/**
+	 * Performs Objective C data types conversion to Java types.
+	 * 
+	 * @since 1.1
+	 * @return String representation for Java type corresponding to String
+	 *         representation of Objective C type.
+	 */
+	public String javaTypeForEOModelerType(String valueClassName, String valueType) {
+		if (valueClassName == null) {
+			return null;
+		}
+
+		if (valueClassName.equals("NSString")) {
+			return String.class.getName();
+		}
+
+		if (valueClassName.equals("NSNumber")) {
+			Class numericClass = numericAttributeClass(valueType);
+			return (numericClass != null) ? numericClass.getName() : Number.class.getName();
+		}
+
+		if (valueClassName.equals("NSCalendarDate"))
+			return "java.sql.Timestamp";
+
+		if (valueClassName.equals("NSDecimalNumber")) {
+			Class numericClass = numericAttributeClass(valueType);
+			return (numericClass != null) ? numericClass.getName() : BigDecimal.class.getName();
+		}
+
+		if (valueClassName.equals("NSData"))
+			return "byte[]";
+
+		// don't know what the class is mapped to...
+		// do some minimum sanity check and use as is
+		try {
+			return Class.forName(valueClassName).getName();
+		} catch (ClassNotFoundException aClassNotFoundException) {
+			try {
+				return Class.forName("java.lang." + valueClassName).getName();
+			} catch (ClassNotFoundException anotherClassNotFoundException) {
+				try {
+					return Class.forName("java.util." + valueClassName).getName();
+				} catch (ClassNotFoundException yetAnotherClassNotFoundException) {
+					try {
+						return ClassLoader.getSystemClassLoader().loadClass(valueClassName).getName();
+					} catch (ClassNotFoundException e) {
+						// likely a custom class
+						return valueClassName;
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * @since 1.1
+	 */
+	// TODO: create a lookup map, maybe XML-loaded...
+	protected Class numericAttributeClass(String valueType) {
+		if (valueType == null) {
+			return null;
+		} else if ("b".equals(valueType)) {
+			return Byte.class;
+		} else if ("s".equals(valueType)) {
+			return Short.class;
+		} else if ("i".equals(valueType)) {
+			return Integer.class;
+		} else if ("l".equals(valueType)) {
+			return Long.class;
+		} else if ("f".equals(valueType)) {
+			return Float.class;
+		} else if ("d".equals(valueType)) {
+			return Double.class;
+		} else if ("B".equals(valueType)) {
+			return BigDecimal.class;
+		} else if ("c".equals(valueType)) {
+			return Boolean.class;
+		} else {
+			return null;
+		}
+	}
+
+	/** Returns a DataMap associated with this helper. */
+	public DataMap getDataMap() {
+		return dataMap;
+	}
+
+	/** Returns EOModel location as URL. */
+	public URL getModelUrl() {
+		return modelUrl;
+	}
+
+	/**
+	 * Returns an iterator of model names.
+	 */
+	public Iterator modelNames() {
+		return entityClassIndex.keySet().iterator();
+	}
+
+	/**
+	 * Returns a list of model entity names.
+	 * 
+	 * @since 1.1
+	 */
+	public List modelNamesAsList() {
+		return new ArrayList(entityClassIndex.keySet());
+	}
+
+	public Map getPrototypeAttributeMapFor(String aPrototypeAttributeName) {
+		if (prototypeValues == null) {
+
+			Map eoPrototypesEntityMap = this.entityPListMap("EOPrototypes");
+
+			// no prototypes
+			if (eoPrototypesEntityMap == null) {
+				prototypeValues = Collections.EMPTY_MAP;
+			} else {
+				List eoPrototypeAttributes = (List) eoPrototypesEntityMap.get("attributes");
+
+				prototypeValues = new HashMap();
+				Iterator it = eoPrototypeAttributes.iterator();
+				while (it.hasNext()) {
+					Map attrMap = (Map) it.next();
+
+					String attrName = (String) attrMap.get("name");
+
+					// TODO: why are we copying the original map? can we just
+					// use it as
+					// is?
+					Map prototypeAttrMap = new HashMap();
+					prototypeValues.put(attrName, prototypeAttrMap);
+
+					prototypeAttrMap.put("name", attrMap.get("name"));
+					prototypeAttrMap.put("prototypeName", attrMap.get("prototypeName"));
+					prototypeAttrMap.put("columnName", attrMap.get("columnName"));
+					prototypeAttrMap.put("valueClassName", attrMap.get("valueClassName"));
+					prototypeAttrMap.put("width", attrMap.get("width"));
+					prototypeAttrMap.put("allowsNull", attrMap.get("allowsNull"));
+					prototypeAttrMap.put("scale", attrMap.get("scale"));
+					prototypeAttrMap.put("valueType", attrMap.get("valueType"));
+				}
+			}
+		}
+
+		Map aMap = (Map) prototypeValues.get(aPrototypeAttributeName);
+		if (null == aMap)
+			aMap = Collections.EMPTY_MAP;
+
+		return aMap;
+	}
+
+	/** Returns an info map for the entity called <code>entityName</code>. */
+	public Map entityPListMap(String entityName) {
+		return (Map) entityIndex.get(entityName);
+	}
+
+	/**
+	 * Returns the iterator over EOFetchSpecification names for a given entity.
+	 * 
+	 * @since 1.1
+	 */
+	public Iterator queryNames(String entityName) {
+		Map queryPlist = (Map) entityQueryIndex.get(entityName);
+		if (queryPlist == null || queryPlist.isEmpty()) {
+			return IteratorUtils.EMPTY_ITERATOR;
+		}
+
+		return queryPlist.keySet().iterator();
+	}
+
+	/**
+	 * Returns a map containing EOFetchSpecification information for entity name
+	 * and query name. Returns null if no such query is found.
+	 * 
+	 * @since 1.1
+	 */
+	public Map queryPListMap(String entityName, String queryName) {
+		Map queryPlist = (Map) entityQueryIndex.get(entityName);
+		if (queryPlist == null || queryPlist.isEmpty()) {
+			return null;
+		}
+
+		return (Map) queryPlist.get(queryName);
+	}
+
+	public String entityClass(String entityName, boolean getClientClass) {
+		if (getClientClass) {
+			return (String) entityClientClassIndex.get(entityName);
+		} else {
+			return (String) entityClassIndex.get(entityName);
+		}
+	}
+
+	/** Loads EOModel index and returns it as a map. */
+	protected Map loadModelIndex() throws Exception {
+
+		try (InputStream indexIn = openIndexStream();) {
+			plistParser.ReInit(indexIn);
+			return (Map) plistParser.propertyList();
+		}
+	}
+
+	/**
+	 * Loads EOEntity information and returns it as a map.
+	 */
+	protected Map loadEntityIndex(String entityName) throws Exception {
+
+		try (InputStream entIn = openEntityStream(entityName);) {
+			plistParser.ReInit(entIn);
+			return (Map) plistParser.propertyList();
+		}
+	}
+
+	/**
+	 * Loads EOFetchSpecification information and returns it as a map.
+	 */
+	protected Map loadQueryIndex(String entityName) throws Exception {
+		InputStream queryIn = null;
+
+		// catch file open exceptions since not all entities have query
+		// files....
+		try {
+			queryIn = openQueryStream(entityName);
+		} catch (IOException ioex) {
+			return Collections.EMPTY_MAP;
+		}
+
+		try {
+			plistParser.ReInit(queryIn);
+			return (Map) plistParser.propertyList();
+		} finally {
+			queryIn.close();
+		}
+	}
+
+	/** Returns EOModel name based on its path. */
+	protected String findModelName(String path) {
+		// strip trailing slashes
+		if (path.endsWith("/") || path.endsWith("\\")) {
+			path = path.substring(0, path.length() - 1);
+		}
+
+		// strip path components
+		int i1 = path.lastIndexOf("/");
+		int i2 = path.lastIndexOf("\\");
+		int i = (i1 > i2) ? i1 : i2;
+		if (i >= 0) {
+			path = path.substring(i + 1);
+		}
+
+		// strip .eomodeld suffix
+		if (path.endsWith(".eomodeld")) {
+			path = path.substring(0, path.length() - ".eomodeld".length());
+		}
+
+		return path;
+	}
+
+	/**
+	 * Returns InputStream to read an EOModel index file.
+	 */
+	protected InputStream openIndexStream() throws Exception {
+		return new URL(modelUrl, "index.eomodeld").openStream();
+	}
+
+	/**
+	 * Returns InputStream to read an EOEntity plist file.
+	 * 
+	 * @param entityName
+	 *            name of EOEntity to be loaded.
+	 * @return InputStream to read an EOEntity plist file or null if
+	 *         <code>entityname.plist</code> file can not be located.
+	 */
+	protected InputStream openEntityStream(String entityName) throws Exception {
+		return new URL(modelUrl, entityName + ".plist").openStream();
+	}
+
+	/**
+	 * Returns InputStream to read an EOFetchSpecification plist file.
+	 * 
+	 * @param entityName
+	 *            name of EOEntity to be loaded.
+	 * @return InputStream to read an EOEntity plist file or null if
+	 *         <code>entityname.plist</code> file can not be located.
+	 */
+	protected InputStream openQueryStream(String entityName) throws Exception {
+		return new URL(modelUrl, entityName + ".fspec").openStream();
+	}
 }


Mime
View raw message