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