You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/08/03 07:59:54 UTC

[3/5] cayenne git commit: CAY-2340 Save additional metadata as separate files

CAY-2340 Save additional metadata as separate files


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

Branch: refs/heads/master
Commit: 3939efe42ab7fd8a3745a45e0d6721b9b789e519
Parents: 78b0a65
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Aug 1 17:02:33 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Aug 2 16:23:56 2017 +0300

----------------------------------------------------------------------
 cayenne-joda/pom.xml                            |   7 ++
 .../cayenne/project/FileProjectSaver.java       |  49 ++++++--
 .../project/extension/BaseNamingDelegate.java   | 112 +++++++++++++++++++
 .../project/extension/BaseSaverDelegate.java    |   4 +
 .../project/extension/ProjectExtension.java     |   5 +
 .../project/extension/info/InfoExtension.java   |   7 ++
 cayenne-server/pom.xml                          |   7 ++
 .../xml/XMLDataChannelDescriptorLoader.java     |   5 +-
 .../configuration/xml/XMLDataMapLoader.java     |   5 +-
 modeler/cayenne-modeler/pom.xml                 |   7 ++
 10 files changed, 196 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-joda/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-joda/pom.xml b/cayenne-joda/pom.xml
index 2dbad8a..8cde877 100644
--- a/cayenne-joda/pom.xml
+++ b/cayenne-joda/pom.xml
@@ -76,6 +76,13 @@
 			<groupId>com.mockrunner</groupId>
 			<artifactId>mockrunner-jdbc</artifactId>
 			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<!-- this one have old Xerces dependency that clashes with JDK's one -->
+					<groupId>nekohtml</groupId>
+					<artifactId>nekohtml</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<dependency>
 			<groupId>org.hsqldb</groupId>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
index fe01162..e76022a 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
@@ -28,6 +28,7 @@ import org.apache.cayenne.project.extension.SaverDelegate;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.util.XMLEncoder;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -56,7 +57,8 @@ public class FileProjectSaver implements ProjectSaver {
 	protected ConfigurationNodeVisitor<Collection<ConfigurationNode>> saveableNodesGetter;
 	protected String fileEncoding;
 
-	protected Collection<SaverDelegate> saverDelegates;
+	protected Collection<ProjectExtension> extensions;
+	protected SaverDelegate delegate;
 
 	public FileProjectSaver(@Inject List<ProjectExtension> extensions) {
 		resourceGetter = new ConfigurationSourceGetter();
@@ -65,21 +67,25 @@ public class FileProjectSaver implements ProjectSaver {
 		// this is not configurable yet... probably doesn't have to be
 		fileEncoding = "UTF-8";
 
-		saverDelegates = new ArrayList<>(extensions.size());
+		this.extensions = extensions;
+		Collection<SaverDelegate> delegates = new ArrayList<>(extensions.size());
 		for(ProjectExtension extension : extensions) {
-			SaverDelegate delegate = extension.createSaverDelegate();
-			saverDelegates.add(delegate);
+			delegates.add(extension.createSaverDelegate());
 		}
+		delegate = new CompoundSaverDelegate(delegates);
 	}
 
+	@Override
 	public String getSupportedVersion() {
 		return String.valueOf(Project.VERSION);
 	}
 
+	@Override
 	public void save(Project project) {
 		save(project, project.getConfigurationResource(), true);
 	}
 
+	@Override
 	public void saveAs(Project project, Resource baseDirectory) {
 		if (baseDirectory == null) {
 			throw new NullPointerException("Null 'baseDirectory'");
@@ -91,8 +97,21 @@ public class FileProjectSaver implements ProjectSaver {
 		Collection<ConfigurationNode> nodes = project.getRootNode().acceptVisitor(saveableNodesGetter);
 		Collection<SaveUnit> units = new ArrayList<>(nodes.size());
 
-		for (ConfigurationNode node : nodes) {
-			units.add(createSaveUnit(node, baseResource));
+		for(ConfigurationNode node : nodes) {
+			String targetLocation = nameMapper.configurationLocation(node);
+			Resource targetResource = baseResource.getRelativeResource(targetLocation);
+			units.add(createSaveUnit(node, targetResource, null));
+
+			for(ProjectExtension extension : extensions) {
+				ConfigurationNodeVisitor<String> namingDelegate = extension.createNamingDelegate();
+				SaverDelegate unitSaverDelegate = extension.createSaverDelegate();
+				String fileName = node.acceptVisitor(namingDelegate);
+				if(fileName != null) {
+					// not null means that this should go to a separate file
+					targetResource = baseResource.getRelativeResource(fileName);
+					units.add(createSaveUnit(node, targetResource, unitSaverDelegate));
+				}
+			}
 		}
 
 		checkAccess(units);
@@ -123,10 +142,11 @@ public class FileProjectSaver implements ProjectSaver {
 		project.getUnusedResources().clear();
 	}
 
-	SaveUnit createSaveUnit(ConfigurationNode node, Resource baseResource) {
+	SaveUnit createSaveUnit(ConfigurationNode node, Resource baseResource, SaverDelegate delegate) {
 
 		SaveUnit unit = new SaveUnit();
 		unit.node = node;
+		unit.delegate = delegate;
 		unit.sourceConfiguration = node.acceptVisitor(resourceGetter);
 
 		String targetLocation = nameMapper.configurationLocation(node);
@@ -209,9 +229,17 @@ public class FileProjectSaver implements ProjectSaver {
 	}
 
 	void saveToTempFile(SaveUnit unit, PrintWriter printWriter) {
-		unit.node.acceptVisitor(
-				new ConfigurationSaver(printWriter, getSupportedVersion(), new CompoundSaverDelegate(saverDelegates))
-		);
+		ConfigurationNodeVisitor<?> visitor;
+		if(unit.delegate == null) {
+			visitor = new ConfigurationSaver(printWriter, getSupportedVersion(), delegate);
+		} else {
+			XMLEncoder encoder = new XMLEncoder(printWriter, "\t", getSupportedVersion());
+			encoder.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+			unit.delegate.setXMLEncoder(encoder);
+			visitor = unit.delegate;
+		}
+
+		unit.node.acceptVisitor(visitor);
 	}
 
 	void saveCommit(Collection<SaveUnit> units) {
@@ -330,6 +358,7 @@ public class FileProjectSaver implements ProjectSaver {
 	class SaveUnit {
 
 		private ConfigurationNode node;
+		private SaverDelegate delegate;
 
 		// source can be an abstract resource, but target is always a file...
 		private Resource sourceConfiguration;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseNamingDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseNamingDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseNamingDelegate.java
new file mode 100644
index 0000000..bbc4cd7
--- /dev/null
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseNamingDelegate.java
@@ -0,0 +1,112 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.project.extension;
+
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.cayenne.map.QueryDescriptor;
+
+/**
+ * @since 4.1
+ */
+public class BaseNamingDelegate implements ConfigurationNodeVisitor<String> {
+
+    @Override
+    public String visitDataChannelDescriptor(DataChannelDescriptor channelDescriptor) {
+        return null;
+    }
+
+    @Override
+    public String visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) {
+        return null;
+    }
+
+    @Override
+    public String visitDataMap(DataMap dataMap) {
+        return null;
+    }
+
+    @Override
+    public String visitObjEntity(ObjEntity entity) {
+        return null;
+    }
+
+    @Override
+    public String visitDbEntity(DbEntity entity) {
+        return null;
+    }
+
+    @Override
+    public String visitEmbeddable(Embeddable embeddable) {
+        return null;
+    }
+
+    @Override
+    public String visitEmbeddableAttribute(EmbeddableAttribute attribute) {
+        return null;
+    }
+
+    @Override
+    public String visitObjAttribute(ObjAttribute attribute) {
+        return null;
+    }
+
+    @Override
+    public String visitDbAttribute(DbAttribute attribute) {
+        return null;
+    }
+
+    @Override
+    public String visitObjRelationship(ObjRelationship relationship) {
+        return null;
+    }
+
+    @Override
+    public String visitDbRelationship(DbRelationship relationship) {
+        return null;
+    }
+
+    @Override
+    public String visitProcedure(Procedure procedure) {
+        return null;
+    }
+
+    @Override
+    public String visitProcedureParameter(ProcedureParameter parameter) {
+        return null;
+    }
+
+    @Override
+    public String visitQuery(QueryDescriptor query) {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
index 08565b2..a9f45f2 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
@@ -130,4 +130,8 @@ public class BaseSaverDelegate implements SaverDelegate {
     public SaverDelegate getParentDelegate() {
         return parentDelegate;
     }
+
+    protected boolean isStandalone() {
+        return parentDelegate == null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
index cf0a182..319ebe1 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
@@ -19,6 +19,8 @@
 
 package org.apache.cayenne.project.extension;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+
 /**
  * <p>DataMap XML file extension mechanics.</p>
  * <p>
@@ -45,4 +47,7 @@ public interface ProjectExtension {
      */
     SaverDelegate createSaverDelegate();
 
+
+    ConfigurationNodeVisitor<String> createNamingDelegate();
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java
index ecbf8f1..0915638 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java
@@ -19,9 +19,11 @@
 
 package org.apache.cayenne.project.extension.info;
 
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.extension.BaseNamingDelegate;
 import org.apache.cayenne.project.extension.LoaderDelegate;
 import org.apache.cayenne.project.extension.ProjectExtension;
 import org.apache.cayenne.project.extension.SaverDelegate;
@@ -49,4 +51,9 @@ public class InfoExtension implements ProjectExtension {
     public SaverDelegate createSaverDelegate() {
         return new InfoSaverDelegate(metaData);
     }
+
+    @Override
+    public ConfigurationNodeVisitor<String> createNamingDelegate() {
+        return new BaseNamingDelegate();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-server/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/pom.xml b/cayenne-server/pom.xml
index 233c580..d5d604d 100644
--- a/cayenne-server/pom.xml
+++ b/cayenne-server/pom.xml
@@ -112,6 +112,13 @@
 			<groupId>com.mockrunner</groupId>
 			<artifactId>mockrunner-jdbc</artifactId>
 			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<!-- this one have old Xerces dependency that clashes with JDK's one -->
+					<groupId>nekohtml</groupId>
+					<artifactId>nekohtml</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<dependency>
 			<groupId>com.mockrunner</groupId>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java
index e9d104e..a1de6c6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java
@@ -126,6 +126,7 @@ public class XMLDataChannelDescriptorLoader implements DataChannelDescriptorLoad
 
 		try(InputStream in = configurationURL.openStream()) {
 			XMLReader parser = Util.createXmlReader();
+			parser.setFeature("http://apache.org/xml/features/xinclude", true);
 			LoaderContext loaderContext = new LoaderContext(parser, handlerFactory);
 			loaderContext.addDataMapListener(new DataMapLoaderListener() {
 				@Override
@@ -137,7 +138,9 @@ public class XMLDataChannelDescriptorLoader implements DataChannelDescriptorLoad
 			DataChannelHandler rootHandler = new DataChannelHandler(this, descriptor, loaderContext);
 			parser.setContentHandler(rootHandler);
 			parser.setErrorHandler(rootHandler);
-			parser.parse(new InputSource(in));
+			InputSource input = new InputSource(in);
+			input.setSystemId(configurationURL.toString());
+			parser.parse(input);
 		} catch (Exception e) {
 			throw new ConfigurationException("Error loading configuration from %s", e, configurationURL);
 		}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java
index 68b236d..37fe689 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java
@@ -45,6 +45,7 @@ public class XMLDataMapLoader implements DataMapLoader {
     public synchronized DataMap load(Resource configurationResource) throws CayenneRuntimeException {
         try(InputStream in = configurationResource.getURL().openStream()) {
             XMLReader parser = Util.createXmlReader();
+            parser.setFeature("http://apache.org/xml/features/xinclude", true);
             LoaderContext loaderContext = new LoaderContext(parser, handlerFactory);
             loaderContext.addDataMapListener(new DataMapLoaderListener() {
                 @Override
@@ -56,7 +57,9 @@ public class XMLDataMapLoader implements DataMapLoader {
 
             parser.setContentHandler(rootHandler);
             parser.setErrorHandler(rootHandler);
-            parser.parse(new InputSource(in));
+            InputSource input = new InputSource(in);
+            input.setSystemId(configurationResource.getURL().toString());
+            parser.parse(input);
         } catch (Exception e) {
             throw new CayenneRuntimeException("Error loading configuration from %s", e, configurationResource.getURL());
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/modeler/cayenne-modeler/pom.xml
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/pom.xml b/modeler/cayenne-modeler/pom.xml
index 107340d..6f9fc2e 100644
--- a/modeler/cayenne-modeler/pom.xml
+++ b/modeler/cayenne-modeler/pom.xml
@@ -95,6 +95,13 @@
 		<dependency>
 			<groupId>com.mockrunner</groupId>
 			<artifactId>mockrunner-jdbc</artifactId>
+			<exclusions>
+				<exclusion>
+					<!-- this one have old Xerces dependency that clashes with JDK's one -->
+					<groupId>nekohtml</groupId>
+					<artifactId>nekohtml</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 
 		<dependency>