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

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


The following commit(s) were added to refs/heads/master by this push:
     new 50befe6  Fix issue when using config files in read-only locations.
50befe6 is described below

commit 50befe67095a8c137ecc1e9aedb3350b6a10e787
Author: JamesBognar <jamesbog...@apache.org>
AuthorDate: Sat Apr 28 16:27:09 2018 -0400

    Fix issue when using config files in read-only locations.
---
 .../juneau/config/store/ConfigFileStore.java       | 60 ++++++++++++++--------
 1 file changed, 39 insertions(+), 21 deletions(-)

diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
index 8d89336..e87e57c 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
@@ -223,8 +223,11 @@ public class ConfigFileStore extends ConfigStore {
                if (! Files.exists(p)) 
                        return "";
                
-               try (FileChannel fc = FileChannel.open(p, READ, WRITE, CREATE)) 
{
-                       try (FileLock lock = fc.lock()) {
+               boolean isWritable = isWritable(p);
+               OpenOption[] oo = isWritable ? new 
OpenOption[]{READ,WRITE,CREATE} : new OpenOption[]{READ};
+               
+               try (FileChannel fc = FileChannel.open(p, oo)) {
+                       try (FileLock lock = isWritable ? fc.lock() : null) {
                                ByteBuffer buf = ByteBuffer.allocate(1024);
                                StringBuilder sb = new StringBuilder();
                                while (fc.read(buf) != -1) {
@@ -255,27 +258,29 @@ public class ConfigFileStore extends ConfigStore {
                if ((!exists) && (!isEmpty(expectedContents)))
                        return "";
                
-               try (FileChannel fc = FileChannel.open(p, READ, WRITE, CREATE)) 
{
-                       try (FileLock lock = fc.lock()) {
-                               String currentContents = "";
-                               if (exists) {
-                                       ByteBuffer buf = 
ByteBuffer.allocate(1024);
-                                       StringBuilder sb = new StringBuilder();
-                                       while (fc.read(buf) != -1) {
-                                               
sb.append(charset.decode((ByteBuffer)(buf.flip())));
-                                               buf.clear();
+               if (isWritable(p)) {
+                       try (FileChannel fc = FileChannel.open(p, READ, WRITE, 
CREATE)) {
+                               try (FileLock lock = fc.lock()) {
+                                       String currentContents = "";
+                                       if (exists) {
+                                               ByteBuffer buf = 
ByteBuffer.allocate(1024);
+                                               StringBuilder sb = new 
StringBuilder();
+                                               while (fc.read(buf) != -1) {
+                                                       
sb.append(charset.decode((ByteBuffer)(buf.flip())));
+                                                       buf.clear();
+                                               }
+                                               currentContents = sb.toString();
                                        }
-                                       currentContents = sb.toString();
-                               }
-                               if (expectedContents != null && ! 
isEquals(currentContents, expectedContents)) {
-                                       if (currentContents == null)
-                                               cache.remove(name);
-                                       else
-                                               cache.put(name, 
currentContents);
-                                       return currentContents;
+                                       if (expectedContents != null && ! 
isEquals(currentContents, expectedContents)) {
+                                               if (currentContents == null)
+                                                       cache.remove(name);
+                                               else
+                                                       cache.put(name, 
currentContents);
+                                               return currentContents;
+                                       }
+                                       fc.position(0);
+                                       fc.write(charset.encode(newContents));
                                }
-                               fc.position(0);
-                               fc.write(charset.encode(newContents));
                        }
                }
                
@@ -286,6 +291,19 @@ public class ConfigFileStore extends ConfigStore {
                
                return null;
        }
+       
+       private synchronized boolean isWritable(Path p) {
+               try {
+                       if (! Files.exists(p)) {
+                               Files.createDirectories(p.getParent());
+                               if (! Files.exists(p))
+                                       p.toFile().createNewFile();
+                       }
+               } catch (IOException e) {
+                       return false;
+               }
+               return Files.isWritable(p);
+       }
                
        @Override /* ConfigStore */
        public synchronized ConfigFileStore update(String name, String 
newContents) {

-- 
To stop receiving notification emails like this one, please contact
jamesbog...@apache.org.

Reply via email to