blob: 4bf14785b8e2be84697a266ee8fb378ff0973d93 [file] [log] [blame]
#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
package ${package};
import java.io.IOException;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.clerezza.commons.rdf.Graph;
import org.apache.clerezza.commons.rdf.IRI;
import org.apache.clerezza.commons.rdf.impl.utils.PlainLiteralImpl;
import org.apache.clerezza.commons.rdf.impl.utils.TripleImpl;
import org.apache.clerezza.rdf.ontologies.DCTERMS;
import org.apache.clerezza.rdf.ontologies.RDFS;
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.Deactivate;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.stanbol.enhancer.servicesapi.Blob;
import org.apache.stanbol.enhancer.servicesapi.ContentItem;
import org.apache.stanbol.enhancer.servicesapi.EngineException;
import org.apache.stanbol.enhancer.servicesapi.EnhancementEngine;
import org.apache.stanbol.enhancer.servicesapi.InvalidContentException;
import org.apache.stanbol.enhancer.servicesapi.ServiceProperties;
import org.apache.stanbol.enhancer.servicesapi.helper.ContentItemHelper;
import org.apache.stanbol.enhancer.servicesapi.helper.EnhancementEngineHelper;
import org.apache.stanbol.enhancer.servicesapi.impl.AbstractEnhancementEngine;
import org.osgi.framework.Constants;
import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(configurationFactory = true, //allow multiple service instances (false for a singelton instance)
policy = ConfigurationPolicy.OPTIONAL, //use REQUIRE if a non default option is present
immediate = true, //activate service instances on startup
metatype = true, inherit = true, specVersion = "1.1")
@Service //this will register the engine as an OSGI service
@Properties(value = { //Configuration properties included in the config form
@Property(name = EnhancementEngine.PROPERTY_NAME, value = "${artifactId}-example"),
@Property(name = Constants.SERVICE_RANKING, intValue = 0)
})
public class ExampleEnhancer extends AbstractEnhancementEngine<RuntimeException,RuntimeException>
implements EnhancementEngine, ServiceProperties {
/**
* Using slf4j for logging
*/
private static final Logger log = LoggerFactory.getLogger(ExampleEnhancer.class);
/**
* Configuration property for option 1
*/
@Property(value=ExampleEnhancer.DEFAULT_OPTION1_VALUE)
public static final String EXAMPLE_CONFIG_OPTION1 = "${package}.option1";
/**
* The default value for EXAMPLE_CONFIG_OPTION1
*/
public static final String DEFAULT_OPTION1_VALUE = "value1";
/**
* The value of option1
*/
private String option1;
/**
* TODO: change to fit your engine. See constants defined in the
* ServiceProperties class
*/
protected static final Integer ENGINE_ORDERING = ServiceProperties.ORDERING_PRE_PROCESSING;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* OSGI lifecycle methods
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
/**
* Activate and read the properties. Configures and initialises a POSTagger for each language configured in
* CONFIG_LANGUAGES.
*
* @param ce the {@link org.osgi.service.component.ComponentContext}
*/
@Activate
protected void activate(ComponentContext ce) throws ConfigurationException {
super.activate(ce);
log.info("activating {}: {}", getClass().getSimpleName(), getName());
@SuppressWarnings("unchecked")
Dictionary<String, Object> properties = ce.getProperties();
//TODO: parse custom properties
//As Example we parse EXAMPLE_CONFIG_OPTION1 form the config
Object value = properties.get(EXAMPLE_CONFIG_OPTION1);
if(value == null || value.toString().isEmpty()){
option1 = DEFAULT_OPTION1_VALUE;
} else {
option1 = value.toString();
}
}
@Deactivate
protected void deactivate(ComponentContext context) {
log.info("deactivating {}: {}", getClass().getSimpleName(), getName());
//TODO: reset fields to default, close resources ...
option1 = null;
super.deactivate(context); //call deactivate on the super class
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* ServiceProperties interface method
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
/**
* ServiceProperties are currently only used for automatic ordering of the
* execution of EnhancementEngines (e.g. by the WeightedChain implementation).
* Default ordering means that the engine is called after all engines that
* use a value < {@link ServiceProperties#ORDERING_CONTENT_EXTRACTION}
* and >= {@link ServiceProperties#ORDERING_EXTRACTION_ENHANCEMENT}.
*/
public Map<String,Object> getServiceProperties() {
return Collections.unmodifiableMap(Collections.<String,Object>singletonMap(
ENHANCEMENT_ENGINE_ORDERING, ENGINE_ORDERING));
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* EnhancementEngine interface methods
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
/**
* @return if and how (asynchronously) we can enhance a ContentItem
*/
public int canEnhance(ContentItem ci) throws EngineException {
// check if a Content in the supported type is available
//NOTE: you can parse multiple content types
Entry<IRI,Blob> textBlob = ContentItemHelper.getBlob(
ci, Collections.singleton("text/plain"));
if(textBlob == null) {
return CANNOT_ENHANCE;
}
//TODO: test additional requirements for this EnhancementEngine
// no reason why we should require to be executed synchronously
return ENHANCE_ASYNC;
}
public void computeEnhancements(ContentItem ci) throws EngineException {
//(1) retrieve the required data from the ConentItem
String content;
try {
//get the (generated or submitted) text version of the ContentItem
Blob textBlob = ContentItemHelper.getBlob(ci,
Collections.singleton("text/plain")).getValue();
//Blob provides an InputStream. Use the Utility to load the String
content = ContentItemHelper.getText(textBlob);
} catch (IOException ex) {
log.error("Exception reading content item.", ex);
throw new InvalidContentException("Exception reading content item.", ex);
}
//(2) compute the enhancements
int contentLength = content.length();
//(3) write the enhancement results
// get the metadata graph
Graph metadata = ci.getMetadata();
//NOTE: as we allow synchronous calls we need to use read/write
// locks on the ContentItem
ci.getLock().writeLock().lock();
try {
// TODO: replace this with real enhancements
IRI textAnnotation = EnhancementEngineHelper.createTextEnhancement(ci, this);
metadata.add(new TripleImpl(textAnnotation, DCTERMS.type,
new IRI("http://example.org/ontology/LengthEnhancement")));
metadata.add(new TripleImpl(textAnnotation, RDFS.comment,
new PlainLiteralImpl("A text of " + contentLength + " charaters")));
} finally {
ci.getLock().writeLock().unlock();
}
}
}