Author: rwesten
Date: Mon Feb 24 05:16:07 2014
New Revision: 1571146
URL: http://svn.apache.org/r1571146
Log:
STANBOL-1280: first implementation of EnhancementProperties for the 0.12 branch
(sheduled for 0.12.1 release)
Added:
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EnhancementPropertyException.java
Modified:
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EngineException.java
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/ContentItemHelper.java
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/EnhancementEngineHelper.java
stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/reader/ContentItemReader.java
stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/utils/EnhancementPropertiesHelper.java
Modified:
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EngineException.java
URL:
http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EngineException.java?rev=1571146&r1=1571145&r2=1571146&view=diff
==============================================================================
---
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EngineException.java
(original)
+++
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EngineException.java
Mon Feb 24 05:16:07 2014
@@ -29,15 +29,33 @@ package org.apache.stanbol.enhancer.serv
public class EngineException extends EnhancementException {
private static final long serialVersionUID = 1L;
-
+ private EnhancementEngine enhancementEngine;
+ private ContentItem contentItem;
+ /**
+ *
+ * @param message
+ * @deprecated use the constructor with {@link EnhancementEngine} and
+ * {@link ContentItem} instead
+ */
public EngineException(String message) {
super(message);
}
-
+ /**
+ *
+ * @param message
+ * @param cause
+ * @deprecated use the constructor with {@link EnhancementEngine} and
+ * {@link ContentItem} instead
+ */
public EngineException(String message, Throwable cause) {
super(message, cause);
}
-
+ /**
+ *
+ * @param cause
+ * @deprecated use the constructor with {@link EnhancementEngine} and
+ * {@link ContentItem} instead
+ */
public EngineException(Throwable cause) {
super(cause);
}
@@ -50,5 +68,26 @@ public class EngineException extends Enh
"'%s' failed to process content item '%s' with type '%s': %s",
ee.getClass().getSimpleName(), ci.getUri().getUnicodeString(),
ci.getMimeType(),
message == null ? cause : message), cause);
+ this.enhancementEngine = ee;
+ this.contentItem = ci;
+
+ }
+
+ /**
+ * The EnhancementEngine parsed to the Exception
+ * @return
+ * @since 0.12.1
+ */
+ public EnhancementEngine getEnhancementEngine() {
+ return enhancementEngine;
+ }
+
+ /**
+ * The ContentITem parsed to the Exception
+ * @return
+ * @since 0.12.1
+ */
+ public ContentItem getContentItem() {
+ return contentItem;
}
}
Added:
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EnhancementPropertyException.java
URL:
http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EnhancementPropertyException.java?rev=1571146&view=auto
==============================================================================
---
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EnhancementPropertyException.java
(added)
+++
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/EnhancementPropertyException.java
Mon Feb 24 05:16:07 2014
@@ -0,0 +1,28 @@
+package org.apache.stanbol.enhancer.servicesapi;
+
+/**
+ * Exection thorwn if the an Enhancement Property parsed to an engine is
+ * missing or has an invalid value
+ *
+ * @since 0.12.1
+ *
+ */
+public class EnhancementPropertyException extends EngineException {
+
+ private static final long serialVersionUID = 1L;
+
+ private String property;
+
+ public EnhancementPropertyException(EnhancementEngine ee, ContentItem ci,
String property, String reason, Throwable t){
+ super(ee,ci, new StringBuilder("Enhancement Property '")
+ .append(property).append("' - ").append(reason).toString(),t);
+ this.property = property;
+
+ }
+
+ public String getProperty() {
+ return property;
+ }
+
+
+}
Modified:
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/ContentItemHelper.java
URL:
http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/ContentItemHelper.java?rev=1571146&r1=1571145&r2=1571146&view=diff
==============================================================================
---
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/ContentItemHelper.java
(original)
+++
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/ContentItemHelper.java
Mon Feb 24 05:16:07 2014
@@ -351,4 +351,74 @@ public class ContentItemHelper {
return mimeType.toString();
}
+ /*
+ * EnhancementProperties support for 0.12 (see STANBOL-1280)
+ */
+ /**
+ * URI used to register an {@link ContentItem#getPart(int, Class)
contentPart}
+ * of the type {@link Map Map<String,Objext>} containing the
+ * EnhancementEngine properties <p>
+ */
+ public static final UriRef ENHANCEMENT_PROPERTIES_URI = new UriRef(
+ "urn:apache.org:stanbol.web:enhancement.properties");
+
+ /**
+ * Getter for the EnhancementProperties content part
+ * @param ci the content item
+ * @return the content part or <code>null</code> if not present.
+ */
+ @SuppressWarnings("unchecked")
+ public static Map<String,Object>
getEnhancementPropertiesContentPart(ContentItem ci){
+ if(ci == null){
+ throw new IllegalArgumentException("The parsed ContentItem MUST
NOT be NULL!");
+ }
+ ci.getLock().readLock().lock();
+ try {
+ return ci.getPart(ENHANCEMENT_PROPERTIES_URI, Map.class);
+ } catch (NoSuchPartException e) {
+ return null;
+ } finally{
+ ci.getLock().readLock().unlock();
+ }
+
+ }
+
+ /**
+ * Initialises the EnhancementProperties ContentPart for an {@link
ContentItem}.
+ * If the content part is already present it will just return the
existing. If
+ * not it will register an empty one. The content part is registered with
+ * the URI {@link #ENHANCEMENT_PROPERTIES_URI}
+ * @param ci the contentItem MUST NOT be NULL
+ * @return the enhancement properties
+ * @throws IllegalArgumentException if <code>null</code> is parsed as
{@link ContentItem}.
+ */
+ @SuppressWarnings("unchecked")
+ public static Map<String,Object>
initEnhancementPropertiesContentPart(ContentItem ci){
+ if(ci == null){
+ throw new IllegalArgumentException("The parsed ContentItem MUST
NOT be NULL!");
+ }
+ Map<String,Object> enhancementProperties;
+ ci.getLock().readLock().lock();
+ try {
+ enhancementProperties = ci.getPart(ENHANCEMENT_PROPERTIES_URI,
Map.class);
+ } catch (NoSuchPartException e) {
+ enhancementProperties = null;
+ } finally{
+ ci.getLock().readLock().unlock();
+ }
+ if(enhancementProperties == null){
+ ci.getLock().writeLock().lock();
+ try { //check again ... maybe an other thread has added this part
+ enhancementProperties = ci.getPart(ENHANCEMENT_PROPERTIES_URI,
Map.class);
+ } catch (NoSuchPartException e) {
+ enhancementProperties = new HashMap<String,Object>();
+ ci.addPart(ENHANCEMENT_PROPERTIES_URI, enhancementProperties);
+ } finally{
+ ci.getLock().writeLock().unlock();
+ }
+ } //else was already present
+ return enhancementProperties;
+ }
+
+
}
Modified:
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/EnhancementEngineHelper.java
URL:
http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/EnhancementEngineHelper.java?rev=1571146&r1=1571145&r2=1571146&view=diff
==============================================================================
---
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/EnhancementEngineHelper.java
(original)
+++
stanbol/branches/release-0.12/enhancer/generic/servicesapi/src/main/java/org/apache/stanbol/enhancer/servicesapi/helper/EnhancementEngineHelper.java
Mon Feb 24 05:16:07 2014
@@ -29,6 +29,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Random;
import java.util.UUID;
@@ -760,4 +761,63 @@ public class EnhancementEngineHelper {
ci.getLock().readLock().unlock();
}
}
+
+ /*
+ * Helper Methods for retrieving EnhancementProperties in 0.12 from the
+ * parsed ContentItem (see STANBOL-1280).
+ * NOTE: in 1.0.0 those are obsolete as EnhancementProperties will be
parsed
+ * as additional parameter to the computeEnhancement method.
+ */
+ /**
+ * Retrieves the Enhancement Properties for the parsed Engine from the
ContentItem.
+ * <p>
+ * The returned map will contain: <ul>
+ * <li> all properties with a key that does NOT include a '<code>:</code>'
+ * <li> all properties with a key starting with
'<code>{engine-name}:</code>'
+ * </ul>
+ * NOTE: that only properties containing '<code>enhancer.</code>' will get
+ * parsed from Enhancement Requests.<p>
+ * See <a
href="https://issues.apache.org/jira/browse/STANBOL-488">STANBOL-488</a>
+ * for the specification of Enhancement Properties and
+ * <a
href="https://issues.apache.org/jira/browse/STANBOL-1280">STANBOL-1280</a>
+ * for the list of features supported inStanbol version
<code>0.12.1+</code>
+ * @param engine the enhancement engine requesting the properties
+ * @param ci the content item (representing the enhancement request).
+ * @return The enhancement properties. This is a read/write copy of the
+ * read-only content part.
+ */
+ public static Map<String,Object>
getEnhancementProperties(EnhancementEngine engine, ContentItem ci){
+ if(engine == null){
+ throw new IllegalArgumentException("The parsed EnhancementEngine
MUST NOT be NULL");
+ }
+ if(ci == null){
+ throw new IllegalArgumentException("The parsed ContentItem MUST
NOT be NULL");
+ }
+ Map<String,Object> epContentPart =
ContentItemHelper.getEnhancementPropertiesContentPart(ci);
+ if(epContentPart == null){
+ log.debug("no EnhancementProperties for ContentItem",ci.getUri());
+ return Collections.emptyMap();
+ }
+ String prefix = new
StringBuilder(engine.getName()).append(':').toString();
+ Map<String,Object> properties = new HashMap<String,Object>();
+ log.debug("Retrieve EnhancementProperties for Engine {} and
ContentItem {}",
+ engine.getName(), ci.getUri());
+ for(Entry<String,Object> entry : epContentPart.entrySet()){
+ String key = entry.getKey();
+ int sepIndex = key.indexOf(':');
+ if(sepIndex < 0){
+ log.debug(" - include chain property '{}'",key);
+ properties.put(key, entry.getValue());
+ } else if(key.startsWith(prefix) && key.length() >
prefix.length()){
+ key = key.substring(prefix.length(),key.length());
+ log.debug(" - include engine property '{}'",key);
+ properties.put(key, entry.getValue());
+ } else {
+ log.debug(" - exclude engine property '{}'",key);
+ }
+ }
+ return properties;
+ }
+
+
}
Modified:
stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/reader/ContentItemReader.java
URL:
http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/reader/ContentItemReader.java?rev=1571146&r1=1571145&r2=1571146&view=diff
==============================================================================
---
stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/reader/ContentItemReader.java
(original)
+++
stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/reader/ContentItemReader.java
Mon Feb 24 05:16:07 2014
@@ -27,12 +27,15 @@ import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.ServletContext;
@@ -264,8 +267,9 @@ public class ContentItemReader implement
parsedContentIds.add(contentItem.getPartUri(0).getUnicodeString());
}
//set the parsed contentIDs to the EnhancementProperties
- getEnhancementProperties(contentItem).put(PARSED_CONTENT_URIS,
- Collections.unmodifiableSet(parsedContentIds));
+ Map<String,Object> ep = getEnhancementProperties(contentItem);
+ parseEnhancementPropertiesFromParameters(ep);
+ ep.put(PARSED_CONTENT_URIS,
Collections.unmodifiableSet(parsedContentIds));
return contentItem;
}
/**
@@ -278,6 +282,46 @@ public class ContentItemReader implement
String ciUri = request == null ? null : request.getParameter("uri");
return ciUri == null ? null : new UriRef(ciUri);
}
+
+ /**
+ * Parsed EnhancementProperties from the request parameters. <p>
+ * This does NOT override existing values in the parsed map.
+ * @param ep the map to add the properties
+ */
+ private void parseEnhancementPropertiesFromParameters(Map<String,Object>
ep){
+ if(request == null) {
+ return; //for unit tests
+ }
+ @SuppressWarnings("unchecked")
+ Map<String,String[]> parameters =
(Map<String,String[]>)request.getParameterMap();
+ log.debug("read EnhancementPropertis from Request Parameters:");
+ for(Entry<String,String[]> entry : parameters.entrySet()){
+ if(entry.getKey().contains("enhancer.")){
+ if(!ep.containsKey(entry.getKey())){
+ log.debug(" + {}",entry.getKey());
+ Object value;
+ if(entry.getValue() == null || entry.getValue().length <
1){
+ value = null;
+ } if(entry.getValue().length == 1){
+ value = entry.getValue()[0];
+ } else {
+ List<String> values = new
ArrayList<String>(entry.getValue().length);
+ Collections.addAll(values,entry.getValue());
+ value = Collections.unmodifiableList(values);
+ }
+ log.debug(" value: {}", value);
+ ep.put(entry.getKey(), value);
+ } else if(log.isDebugEnabled()){
+ log.debug(" - ignore key {} because it is already
present");
+ log.debug(" current value: {}",ep.get(entry.getKey()));
+ log.debug(" request value: {} (ignored)",
Arrays.toString(entry.getValue()));
+ }
+ } else {
+ log.debug(" - {}", entry.getKey());
+ }
+ }
+ }
+
/**
* Creates a ContentItem
* @param id the ID or <code>null</code> if not known
Modified:
stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/utils/EnhancementPropertiesHelper.java
URL:
http://svn.apache.org/viewvc/stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/utils/EnhancementPropertiesHelper.java?rev=1571146&r1=1571145&r2=1571146&view=diff
==============================================================================
---
stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/utils/EnhancementPropertiesHelper.java
(original)
+++
stanbol/branches/release-0.12/enhancer/jersey/src/main/java/org/apache/stanbol/enhancer/jersey/utils/EnhancementPropertiesHelper.java
Mon Feb 24 05:16:07 2014
@@ -29,6 +29,7 @@ import org.apache.clerezza.rdf.core.Trip
import org.apache.clerezza.rdf.core.UriRef;
import org.apache.stanbol.enhancer.servicesapi.Blob;
import org.apache.stanbol.enhancer.servicesapi.ContentItem;
+import org.apache.stanbol.enhancer.servicesapi.helper.ContentItemHelper;
import org.apache.stanbol.enhancer.servicesapi.rdf.ExecutionMetadata;
import org.apache.stanbol.enhancer.servicesapi.rdf.ExecutionPlan;
@@ -39,14 +40,10 @@ public final class EnhancementProperties
private EnhancementPropertiesHelper(){/* no instances allowed*/}
/**
- * URI used to register an {@link ContentItem#getPart(int, Class)
contentPart}
- * of the type {@link Map Map<String,Objext>} that contains
properties
- * for the enhancement process. <p>
- * TODO: This might move to servicesapi and also accessible to enhancement
- * engines
+ * @see ContentItemHelper#ENHANCEMENT_PROPERTIES_URI
*/
- public static final UriRef ENHANCEMENT_PROPERTIES_URI = new UriRef(
- "urn:apache.org:stanbol.web:enhancement.properties");
+ public static final UriRef ENHANCEMENT_PROPERTIES_URI =
+ ContentItemHelper.ENHANCEMENT_PROPERTIES_URI;
/**
* Boolean switch parsed as {@link QueryParam} tha allows to deactivate the
* inclusion of the {@link ContentItem#getMetadata()} in the Response
@@ -97,26 +94,14 @@ public final class EnhancementProperties
public static final String PARSED_CONTENT_URIS =
"stanbol.enhancer.web.parsedContentURIs";
/**
- * Getter for the EnhancementProperties for an {@link ContentItem}. If they
- * do not already exist they are created and added to the ContentItem as
- * contentPart with the URI {@link #ENHANCEMENT_PROPERTIES_URI}
+ * Inits (get or creates) the content part holding the
EnhancementProperties
* @param ci the contentItem MUST NOT be NULL
* @return the enhancement properties
* @throws IllegalArgumentException if <code>null</code> is parsed as
{@link ContentItem}.
+ * @see ContentItemHelper#initEnhancementPropertiesContentPart(ContentItem)
*/
- @SuppressWarnings("unchecked")
public static Map<String,Object> getEnhancementProperties(ContentItem ci){
- if(ci == null){
- throw new IllegalArgumentException("The parsed ContentItem MUST
NOT be NULL!");
- }
- Map<String,Object> enhancementProperties;
- try {
- enhancementProperties = ci.getPart(ENHANCEMENT_PROPERTIES_URI,
Map.class);
- } catch (RuntimeException e) {
- enhancementProperties = new HashMap<String,Object>();
- ci.addPart(ENHANCEMENT_PROPERTIES_URI, enhancementProperties);
- }
- return enhancementProperties;
+ return ContentItemHelper.initEnhancementPropertiesContentPart(ci);
}