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 2022/11/10 11:51:32 UTC

[cayenne] branch master updated (4198c1bcd -> f0c1efeed)

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


    from 4198c1bcd CAY-2767 Modeler: upgrade deprecated code in custom components
     add 5f9ab4f8b fix: datamap file field is not updated after Datamap renaiming
     new 63f738d22 Merge remote-tracking branch 'parent/pr/463' into asf-master
     new 3f8d82ba5 Cleanup imports
     new f0c1efeed Cleanup code

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../cayenne/project/ConfigurationSourceSetter.java |  23 +-
 .../apache/cayenne/project/FileProjectSaver.java   | 637 +++++++++++----------
 .../org/apache/cayenne/project/ProjectModule.java  |   3 +
 .../xml/XMLDataChannelDescriptorLoader.java        |   1 -
 .../apache/cayenne/modeler/ProjectController.java  |  17 +
 .../apache/cayenne/modeler/action/SaveAction.java  |   2 +
 .../apache/cayenne/modeler/editor/DataMapView.java |  12 +-
 ...lectionListener.java => ProjectSavedEvent.java} |  21 +-
 ...playListener.java => ProjectSavedListener.java} |   7 +-
 9 files changed, 390 insertions(+), 333 deletions(-)
 copy modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/{CallbackTypeSelectionListener.java => ProjectSavedEvent.java} (72%)
 copy modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/{ProcedureParameterDisplayListener.java => ProjectSavedListener.java} (83%)


[cayenne] 03/03: Cleanup code

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit f0c1efeedcf25f442fcfda78e621997e650d5642
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Nov 10 12:14:17 2022 +0300

    Cleanup code
---
 .../apache/cayenne/modeler/ProjectController.java  | 52 +++++++++++++++++++++-
 .../cayenne/modeler/event/ProjectSavedEvent.java   |  2 +
 .../modeler/event/ProjectSavedListener.java        |  2 +
 3 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java
index b4e6fabc6..cc8a90bd1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java
@@ -36,7 +36,18 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.configuration.event.*;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.configuration.event.DataMapListener;
+import org.apache.cayenne.configuration.event.DataNodeEvent;
+import org.apache.cayenne.configuration.event.DataNodeListener;
+import org.apache.cayenne.configuration.event.DomainEvent;
+import org.apache.cayenne.configuration.event.DomainListener;
+import org.apache.cayenne.configuration.event.ProcedureEvent;
+import org.apache.cayenne.configuration.event.ProcedureListener;
+import org.apache.cayenne.configuration.event.ProcedureParameterEvent;
+import org.apache.cayenne.configuration.event.ProcedureParameterListener;
+import org.apache.cayenne.configuration.event.QueryEvent;
+import org.apache.cayenne.configuration.event.QueryListener;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -71,7 +82,44 @@ import org.apache.cayenne.modeler.action.SaveAction;
 import org.apache.cayenne.modeler.action.SaveAsAction;
 import org.apache.cayenne.modeler.editor.CallbackType;
 import org.apache.cayenne.modeler.editor.ObjCallbackMethod;
-import org.apache.cayenne.modeler.event.*;
+import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.CallbackMethodEvent;
+import org.apache.cayenne.modeler.event.CallbackMethodListener;
+import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
+import org.apache.cayenne.modeler.event.DataMapDisplayListener;
+import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
+import org.apache.cayenne.modeler.event.DataNodeDisplayListener;
+import org.apache.cayenne.modeler.event.DataSourceModificationEvent;
+import org.apache.cayenne.modeler.event.DataSourceModificationListener;
+import org.apache.cayenne.modeler.event.DbAttributeDisplayListener;
+import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
+import org.apache.cayenne.modeler.event.DbRelationshipDisplayListener;
+import org.apache.cayenne.modeler.event.DisplayEvent;
+import org.apache.cayenne.modeler.event.DomainDisplayEvent;
+import org.apache.cayenne.modeler.event.DomainDisplayListener;
+import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayListener;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
+import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.event.EntityListenerEvent;
+import org.apache.cayenne.modeler.event.EntityListenerListener;
+import org.apache.cayenne.modeler.event.MultipleObjectsDisplayEvent;
+import org.apache.cayenne.modeler.event.MultipleObjectsDisplayListener;
+import org.apache.cayenne.modeler.event.ObjAttributeDisplayListener;
+import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
+import org.apache.cayenne.modeler.event.ObjRelationshipDisplayListener;
+import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
+import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
+import org.apache.cayenne.modeler.event.ProcedureParameterDisplayEvent;
+import org.apache.cayenne.modeler.event.ProcedureParameterDisplayListener;
+import org.apache.cayenne.modeler.event.ProjectOnSaveEvent;
+import org.apache.cayenne.modeler.event.ProjectOnSaveListener;
+import org.apache.cayenne.modeler.event.ProjectSavedEvent;
+import org.apache.cayenne.modeler.event.ProjectSavedListener;
+import org.apache.cayenne.modeler.event.QueryDisplayEvent;
+import org.apache.cayenne.modeler.event.QueryDisplayListener;
+import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.pref.DataNodeDefaults;
 import org.apache.cayenne.modeler.pref.ProjectStatePreferences;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectSavedEvent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectSavedEvent.java
index 8edd037f1..2510d6503 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectSavedEvent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectSavedEvent.java
@@ -23,6 +23,8 @@ import java.util.EventObject;
 
 /**
  * Triggered when project is saved completely.
+ *
+ * @since 4.3
  */
 public class ProjectSavedEvent extends EventObject {
     /**
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectSavedListener.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectSavedListener.java
index bc646d0c0..53c7a942f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectSavedListener.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectSavedListener.java
@@ -23,6 +23,8 @@ import java.util.EventListener;
 
 /**
  * Interface for classes that are interested in ProjectSaved events.
+ *
+ * @since 4.3
  */
 public interface ProjectSavedListener extends EventListener {
     void updateNamesAfterSaving(ProjectSavedEvent e);


[cayenne] 01/03: Merge remote-tracking branch 'parent/pr/463' into asf-master

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 63f738d220c9c81649002eaeeef1869dc7d82277
Merge: 4198c1bcd 5f9ab4f8b
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Nov 10 11:15:59 2022 +0300

    Merge remote-tracking branch 'parent/pr/463' into asf-master
    
    # Conflicts:
    #       cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java

 .../cayenne/project/ConfigurationSourceSetter.java |  23 +-
 .../apache/cayenne/project/FileProjectSaver.java   | 637 +++++++++++----------
 .../org/apache/cayenne/project/ProjectModule.java  |   3 +
 .../xml/XMLDataChannelDescriptorLoader.java        |   1 -
 .../apache/cayenne/modeler/ProjectController.java  |  65 +--
 .../apache/cayenne/modeler/action/SaveAction.java  |   2 +
 .../apache/cayenne/modeler/editor/DataMapView.java |  30 +-
 .../cayenne/modeler/event/ProjectSavedEvent.java   |  37 ++
 .../modeler/event/ProjectSavedListener.java        |  29 +
 9 files changed, 443 insertions(+), 384 deletions(-)

diff --cc cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
index a83cf7693,11325634c..cd76e0a64
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
@@@ -50,321 -50,322 +50,322 @@@ import java.util.List
   */
  public class FileProjectSaver implements ProjectSaver {
  
- 	@Inject
- 	protected ConfigurationNameMapper nameMapper;
- 
- 	protected ConfigurationNodeVisitor<Resource> resourceGetter;
- 	protected ConfigurationNodeVisitor<Collection<ConfigurationNode>> saveableNodesGetter;
- 	protected String fileEncoding;
- 
- 	protected Collection<ProjectExtension> extensions;
- 	protected SaverDelegate delegate;
- 
- 	public FileProjectSaver(@Inject List<ProjectExtension> extensions) {
- 		resourceGetter = new ConfigurationSourceGetter();
- 		saveableNodesGetter = new SaveableNodesGetter();
- 
- 		// this is not configurable yet... probably doesn't have to be
- 		fileEncoding = "UTF-8";
- 
- 		this.extensions = extensions;
- 		Collection<SaverDelegate> delegates = new ArrayList<>(extensions.size());
- 		for(ProjectExtension extension : extensions) {
- 			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'");
- 		}
- 		save(project, baseDirectory, false);
- 	}
- 
- 	void save(Project project, Resource baseResource, boolean deleteOldResources) {
- 		Collection<ConfigurationNode> nodes = project.getRootNode().acceptVisitor(saveableNodesGetter);
- 		Collection<SaveUnit> units = new ArrayList<>(nodes.size());
- 
- 		delegate.setBaseDirectory(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);
- 
- 		try {
- 			saveToTempFiles(units);
- 			saveCommit(units);
- 		} finally {
- 			clearTempFiles(units);
- 		}
- 
- 		try {
- 			if (deleteOldResources) {
- 				clearRenamedFiles(units);
- 
- 				Collection<URL> unusedResources = project.getUnusedResources();
- 				for (SaveUnit unit : units) {
- 					unusedResources.remove(unit.sourceConfiguration.getURL());
- 				}
- 				deleteUnusedFiles(unusedResources);
- 			}
- 		} catch (IOException ex) {
- 			throw new CayenneRuntimeException(ex);
- 		}
- 
- 		// I guess we should reset projects state regardless of the value of
- 		// 'deleteOldResources'
- 		project.getUnusedResources().clear();
- 	}
- 
- 	SaveUnit createSaveUnit(ConfigurationNode node, Resource targetResource, SaverDelegate delegate) {
- 
- 		SaveUnit unit = new SaveUnit();
- 		unit.node = node;
- 		unit.delegate = delegate;
- 		unit.sourceConfiguration = node.acceptVisitor(resourceGetter);
- 
- 		if (unit.sourceConfiguration == null) {
- 			unit.sourceConfiguration = targetResource;
- 		}
- 
- 		// attempt to convert targetResource to a File... if that fails,
- 		// FileProjectSaver is not appropriate for handling a given project..
- 
- 		URL targetUrl = targetResource.getURL();
- 
- 		try {
- 			unit.targetFile = Util.toFile(targetUrl);
- 		} catch (IllegalArgumentException e) {
- 			throw new CayenneRuntimeException("Can't save configuration to the following location: '%s'. "
- 					+ "Is this a valid file location?. (%s)", e, targetUrl, e.getMessage());
- 		}
- 
- 		return unit;
- 	}
- 
- 	void checkAccess(Collection<SaveUnit> units) {
- 		for (SaveUnit unit : units) {
- 
- 			File targetFile = unit.targetFile;
- 
- 			File parent = targetFile.getParentFile();
- 			if (!parent.exists()) {
- 				if (!parent.mkdirs()) {
- 					throw new CayenneRuntimeException("Error creating directory tree for '%s'",
- 							parent.getAbsolutePath());
- 				}
- 			}
- 
- 			if (targetFile.isDirectory()) {
- 				throw new CayenneRuntimeException("Target file '%s' is a directory", targetFile.getAbsolutePath());
- 			}
- 
- 			if (targetFile.exists() && !targetFile.canWrite()) {
- 				throw new CayenneRuntimeException("Can't write to file '%s'", targetFile.getAbsolutePath());
- 			}
- 
- 		}
- 	}
- 
- 	void saveToTempFiles(Collection<SaveUnit> units) {
- 
- 		for (SaveUnit unit : units) {
- 
- 			String name = unit.targetFile.getName();
- 			if (name.length() < 3) {
- 				name = "cayenne-project";
- 			}
- 
- 			File parent = unit.targetFile.getParentFile();
- 
- 			try {
- 				unit.targetTempFile = File.createTempFile(name, null, parent);
- 			} catch (IOException e) {
- 				throw new CayenneRuntimeException("Error creating temp file (%s)", e, e.getMessage());
- 			}
- 
- 			if (unit.targetTempFile.exists()) {
- 				unit.targetTempFile.delete();
- 			}
- 
- 			try (PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
- 					new FileOutputStream(unit.targetTempFile), fileEncoding))) {
- 				saveToTempFile(unit, printWriter);
- 			} catch (UnsupportedEncodingException e) {
- 				throw new CayenneRuntimeException("Unsupported encoding '%s' (%s)", e, fileEncoding, e.getMessage());
- 			} catch (FileNotFoundException e) {
- 				throw new CayenneRuntimeException("File not found '%s' (%s)", e, unit.targetTempFile.getAbsolutePath(),
- 						e.getMessage());
- 			}
- 		}
- 	}
- 
- 	void saveToTempFile(SaveUnit unit, PrintWriter printWriter) {
- 		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) {
- 
- 		for (SaveUnit unit : units) {
- 
- 			File targetFile = unit.targetFile;
- 
- 			// Per CAY-2119, this is an ugly hack to force Windows to unlock the file that was previously locked by
- 			// our process. Without it, the delete operation downstream would fail
- 			System.gc();
- 
- 			if (targetFile.exists()) {
- 				if (!targetFile.delete()) {
- 					throw new CayenneRuntimeException("Unable to remove old master file '%s'",
- 							targetFile.getAbsolutePath());
- 				}
- 			}
- 
- 			File tempFile = unit.targetTempFile;
- 			if (!tempFile.renameTo(targetFile)) {
- 				throw new CayenneRuntimeException("Unable to move '%s' to '%s'", tempFile.getAbsolutePath(),
- 						targetFile.getAbsolutePath());
- 			}
- 
- 			unit.targetTempFile = null;
- 			try {
- 				if(unit.delegate == null) {
- 					unit.node.acceptVisitor(new ConfigurationSourceSetter(new URLResource(targetFile.toURI().toURL())));
- 				}
- 			} catch (MalformedURLException e) {
- 				throw new CayenneRuntimeException("Malformed URL for file '%s'", e, targetFile.getAbsolutePath());
- 			}
- 		}
- 	}
- 
- 	private void clearTempFiles(Collection<SaveUnit> units) {
- 		for (SaveUnit unit : units) {
- 
- 			if (unit.targetTempFile != null && unit.targetTempFile.exists()) {
- 				unit.targetTempFile.delete();
- 				unit.targetTempFile = null;
- 			}
- 		}
- 	}
- 
- 	private void clearRenamedFiles(Collection<SaveUnit> units) throws IOException {
- 		for (SaveUnit unit : units) {
- 
- 			if (unit.sourceConfiguration == null) {
- 				continue;
- 			}
- 
- 			URL sourceUrl = unit.sourceConfiguration.getURL();
- 			File sourceFile;
- 			try {
- 				sourceFile = Util.toFile(sourceUrl);
- 			} catch (IllegalArgumentException e) {
- 				// ignore non-file configurations...
- 				continue;
- 			}
- 
- 			if (!sourceFile.exists()) {
- 				continue;
- 			}
- 
- 			// compare against ALL unit target files, not just the current
- 			// unit... if the
- 			// target matches, skip this file
- 			boolean isTarget = false;
- 			for (SaveUnit xunit : units) {
- 				if (isFilesEquals(sourceFile, xunit.targetFile)) {
- 					isTarget = true;
- 					break;
- 				}
- 			}
- 
- 			if (!isTarget) {
- 				if (!sourceFile.delete()) {
- 					throw new CayenneRuntimeException("Could not delete file '%s'", sourceFile.getCanonicalPath());
- 				}
- 			}
- 		}
- 	}
- 
- 	private boolean isFilesEquals(File firstFile, File secondFile) throws IOException {
- 		boolean isFirstFileExists = firstFile.exists();
- 		boolean isSecondFileExists = secondFile.exists();
- 
- 		String firstFilePath = firstFile.getCanonicalPath();
- 		String secondFilePath = secondFile.getCanonicalPath();
- 
- 		return isFirstFileExists && isSecondFileExists && firstFilePath.equals(secondFilePath);
- 	}
- 
- 	private void deleteUnusedFiles(Collection<URL> unusedResources) throws IOException {
- 		for (URL unusedResource : unusedResources) {
- 
- 			File unusedFile;
- 			try {
- 				unusedFile = Util.toFile(unusedResource);
- 			} catch (IllegalArgumentException e) {
- 				// ignore non-file configurations...
- 				continue;
- 			}
- 
- 			if (!unusedFile.exists()) {
- 				continue;
- 			}
- 
- 			if (!unusedFile.delete()) {
- 				throw new CayenneRuntimeException("Could not delete file '%s'", unusedFile.getCanonicalPath());
- 			}
- 
- 		}
- 	}
- 
- 	static class SaveUnit {
- 
- 		private ConfigurationNode node;
- 		private SaverDelegate delegate;
- 
- 		// source can be an abstract resource, but target is always a file...
- 		private Resource sourceConfiguration;
- 		private File targetFile;
- 		private File targetTempFile;
- 
- 	}
+     @Inject
+     protected ConfigurationNameMapper nameMapper;
+ 
+     protected ConfigurationNodeVisitor<Resource> resourceGetter;
+     protected ConfigurationNodeVisitor<Collection<ConfigurationNode>> saveableNodesGetter;
+     protected String fileEncoding;
+ 
+     protected Collection<ProjectExtension> extensions;
+     protected SaverDelegate delegate;
+ 
+     public FileProjectSaver(@Inject List<ProjectExtension> extensions) {
+         resourceGetter = new ConfigurationSourceGetter();
+         saveableNodesGetter = new SaveableNodesGetter();
+ 
+         // this is not configurable yet... probably doesn't have to be
+         fileEncoding = "UTF-8";
+ 
+         this.extensions = extensions;
+         Collection<SaverDelegate> delegates = new ArrayList<>(extensions.size());
+         for (ProjectExtension extension : extensions) {
+             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'");
+         }
+         save(project, baseDirectory, false);
+     }
+ 
+     void save(Project project, Resource baseResource, boolean deleteOldResources) {
+         Collection<ConfigurationNode> nodes = project.getRootNode().acceptVisitor(saveableNodesGetter);
+         Collection<SaveUnit> units = new ArrayList<>(nodes.size());
+ 
+         delegate.setBaseDirectory(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);
+ 
+         try {
+             saveToTempFiles(units);
+             saveCommit(units);
+         } finally {
+             clearTempFiles(units);
+         }
+ 
+         try {
+             if (deleteOldResources) {
+                 clearRenamedFiles(units);
+ 
+                 Collection<URL> unusedResources = project.getUnusedResources();
+                 for (SaveUnit unit : units) {
+                     unusedResources.remove(unit.sourceConfiguration.getURL());
+                 }
+                 deleteUnusedFiles(unusedResources);
+             }
+         } catch (IOException ex) {
+             throw new CayenneRuntimeException(ex);
+         }
+ 
+         // I guess we should reset projects state regardless of the value of
+         // 'deleteOldResources'
+         project.getUnusedResources().clear();
+     }
+ 
+     SaveUnit createSaveUnit(ConfigurationNode node, Resource targetResource, SaverDelegate delegate) {
+ 
+         SaveUnit unit = new SaveUnit();
+         unit.node = node;
+         unit.delegate = delegate;
+         unit.sourceConfiguration = node.acceptVisitor(resourceGetter);
+ 
+         if (unit.sourceConfiguration == null) {
+             unit.sourceConfiguration = targetResource;
+         }
+ 
+         // attempt to convert targetResource to a File... if that fails,
+         // FileProjectSaver is not appropriate for handling a given project..
+ 
+         URL targetUrl = targetResource.getURL();
+ 
+         try {
+             unit.targetFile = Util.toFile(targetUrl);
+         } catch (IllegalArgumentException e) {
+             throw new CayenneRuntimeException("Can't save configuration to the following location: '%s'. "
+                     + "Is this a valid file location?. (%s)", e, targetUrl, e.getMessage());
+         }
+ 
+         return unit;
+     }
+ 
+     void checkAccess(Collection<SaveUnit> units) {
+         for (SaveUnit unit : units) {
+ 
+             File targetFile = unit.targetFile;
+ 
+             File parent = targetFile.getParentFile();
+             if (!parent.exists()) {
+                 if (!parent.mkdirs()) {
+                     throw new CayenneRuntimeException("Error creating directory tree for '%s'",
+                             parent.getAbsolutePath());
+                 }
+             }
+ 
+             if (targetFile.isDirectory()) {
+                 throw new CayenneRuntimeException("Target file '%s' is a directory", targetFile.getAbsolutePath());
+             }
+ 
+             if (targetFile.exists() && !targetFile.canWrite()) {
+                 throw new CayenneRuntimeException("Can't write to file '%s'", targetFile.getAbsolutePath());
+             }
+ 
+         }
+     }
+ 
+     void saveToTempFiles(Collection<SaveUnit> units) {
+ 
+         for (SaveUnit unit : units) {
+ 
+             String name = unit.targetFile.getName();
+             if (name.length() < 3) {
+                 name = "cayenne-project";
+             }
+ 
+             File parent = unit.targetFile.getParentFile();
+ 
+             try {
+                 unit.targetTempFile = File.createTempFile(name, null, parent);
+             } catch (IOException e) {
+                 throw new CayenneRuntimeException("Error creating temp file (%s)", e, e.getMessage());
+             }
+ 
+             if (unit.targetTempFile.exists()) {
+                 unit.targetTempFile.delete();
+             }
+ 
+             try (PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
+                     new FileOutputStream(unit.targetTempFile), fileEncoding))) {
+                 saveToTempFile(unit, printWriter);
+             } catch (UnsupportedEncodingException e) {
+                 throw new CayenneRuntimeException("Unsupported encoding '%s' (%s)", e, fileEncoding, e.getMessage());
+             } catch (FileNotFoundException e) {
+                 throw new CayenneRuntimeException("File not found '%s' (%s)", e, unit.targetTempFile.getAbsolutePath(),
+                         e.getMessage());
+             }
+         }
+     }
+ 
+     void saveToTempFile(SaveUnit unit, PrintWriter printWriter) {
+         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) {
+ 
+         for (SaveUnit unit : units) {
+ 
+             File targetFile = unit.targetFile;
+ 
+             // Per CAY-2119, this is an ugly hack to force Windows to unlock the file that was previously locked by
+             // our process. Without it, the delete operation downstream would fail
+             System.gc();
+ 
+             if (targetFile.exists()) {
+                 if (!targetFile.delete()) {
+                     throw new CayenneRuntimeException("Unable to remove old master file '%s'",
+                             targetFile.getAbsolutePath());
+                 }
+             }
+ 
+             File tempFile = unit.targetTempFile;
+             if (!tempFile.renameTo(targetFile)) {
+                 throw new CayenneRuntimeException("Unable to move '%s' to '%s'", tempFile.getAbsolutePath(),
+                         targetFile.getAbsolutePath());
+             }
+ 
+             unit.targetTempFile = null;
+             try {
+                 if (unit.delegate == null) {
+                     URLResource targetUrlResource = new URLResource(targetFile.toURI().toURL());
+                     unit.node.acceptVisitor(new ConfigurationSourceSetter(targetUrlResource, nameMapper));
+                 }
+             } catch (MalformedURLException e) {
+                 throw new CayenneRuntimeException("Malformed URL for file '%s'", e, targetFile.getAbsolutePath());
+             }
+         }
+     }
+ 
+     private void clearTempFiles(Collection<SaveUnit> units) {
+         for (SaveUnit unit : units) {
+ 
+             if (unit.targetTempFile != null && unit.targetTempFile.exists()) {
+                 unit.targetTempFile.delete();
+                 unit.targetTempFile = null;
+             }
+         }
+     }
+ 
+     private void clearRenamedFiles(Collection<SaveUnit> units) throws IOException {
+         for (SaveUnit unit : units) {
+ 
+             if (unit.sourceConfiguration == null) {
+                 continue;
+             }
+ 
+             URL sourceUrl = unit.sourceConfiguration.getURL();
+             File sourceFile;
+             try {
+                 sourceFile = Util.toFile(sourceUrl);
+             } catch (IllegalArgumentException e) {
+                 // ignore non-file configurations...
+                 continue;
+             }
+ 
+             if (!sourceFile.exists()) {
+                 continue;
+             }
+ 
+             // compare against ALL unit target files, not just the current
+             // unit... if the
+             // target matches, skip this file
+             boolean isTarget = false;
+             for (SaveUnit xunit : units) {
+                 if (isFilesEquals(sourceFile, xunit.targetFile)) {
+                     isTarget = true;
+                     break;
+                 }
+             }
+ 
+             if (!isTarget) {
+                 if (!sourceFile.delete()) {
+                     throw new CayenneRuntimeException("Could not delete file '%s'", sourceFile.getCanonicalPath());
+                 }
+             }
+         }
+     }
+ 
+     private boolean isFilesEquals(File firstFile, File secondFile) throws IOException {
+         boolean isFirstFileExists = firstFile.exists();
+         boolean isSecondFileExists = secondFile.exists();
+ 
+         String firstFilePath = firstFile.getCanonicalPath();
+         String secondFilePath = secondFile.getCanonicalPath();
+ 
+         return isFirstFileExists && isSecondFileExists && firstFilePath.equals(secondFilePath);
+     }
+ 
+     private void deleteUnusedFiles(Collection<URL> unusedResources) throws IOException {
+         for (URL unusedResource : unusedResources) {
+ 
+             File unusedFile;
+             try {
+                 unusedFile = Util.toFile(unusedResource);
+             } catch (IllegalArgumentException e) {
+                 // ignore non-file configurations...
+                 continue;
+             }
+ 
+             if (!unusedFile.exists()) {
+                 continue;
+             }
+ 
+             if (!unusedFile.delete()) {
+                 throw new CayenneRuntimeException("Could not delete file '%s'", unusedFile.getCanonicalPath());
+             }
+ 
+         }
+     }
+ 
 -    class SaveUnit {
++    static class SaveUnit {
+ 
+         private ConfigurationNode node;
+         private SaverDelegate delegate;
+ 
+         // source can be an abstract resource, but target is always a file...
+         private Resource sourceConfiguration;
+         private File targetFile;
+         private File targetTempFile;
+ 
+     }
  }


[cayenne] 02/03: Cleanup imports

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 3f8d82ba5210ed382b21a85b3d31655c5ce976d3
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Nov 10 11:19:15 2022 +0300

    Cleanup imports
---
 .../org/apache/cayenne/modeler/editor/DataMapView.java | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java
index 290f06e17..52c029ab6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java
@@ -29,7 +29,11 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.action.LinkDataMapAction;
-import org.apache.cayenne.modeler.dialog.datamap.*;
+import org.apache.cayenne.modeler.dialog.datamap.CatalogUpdateController;
+import org.apache.cayenne.modeler.dialog.datamap.LockingUpdateController;
+import org.apache.cayenne.modeler.dialog.datamap.PackageUpdateController;
+import org.apache.cayenne.modeler.dialog.datamap.SchemaUpdateController;
+import org.apache.cayenne.modeler.dialog.datamap.SuperclassUpdateController;
 import org.apache.cayenne.modeler.event.ProjectSavedEvent;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.util.CellRenderers;
@@ -41,14 +45,20 @@ import org.apache.cayenne.swing.components.JCayenneCheckBox;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import java.awt.BorderLayout;
 import java.util.Arrays;
 
 /**
  * Panel for editing a DataMap.
  */
-public class DataMapView extends JPanel{
+public class DataMapView extends JPanel {
 
     protected ProjectController eventController;