You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by rw...@apache.org on 2015/07/16 12:59:00 UTC

svn commit: r1691353 - in /stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main: java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/ resources/OSGI-INF/metatype/

Author: rwesten
Date: Thu Jul 16 10:58:59 2015
New Revision: 1691353

URL: http://svn.apache.org/r1691353
Log:
implementation of STANBOL-1438

Added:
    stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/DirectoryDataFileProvider.java
Modified:
    stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/MainDataFileProvider.java
    stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/resources/OSGI-INF/metatype/metatype.properties

Added: stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/DirectoryDataFileProvider.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/DirectoryDataFileProvider.java?rev=1691353&view=auto
==============================================================================
--- stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/DirectoryDataFileProvider.java (added)
+++ stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/DirectoryDataFileProvider.java Thu Jul 16 10:58:59 2015
@@ -0,0 +1,126 @@
+package org.apache.stanbol.commons.stanboltools.datafileprovider.impl;
+
+import static org.apache.stanbol.commons.stanboltools.datafileprovider.impl.MainDataFileProvider.requireProperty;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Map;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.ConfigurationPolicy;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.stanbol.commons.stanboltools.datafileprovider.DataFileProvider;
+import org.osgi.framework.Constants;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(immediate=true,policy=ConfigurationPolicy.REQUIRE, 
+    configurationFactory=true, metatype=true)
+@Service
+@Property(name=Constants.SERVICE_RANKING, intValue=0)
+public class DirectoryDataFileProvider implements DataFileProvider {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    
+    @Property
+    public static final String DATA_FILES_FOLDER_PROP = MainDataFileProvider.DATA_FILES_FOLDER_PROP;
+    private File dataFilesFolder;
+
+    @Activate
+    protected void activate(ComponentContext ctx) throws ConfigurationException {
+        String folderName = requireProperty(ctx.getProperties(), DATA_FILES_FOLDER_PROP, String.class);
+        dataFilesFolder = new File(folderName);
+        if(!dataFilesFolder.exists()){
+            if(!dataFilesFolder.mkdirs()){
+                throw new ConfigurationException(DATA_FILES_FOLDER_PROP, "Unable to create the configured Directory "+dataFilesFolder);
+            }
+        } else if(!dataFilesFolder.isDirectory()){
+            throw new ConfigurationException(DATA_FILES_FOLDER_PROP, "The configured DataFile directory "+dataFilesFolder+" does already exists but is not a directory!");
+        } //else exists and is a directory!
+    }
+
+    
+    @Override
+    public InputStream getInputStream(final String bundleSymbolicName, final String filename, Map<String,String> comments)
+            throws IOException {
+        try {
+            return AccessController.doPrivileged(new PrivilegedExceptionAction<InputStream>() {
+                @Override
+                public InputStream run() throws IOException {
+                    File dataFile = getDataFile(bundleSymbolicName, filename);
+                    if(dataFile == null){
+                        throw new IOException(new StringBuilder("Datafile '").append(filename)
+                            .append("' not present in directory '"+dataFilesFolder+"'").toString());
+                    } else {
+                        return new FileInputStream(dataFile);
+                    }
+                }
+            });
+        } catch (PrivilegedActionException pae) {
+            Exception e = pae.getException();
+            if(e instanceof IOException){
+                throw (IOException)e;
+            } else {
+                throw RuntimeException.class.cast(e);
+            }
+        }
+    }
+    
+    
+
+    @Override
+    public boolean isAvailable(final String bundleSymbolicName, final String filename, Map<String,String> comments) {
+        try {
+            return AccessController.doPrivileged(new PrivilegedExceptionAction<Boolean>() {
+                @Override
+                public Boolean run() throws IOException {
+                    return getDataFile(bundleSymbolicName, filename) != null;
+                }
+            });
+        } catch (PrivilegedActionException pae) {
+            Exception e = pae.getException();
+            throw RuntimeException.class.cast(e);
+        }
+    }
+    
+    
+    /**
+     * @param bundleSymbolicName
+     * @param filename
+     * @return
+     */
+    private File getDataFile(String bundleSymbolicName, final String filename) {
+        // First look for the file in our data folder,
+        // with and without bundle symbolic name prefix
+        final String [] candidateNames = bundleSymbolicName == null ? 
+                new String[]{filename} : 
+                    new String[]{
+                        bundleSymbolicName + "-" + filename,
+                        filename
+                    };
+        File dataFile = null;
+        for(String name : candidateNames) {
+            dataFile = new File(dataFilesFolder, name);
+            log.debug("Looking for file {}", dataFile.getAbsolutePath());
+            if(dataFile.exists() && dataFile.canRead()) {
+                log.debug("File found in data files folder: {}", filename);
+                break;
+            } else {
+                dataFile = null;
+            }
+        }
+        return dataFile;
+    }
+
+}

Modified: stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/MainDataFileProvider.java
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/MainDataFileProvider.java?rev=1691353&r1=1691352&r2=1691353&view=diff
==============================================================================
--- stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/MainDataFileProvider.java (original)
+++ stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/java/org/apache/stanbol/commons/stanboltools/datafileprovider/impl/MainDataFileProvider.java Thu Jul 16 10:58:59 2015
@@ -136,7 +136,7 @@ public class MainDataFileProvider implem
     }
     
     @SuppressWarnings("unchecked")
-    private <ResultType> ResultType requireProperty(Dictionary<?, ?> props, String name, Class<ResultType> clazz) 
+    static <ResultType> ResultType requireProperty(Dictionary<?, ?> props, String name, Class<ResultType> clazz) 
     throws ConfigurationException {
         final Object o = props.get(name);
         if(o == null) {

Modified: stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1691353&r1=1691352&r2=1691353&view=diff
==============================================================================
--- stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/resources/OSGI-INF/metatype/metatype.properties (original)
+++ stanbol/branches/release-0.12/commons/stanboltools/datafileprovider/src/main/resources/OSGI-INF/metatype/metatype.properties Thu Jul 16 10:58:59 2015
@@ -18,8 +18,19 @@ org.apache.stanbol.commons.stanboltools.
 	read-only data files for Stanbol components. Delegates to other DataFileProviders unless the requested \
 	file is found in its data files directory   
 
+
+org.apache.stanbol.commons.stanboltools.datafileprovider.impl.DirectoryDataFileProvider.name=Directory DataFileProvider
+org.apache.stanbol.commons.stanboltools.datafileprovider.impl.DirectoryDataFileProvider.description=\
+Provides data files from the configured directory.
+
 data.files.folder.name = Data files folder 
 data.files.folder.description = Path (absolute or relative) where data files can be found
 
 max.events.name = Max. events
-max.events.description = Maximum number of DataFileProviderEvents to keep
\ No newline at end of file
+max.events.description = Maximum number of DataFileProviderEvents to keep
+
+service.ranking.name=Ranking
+service.ranking.description=The ranking of a DataFileProvider determines the order \
+in that files are looked for. If two DataFileProvider can provide a requested file \
+it will be returned from those with the higher ranking. Typically backup \
+DataFileProvider should use a negative ranking.
\ No newline at end of file