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/18 07:49:58 UTC

[cayenne] branch STABLE-4.0 updated (39471ad -> 4f89a09)

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

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


    from 39471ad  Update travis config
     new c53c5ae  CAY-2616 Modeler: Wrong handling of path with spaces
     new 4f89a09  CAY-2616 Modeler: Wrong handling of path with spaces

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                                  |   3 +-
 .../cayenne/modeler/CayenneModelerController.java  | 118 ++++++++-------------
 .../cayenne/modeler/ProjectFileChangeTracker.java  |  70 ++++++------
 3 files changed, 87 insertions(+), 104 deletions(-)


[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 STABLE-4.0
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit c53c5aeceef30d8d27bf03ae757603385061d3c4
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                                  |   3 +-
 .../cayenne/modeler/CayenneModelerController.java  | 105 +++++++--------------
 .../cayenne/modeler/ProjectFileChangeTracker.java  |  57 ++++++-----
 3 files changed, 68 insertions(+), 97 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index da9cb16..3c20f4e 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -1,7 +1,7 @@
 Apache Cayenne Release Notes
 ============================
 
-For the latest information visit project web site: 
+For the latest information visit project web site:
 http://cayenne.apache.org/
 
 To browse individual bug reports check out project issue tracker:
@@ -27,6 +27,7 @@ CAY-2573 DI field injection is triggered when creating sql Driver
 CAY-2582 Double insert of manyToMany relationship mapped to Set
 CAY-2584 Crypto: can't use ColumnSelect with encrypted columns
 CAY-2586 Char can't be materialized to EnumType in some cases
+CAY-2616 Modeler: Wrong handling of path with spaces
 
 ----------------------------------
 Release: 4.0.1
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 98f0bd4..fadb295 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
@@ -46,6 +46,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;
@@ -144,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)) {
@@ -220,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);
@@ -258,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);
@@ -284,68 +281,36 @@ 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) {
+    public void updateStatus(final 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();
-        }
-    }
-
-    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);
-            }
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        Thread.sleep(6 * 10000);
+                    } catch (InterruptedException ignore) {
+                    }
+                    if (message.equals(frame.getStatus().getText())) {
+                        CayenneModelerController.this.updateStatus(null);
+                    }
+                }
+            }).start();
         }
     }
 
-    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 99866d2..5889ec3 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,15 +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);
+            try {
+                addFile(project.getConfigurationResource().getURL().toURI());
 
-            Iterator<DataMap> it = ((DataChannelDescriptor) project.getRootNode()).getDataMaps().iterator();
-            while (it.hasNext()) {
-                DataMap dm = it.next();
-                addFile(dm.getConfigurationSource().getURL().getPath());
+                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();
@@ -154,11 +160,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);
         }
     }
 
@@ -169,7 +175,7 @@ public class ProjectFileChangeTracker extends Thread {
      *            path of file
      */
     public void removeFile(String location) {
-        files.remove(location);
+        files.remove(URI.create(location));
     }
 
     /**
@@ -194,7 +200,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;
@@ -208,9 +214,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
             }
@@ -254,17 +259,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
@@ -272,20 +277,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;
         }
     }


[cayenne] 02/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 STABLE-4.0
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 4f89a09ab62883844e36b066738cfeac4083fc79
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Wed Sep 18 10:49:41 2019 +0300

    CAY-2616 Modeler: Wrong handling of path with spaces
---
 .../cayenne/modeler/CayenneModelerController.java  | 25 +++++++++++++++-------
 .../cayenne/modeler/ProjectFileChangeTracker.java  | 13 ++++++-----
 2 files changed, 25 insertions(+), 13 deletions(-)

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 fadb295..a9c6e43 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
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler;
 
+import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.modeler.action.ExitAction;
 import org.apache.cayenne.modeler.action.OpenProjectAction;
 import org.apache.cayenne.modeler.dialog.validator.ValidatorDialog;
@@ -165,17 +166,14 @@ public class CayenneModelerController extends CayenneController {
     }
 
     public void projectModifiedAction() {
-        String title = (projectController.getProject().getConfigurationResource() == null)
-                ? "[New Project]"
-                : projectController.getProject().getConfigurationResource().getURL().getPath();
-        frame.setTitle("* - " + title);
+        frame.setTitle("* - " + getProjectLocationString());
     }
 
     public void projectSavedAction() {
         projectController.setDirty(false);
         projectController.updateProjectControllerPreferences();
         updateStatus("Project saved...");
-        frame.setTitle(projectController.getProject().getConfigurationResource().getURL().getPath());
+        frame.setTitle(getProjectLocationString());
     }
 
     /**
@@ -217,18 +215,17 @@ public class CayenneModelerController extends CayenneController {
         // do status update AFTER the project is actually opened...
         if (project.getConfigurationResource() == null) {
             updateStatus("New project created...");
-            frame.setTitle("[New Project]");
         } else {
             updateStatus("Project opened...");
             try {
-                File file = new File(project.getConfigurationResource().getURL().toURI());
-                frame.setTitle(file.toString());
                 // update preferences
+                File file = new File(project.getConfigurationResource().getURL().toURI());
                 getLastDirectory().setDirectory(file);
                 frame.fireRecentFileListChanged();
             } catch (URISyntaxException ignore) {
             }
         }
+        frame.setTitle(getProjectLocationString());
 
         PROJECT_STATE_UTIL.fireLastState(projectController);
 
@@ -313,4 +310,16 @@ public class CayenneModelerController extends CayenneController {
         }
     }
 
+    protected String getProjectLocationString() {
+        if(projectController.getProject().getConfigurationResource() == null) {
+            return "[New Project]";
+        }
+        try {
+            File projectFile = new File(projectController.getProject().getConfigurationResource().getURL().toURI());
+            return projectFile.toString();
+        } catch (URISyntaxException e) {
+            throw new CayenneRuntimeException("Invalid project source URL", e);
+        }
+    }
+
 }
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 5889ec3..64105e3 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
@@ -109,11 +109,14 @@ public class ProjectFileChangeTracker extends Thread {
 
                     // 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);
+                        try {
+                            File fileDirectory = new File(mediator.getProject().getConfigurationResource().getURL().toURI());
+                            Application.getInstance().getActionManager().getAction(OpenProjectAction.class)
+                                    .openProject(fileDirectory);
+                        } catch (URISyntaxException ex) {
+                            throw new CayenneRuntimeException("Unable to open file %s", ex,
+                                    mediator.getProject().getConfigurationResource().getURL());
+                        }
                     }
                 } else {
                     mediator.setDirty(true);