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 2019/09/12 13:24:20 UTC

[cayenne] branch master updated (90d1dfe -> a206d11)

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 90d1dfe  CAY-2592 Modeler: make all datamaps selected in global cgen tab
     new dca7e03  CAY-2616 Modeler: Wrong handling of path with spaces
     new a206d11  CAY-2617 NPE in processing hierarchical prefetch node  - process null case

The 2 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:
 RELEASE-NOTES.txt                                  |   1 +
 .../org/apache/cayenne/access/ObjectResolver.java  |   7 +-
 .../cayenne/access/PrefetchProcessorJointNode.java |   6 +-
 .../cayenne/modeler/CayenneModelerController.java  | 110 ++++++-------------
 .../cayenne/modeler/ProjectFileChangeTracker.java  | 121 +++++++++++----------
 5 files changed, 101 insertions(+), 144 deletions(-)


[cayenne] 02/02: CAY-2617 NPE in processing hierarchical prefetch node - process null case

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 a206d11be983c1ec1557f39c0de292d1b0a02eb0
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Sep 12 15:32:13 2019 +0300

    CAY-2617 NPE in processing hierarchical prefetch node
     - process null case
---
 .../src/main/java/org/apache/cayenne/access/ObjectResolver.java    | 7 +++----
 .../java/org/apache/cayenne/access/PrefetchProcessorJointNode.java | 6 ++----
 2 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
index 50a0023..c04d082 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
@@ -290,12 +290,11 @@ class ObjectResolver {
 
 			// null either means a bug in Cayenne (e.g. CAY-2101) or the inheritance qualifiers are messed up
 			if(entityName == null) {
-
 				if(LOGGER.isWarnEnabled()) {
-					LOGGER.warn("** Null entity name for DataRow, can't resolve sub descriptor for "
-							+ descriptor.getEntity().getName());
-					return descriptor;
+					LOGGER.warn("** Null entity name for DataRow, can't resolve sub descriptor for {}",
+							descriptor.getEntity().getName());
 				}
+				return descriptor;
 			}
 
 			return context.getEntityResolver().getClassDescriptor(entityName);
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
index 651124c..ccf8a46 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
@@ -139,12 +139,10 @@ class PrefetchProcessorJointNode extends PrefetchProcessorNode {
             row.put(column.getName(), flatRow.get(column.getDataRowKey()));
         }
 
-        // since JDBC row reader won't inject JOINED entity name, we have to
-        // detect it here...
-
+        // since JDBC row reader won't inject JOINED entity name, we have to detect it here...
         ClassDescriptor descriptor = resolver.getDescriptor();
         ObjEntity entity = descriptor.getEntityInheritanceTree().entityMatchingRow(row);
-        row.setEntityName(entity.getName());
+        row.setEntityName(entity == null ? null : entity.getName());
         return row;
     }
 


[cayenne] 01/02: CAY-2616 Modeler: Wrong handling of path with spaces

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 dca7e03afc152a9073e24aa58f441d0b4aab88bc
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Sep 12 11:37:17 2019 +0300

    CAY-2616 Modeler: Wrong handling of path with spaces
---
 RELEASE-NOTES.txt                                  |   1 +
 .../cayenne/modeler/CayenneModelerController.java  | 110 ++++++-------------
 .../cayenne/modeler/ProjectFileChangeTracker.java  | 121 +++++++++++----------
 3 files changed, 96 insertions(+), 136 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 5ece547..bd2f1c5 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -95,6 +95,7 @@ CAY-2605 Modeler: Unable to save - java.nio.file.InvalidPathException
 CAY-2606 Can't resolve obj path with embeddable component
 CAY-2608 CayenneModeler: NPE when reverse engineering with an auto-adapter DataSource
 CAY-2609 Modeler: can't close dbImport result dialog window
+CAY-2616 Modeler: Wrong handling of path with spaces
 
 ----------------------------------
 Release: 4.1.B1
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
index 1e242c5..094a77e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerController.java
@@ -47,6 +47,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.File;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -67,7 +68,8 @@ public class CayenneModelerController extends CayenneController {
 
 	private DbImportController dbImportController;
 
-    public CayenneModelerController(){}
+    public CayenneModelerController(){
+    }
 
     public CayenneModelerController(Application application) {
         super(application);
@@ -115,12 +117,7 @@ public class CayenneModelerController extends CayenneController {
         // Register a hook to save the window position when quit via the app menu.
         // This is in Mac OSX only.
         if (System.getProperty("os.name").startsWith("Mac OS")) {
-            Runnable runner = new Runnable() {
-                @Override
-                public void run() {
-                    PROJECT_STATE_UTIL.saveLastState(projectController);
-                }
-            };
+            Runnable runner = () -> PROJECT_STATE_UTIL.saveLastState(projectController);
             Runtime.getRuntime().addShutdownHook(new Thread(runner, "Window Prefs Hook"));
         }
 
@@ -148,8 +145,7 @@ public class CayenneModelerController extends CayenneController {
         }
 
         if (fileList != null) {
-
-        File transferFile = fileList.get(0);
+            File transferFile = fileList.get(0);
             if (transferFile.isFile()) {
                 FileFilter filter = FileFilters.getApplicationFilter();
                 if (filter.accept(transferFile)) {
@@ -224,13 +220,14 @@ public class CayenneModelerController extends CayenneController {
             frame.setTitle("[New Project]");
         } else {
             updateStatus("Project opened...");
-            frame.setTitle(project.getConfigurationResource().getURL().getPath());
-        }
-
-        // update preferences
-        if (project.getConfigurationResource() != null) {
-            getLastDirectory().setDirectory(new File(project.getConfigurationResource().getURL().getPath()));
-            frame.fireRecentFileListChanged();
+            try {
+                File file = new File(project.getConfigurationResource().getURL().toURI());
+                frame.setTitle(file.toString());
+                // update preferences
+                getLastDirectory().setDirectory(file);
+                frame.fireRecentFileListChanged();
+            } catch (URISyntaxException ignore) {
+            }
         }
 
         PROJECT_STATE_UTIL.fireLastState(projectController);
@@ -262,15 +259,11 @@ public class CayenneModelerController extends CayenneController {
 
 	/** Adds path to the list of last opened projects in preferences. */
     public void addToLastProjListAction(File file) {
-
         Preferences prefLastProjFiles = ModelerPreferences.getLastProjFilesPref();
         List<File> arr = ModelerPreferences.getLastProjFiles();
-        // Add proj path to the preferences
-        // Prevent duplicate entries.
-        if (arr.contains(file)) {
-            arr.remove(file);
-        }
 
+        // Add proj path to the preferences
+        arr.remove(file);
         arr.add(0, file);
         while (arr.size() > ModelerPreferences.LAST_PROJ_FILES_SIZE) {
             arr.remove(arr.size() - 1);
@@ -288,16 +281,32 @@ public class CayenneModelerController extends CayenneController {
         }
     }
 
+    public void changePathInLastProjListAction(File oldFile, File newFile) {
+        ModelerPreferences.getLastProjFiles().remove(oldFile);
+
+        addToLastProjListAction(newFile);
+
+        getLastDirectory().setDirectory(newFile);
+        frame.fireRecentFileListChanged();
+    }
+
     /**
-     * Performs status bar update with a message. Message will dissappear in 6 seconds.
+     * Performs status bar update with a message. Message will disappear in 6 seconds.
      */
     public void updateStatus(String message) {
         frame.getStatus().setText(message);
 
         // start message cleanup thread that would remove the message after X seconds
         if (message != null && message.trim().length() > 0) {
-            Thread cleanup = new ExpireThread(message, 6);
-            cleanup.start();
+            new Thread(() -> {
+                try {
+                    Thread.sleep(6 * 10000);
+                } catch (InterruptedException ignore){
+                }
+                if (message.equals(frame.getStatus().getText())) {
+                    updateStatus(null);
+                }
+            }).start();
         }
     }
 
@@ -305,55 +314,4 @@ public class CayenneModelerController extends CayenneController {
         return dbImportController;
     }
 
-    class ExpireThread extends Thread {
-
-        int seconds;
-        protected String message;
-
-        ExpireThread(String message, int seconds) {
-            this.seconds = seconds;
-            this.message = message;
-        }
-
-        @Override
-        public void run() {
-            try {
-                sleep(seconds * 1000);
-            } catch (InterruptedException e) {
-                // ignore exception
-            }
-
-            if (message.equals(frame.getStatus().getText())) {
-                updateStatus(null);
-            }
-        }
-    }
-
-    public void changePathInLastProjListAction(File oldFile, File newFile) {
-        Preferences frefLastProjFiles = ModelerPreferences.getLastProjFilesPref();
-        List<File> arr = ModelerPreferences.getLastProjFiles();
-
-        // Add proj path to the preferences
-        arr.remove(oldFile);
-        arr.remove(newFile);
-        arr.add(0, newFile);
-        while (arr.size() > ModelerPreferences.LAST_PROJ_FILES_SIZE) {
-            arr.remove(arr.size() - 1);
-        }
-
-        try {
-            frefLastProjFiles.clear();
-        } catch (BackingStoreException e) {
-            // ignore exception
-        }
-
-        int size = arr.size();
-        for (int i = 0; i < size; i++) {
-            frefLastProjFiles.put(String.valueOf(i), arr.get(i).getAbsolutePath());
-        }
-
-        getLastDirectory().setDirectory(newFile);
-        frame.fireRecentFileListChanged();
-    }
-	
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectFileChangeTracker.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectFileChangeTracker.java
index 59fd435..856f561 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectFileChangeTracker.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectFileChangeTracker.java
@@ -19,6 +19,8 @@
 package org.apache.cayenne.modeler;
 
 import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -26,6 +28,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.action.OpenProjectAction;
@@ -42,7 +45,7 @@ import org.slf4j.LoggerFactory;
  */
 public class ProjectFileChangeTracker extends Thread {
 
-    private static final Logger log = LoggerFactory.getLogger(ProjectFileChangeTracker.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(ProjectFileChangeTracker.class);
 
     /**
      * The default delay between every file modification check
@@ -52,16 +55,16 @@ public class ProjectFileChangeTracker extends Thread {
     /**
      * The names of the files to observe for changes.
      */
-    protected Map<String, FileInfo> files;
+    protected final Map<URI, FileInfo> files;
+    protected final ProjectController mediator;
+
     protected boolean paused;
     protected boolean isShownChangeDialog;
     protected boolean isShownRemoveDialog;
-    protected ProjectController mediator;
-    public ProjectFileChangeTracker(ProjectController mediator) {
 
+    public ProjectFileChangeTracker(ProjectController mediator) {
         this.files = new ConcurrentHashMap<>();
         this.mediator = mediator;
-
         setName("cayenne-modeler-file-change-tracker");
     }
 
@@ -78,18 +81,18 @@ public class ProjectFileChangeTracker extends Thread {
 
         // check if project exists and has been saved at least once.
         if (project != null && project.getConfigurationResource() != null) {
-            String projectPath = project.getConfigurationResource().getURL().getPath() + File.separator;
-            addFile(projectPath);
-
-            Iterator<DataMap> it = ((DataChannelDescriptor) project.getRootNode()).getDataMaps().iterator();
-            while (it.hasNext()) {
-                DataMap dm = it.next();
-                if(dm.getConfigurationSource() != null) {
-                    // if DataMap is in separate file, monitor it
-                    addFile(dm.getConfigurationSource().getURL().getPath());
+            try {
+                addFile(project.getConfigurationResource().getURL().toURI());
+
+                for (DataMap dm : ((DataChannelDescriptor) project.getRootNode()).getDataMaps()) {
+                    if (dm.getConfigurationSource() != null) {
+                        // if DataMap is in separate file, monitor it
+                        addFile(dm.getConfigurationSource().getURL().toURI());
+                    }
                 }
+            } catch (URISyntaxException ex) {
+                throw new CayenneRuntimeException("Unable to start change tracker", ex);
             }
-
         }
 
         resumeWatching();
@@ -97,48 +100,47 @@ public class ProjectFileChangeTracker extends Thread {
 
     protected void doOnChange() {
 
-        SwingUtilities.invokeLater(new Runnable() {
-
-            public void run() {
-                isShownChangeDialog = true;
-                if (showConfirmation("One or more project files were changed by external program. "
-                        + "Do you want to load the changes?")) {
-
-                    // Currently we are reloading all project
-                    if (mediator.getProject() != null) {
-
-                        File fileDirectory = new File(mediator.getProject().getConfigurationResource().getURL()
-                                .getPath());
-                        Application.getInstance().getActionManager().getAction(OpenProjectAction.class)
-                                .openProject(fileDirectory);
+        SwingUtilities.invokeLater(() -> {
+            isShownChangeDialog = true;
+            if (showConfirmation("One or more project files were changed by external program. "
+                    + "Do you want to load the changes?")) {
+
+                // Currently we are reloading all project
+                if (mediator.getProject() != null) {
+                    File fileDirectory;
+                    try {
+                        fileDirectory = new File(mediator.getProject().getConfigurationResource().getURL().toURI());
+                    } catch (URISyntaxException e) {
+                        throw new CayenneRuntimeException("Unable to open project %s",
+                                e, mediator.getProject().getConfigurationResource().getURL());
                     }
-                } else {
-                    mediator.setDirty(true);
+                    Application.getInstance().getActionManager()
+                            .getAction(OpenProjectAction.class)
+                            .openProject(fileDirectory);
                 }
-                isShownChangeDialog = false;
+            } else {
+                mediator.setDirty(true);
             }
+            isShownChangeDialog = false;
         });
     }
 
     protected void doOnRemove() {
         if (mediator.getProject() != null) {
 
-            SwingUtilities.invokeLater(new Runnable() {
-
-                public void run() {
-                    isShownRemoveDialog = true;
-                    FileDeletedDialog dialog = new FileDeletedDialog(Application.getFrame());
-                    dialog.show();
+            SwingUtilities.invokeLater(() -> {
+                isShownRemoveDialog = true;
+                FileDeletedDialog dialog = new FileDeletedDialog(Application.getFrame());
+                dialog.show();
 
-                    if (dialog.shouldSave()) {
-                        Application.getInstance().getActionManager().getAction(SaveAction.class).performAction(null);
-                    } else if (dialog.shouldClose()) {
-                        Application.getInstance().getFrameController().projectClosedAction();
-                    } else {
-                        mediator.setDirty(true);
-                    }
-                    isShownRemoveDialog = false;
+                if (dialog.shouldSave()) {
+                    Application.getInstance().getActionManager().getAction(SaveAction.class).performAction(null);
+                } else if (dialog.shouldClose()) {
+                    Application.getInstance().getFrameController().projectClosedAction();
+                } else {
+                    mediator.setDirty(true);
                 }
+                isShownRemoveDialog = false;
             });
         }
     }
@@ -157,11 +159,11 @@ public class ProjectFileChangeTracker extends Thread {
      * @param location
      *            path of file
      */
-    public void addFile(String location) {
+    public void addFile(URI location) {
         try {
             files.put(location, new FileInfo(location));
         } catch (SecurityException e) {
-            log.error("SecurityException adding file " + location, e);
+            LOGGER.error("SecurityException adding file " + location, e);
         }
     }
 
@@ -172,7 +174,7 @@ public class ProjectFileChangeTracker extends Thread {
      *            path of file
      */
     public void removeFile(String location) {
-        files.remove(location);
+        files.remove(URI.create(location));
     }
 
     /**
@@ -197,7 +199,7 @@ public class ProjectFileChangeTracker extends Thread {
             try {
                 fileExists = fi.getFile().exists();
             } catch (SecurityException e) {
-                log.error("SecurityException checking file " + fi.getFile().getPath(), e);
+                LOGGER.error("SecurityException checking file " + fi.getFile().getPath(), e);
 
                 // we still process with other files
                 continue;
@@ -211,9 +213,8 @@ public class ProjectFileChangeTracker extends Thread {
                     fi.setLastModified(l);
                     hasChanges = true;
                 }
-            }
-            // the file has been removed
-            else if (fi.getLastModified() != -1) {
+            } else if (fi.getLastModified() != -1) {
+                // the file has been removed
                 hasDeletions = true;
                 it.remove(); // no point to watch the file now
             }
@@ -257,17 +258,17 @@ public class ProjectFileChangeTracker extends Thread {
      * Class to store information about files (last modification time & File
      * pointer)
      */
-    protected class FileInfo {
+    protected static class FileInfo {
 
         /**
          * Exact java.io.File object, may not be null
          */
-        File file;
+        private final File file;
 
         /**
          * Time the file was modified
          */
-        long lastModified;
+        private long lastModified;
 
         /**
          * Creates new object
@@ -275,20 +276,20 @@ public class ProjectFileChangeTracker extends Thread {
          * @param location
          *            the file path
          */
-        public FileInfo(String location) {
+        protected FileInfo(URI location) {
             file = new File(location);
             lastModified = file.exists() ? file.lastModified() : -1;
         }
 
-        public File getFile() {
+        protected File getFile() {
             return file;
         }
 
-        public long getLastModified() {
+        protected long getLastModified() {
             return lastModified;
         }
 
-        public void setLastModified(long l) {
+        protected void setLastModified(long l) {
             lastModified = l;
         }
     }