You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2012/11/09 23:59:39 UTC

svn commit: r1407681 - in /cayenne/main/trunk: docs/doc/src/main/resources/ framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/ framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/

Author: aadamchik
Date: Fri Nov  9 22:59:38 2012
New Revision: 1407681

URL: http://svn.apache.org/viewvc?rev=1407681&view=rev
Log:
CAY-1758 cdbimport improvements: DataMap project-version attribute is skipped when DM is saved

switched DbImportAction to saving via cayenne-project facilities

Modified:
    cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
    cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
    cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportModule.java
    cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DbImportActionTest.java

Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=1407681&r1=1407680&r2=1407681&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Fri Nov  9 22:59:38 2012
@@ -31,6 +31,7 @@ CAY-1763 cdbimport improvements: specifi
 CAY-1764 cdbimport improvements: "overwrite" flag
 CAY-1765 cdbimport improvements: add excludeTables/includeTables parameters
 CAY-1766 Deprecating DataPort ant task
+CAY-1768 cdbimport improvements: DataMap "project-version" attribute is skipped when DM is saved
 
 Bug Fixes:
 

Modified: cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java?rev=1407681&r1=1407680&r2=1407681&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java Fri Nov  9 22:59:38 2012
@@ -21,13 +21,15 @@ package org.apache.cayenne.tools.dbimpor
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.PrintWriter;
+import java.net.URL;
 import java.sql.Connection;
 
 import javax.sql.DataSource;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DbLoader;
 import org.apache.cayenne.access.DbLoaderDelegate;
+import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
@@ -38,9 +40,11 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.MapLoader;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.naming.NamingStrategy;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.tools.NamePatternMatcher;
 import org.apache.cayenne.util.DeleteRuleUpdater;
-import org.apache.cayenne.util.XMLEncoder;
 import org.apache.commons.logging.Log;
 import org.xml.sax.InputSource;
 
@@ -52,15 +56,19 @@ import org.xml.sax.InputSource;
  */
 public class DbImportAction {
 
+    private static final String DATA_MAP_LOCATION_SUFFIX = ".map.xml";
+
+    private ProjectSaver projectSaver;
     private DataSourceFactory dataSourceFactory;
     private DbAdapterFactory adapterFactory;
     private Log logger;
 
     public DbImportAction(@Inject Log logger, @Inject DbAdapterFactory adapterFactory,
-            @Inject DataSourceFactory dataSourceFactory) {
+            @Inject DataSourceFactory dataSourceFactory, @Inject ProjectSaver projectSaver) {
         this.logger = logger;
         this.adapterFactory = adapterFactory;
         this.dataSourceFactory = dataSourceFactory;
+        this.projectSaver = projectSaver;
     }
 
     public void execute(DbImportParameters parameters) throws Exception {
@@ -102,15 +110,10 @@ public class DbImportAction {
     }
 
     void saveLoaded(DataMap dataMap, File dataMapFile) throws FileNotFoundException {
-        dataMapFile.delete();
-
-        PrintWriter pw = new PrintWriter(dataMapFile);
-        XMLEncoder encoder = new XMLEncoder(pw, "\t");
-
-        encoder.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-        dataMap.encodeAsXML(encoder);
 
-        pw.close();
+        ConfigurationTree<DataMap> projectRoot = new ConfigurationTree<DataMap>(dataMap);
+        Project project = new Project(projectRoot);
+        projectSaver.save(project);
     }
 
     DataMap load(DbImportParameters parameters, DataNodeDescriptor nodeDescriptor) throws Exception {
@@ -173,6 +176,16 @@ public class DbImportAction {
     DataMap createDataMap(DbImportParameters parameters) throws IOException {
 
         File dataMapFile = parameters.getDataMapFile();
+        if (dataMapFile == null) {
+            throw new NullPointerException("Null DataMap File.");
+        }
+
+        String name = dataMapFile.getName();
+        if (!name.endsWith(DATA_MAP_LOCATION_SUFFIX)) {
+            throw new CayenneRuntimeException("DataMap file name must end with '%s': '%s'", DATA_MAP_LOCATION_SUFFIX,
+                    name);
+        }
+
         DataMap dataMap;
 
         if (dataMapFile.exists()) {
@@ -188,7 +201,13 @@ public class DbImportAction {
                 dataMap.clearResultSets();
             }
         } else {
-            dataMap = new DataMap();
+
+            // the name and URL are important for the save to work
+            String dataMapName = name.substring(0, name.length() - DATA_MAP_LOCATION_SUFFIX.length());
+            URL dataMapUrl = dataMapFile.toURI().toURL();
+
+            dataMap = new DataMap(dataMapName);
+            dataMap.setConfigurationSource(new URLResource(dataMapUrl));
         }
 
         // update map defaults

Modified: cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportModule.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportModule.java?rev=1407681&r1=1407680&r2=1407681&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportModule.java (original)
+++ cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportModule.java Fri Nov  9 22:59:38 2012
@@ -18,8 +18,12 @@
  ****************************************************************/
 package org.apache.cayenne.tools.dbimport;
 
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
+import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
+import org.apache.cayenne.project.FileProjectSaver;
+import org.apache.cayenne.project.ProjectSaver;
 import org.apache.cayenne.tools.configuration.ToolsModule;
 
 /**
@@ -32,5 +36,7 @@ public class DbImportModule implements M
 
     public void configure(Binder binder) {
         binder.bind(DbImportAction.class).to(DbImportAction.class);
+        binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
+        binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DbImportActionTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DbImportActionTest.java?rev=1407681&r1=1407680&r2=1407681&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DbImportActionTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/DbImportActionTest.java Fri Nov  9 22:59:38 2012
@@ -20,6 +20,8 @@ package org.apache.cayenne.tools.dbimpor
 
 import static org.mockito.Mockito.mock;
 
+import java.io.File;
+import java.net.URL;
 import java.sql.Connection;
 
 import junit.framework.TestCase;
@@ -29,7 +31,10 @@ import org.apache.cayenne.access.DbLoade
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.tools.configuration.ToolsModule;
+import org.apache.cayenne.util.Util;
 import org.apache.commons.logging.Log;
 
 public class DbImportActionTest extends TestCase {
@@ -68,7 +73,7 @@ public class DbImportActionTest extends 
         assertTrue(loader1.includeTableName("a"));
         assertTrue(loader1.includeTableName("b"));
         assertTrue(loader1.includeTableName("cd"));
-        
+
         parameters.setExcludeTables("cd");
 
         DbLoader loader2 = action.createLoader(parameters, mock(DbAdapter.class), mock(Connection.class),
@@ -81,4 +86,52 @@ public class DbImportActionTest extends 
         assertFalse(loader2.includeTableName("cd"));
         assertTrue(loader2.includeTableName("cx"));
     }
+
+    public void testSaveLoaded() throws Exception {
+        Log log = mock(Log.class);
+        Injector i = DIBootstrap.createInjector(new ToolsModule(log), new DbImportModule());
+
+        DbImportAction action = i.getInstance(DbImportAction.class);
+
+        String packagePath = getClass().getPackage().getName().replace('.', '/');
+        URL packageUrl = getClass().getClassLoader().getResource(packagePath);
+        assertNotNull(packageUrl);
+        URL outUrl = new URL(packageUrl, "dbimport/testSaveLoaded1.map.xml");
+
+        File out = new File(outUrl.toURI());
+        out.delete();
+        assertFalse(out.isFile());
+
+        DataMap map = new DataMap("testSaveLoaded1");
+        map.setConfigurationSource(new URLResource(outUrl));
+
+        action.saveLoaded(map, out);
+
+        assertTrue(out.isFile());
+
+        String contents = Util.stringFromFile(out);
+        assertTrue("Has no project version saved", contents.contains("project-version=\""));
+    }
+
+    public void testCreateDataMap() throws Exception {
+        Log log = mock(Log.class);
+        Injector i = DIBootstrap.createInjector(new ToolsModule(log), new DbImportModule());
+
+        DbImportAction action = i.getInstance(DbImportAction.class);
+
+        String packagePath = getClass().getPackage().getName().replace('.', '/');
+        URL packageUrl = getClass().getClassLoader().getResource(packagePath);
+        assertNotNull(packageUrl);
+        URL outUrl = new URL(packageUrl, "dbimport/testCreateDataMap1.map.xml");
+
+        File out = new File(outUrl.toURI());
+        out.delete();
+        assertFalse(out.isFile());
+
+        DbImportParameters parameters = new DbImportParameters();
+        parameters.setDataMapFile(out);
+        DataMap dataMap = action.createDataMap(parameters);
+        assertEquals("testCreateDataMap1", dataMap.getName());
+        assertEquals(outUrl, dataMap.getConfigurationSource().getURL());
+    }
 }