Author: suat
Date: Tue Apr 10 07:02:59 2012
New Revision: 1311603

URL: http://svn.apache.org/viewvc?rev=1311603&view=rev
Log:
STANBOL-581: Enhancements of content items are deleted correctly when a content 
item is updated or deleted.

Modified:
    
incubator/stanbol/trunk/contenthub/servicesapi/src/main/java/org/apache/stanbol/contenthub/servicesapi/Constants.java
    
incubator/stanbol/trunk/contenthub/store/solr/src/main/java/org/apache/stanbol/contenthub/store/solr/SolrStoreImpl.java

Modified: 
incubator/stanbol/trunk/contenthub/servicesapi/src/main/java/org/apache/stanbol/contenthub/servicesapi/Constants.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/contenthub/servicesapi/src/main/java/org/apache/stanbol/contenthub/servicesapi/Constants.java?rev=1311603&r1=1311602&r2=1311603&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/contenthub/servicesapi/src/main/java/org/apache/stanbol/contenthub/servicesapi/Constants.java
 (original)
+++ 
incubator/stanbol/trunk/contenthub/servicesapi/src/main/java/org/apache/stanbol/contenthub/servicesapi/Constants.java
 Tue Apr 10 07:02:59 2012
@@ -34,7 +34,7 @@ public class Constants {
     /**
      * The URI of the global enhancement graph. All enhancements are stored in 
this graph.
      */
-    public static final String ENHANCEMENTS_GRAPH_URI = 
"org.apache.stanbol.enhancer.standalone.store.enhancements";
+    public static final String ENHANCEMENTS_GRAPH_URI = 
"org.apache.stanbol.contenthub.enhancements";
 
     /**
      * The URI of ???

Modified: 
incubator/stanbol/trunk/contenthub/store/solr/src/main/java/org/apache/stanbol/contenthub/store/solr/SolrStoreImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/stanbol/trunk/contenthub/store/solr/src/main/java/org/apache/stanbol/contenthub/store/solr/SolrStoreImpl.java?rev=1311603&r1=1311602&r2=1311603&view=diff
==============================================================================
--- 
incubator/stanbol/trunk/contenthub/store/solr/src/main/java/org/apache/stanbol/contenthub/store/solr/SolrStoreImpl.java
 (original)
+++ 
incubator/stanbol/trunk/contenthub/store/solr/src/main/java/org/apache/stanbol/contenthub/store/solr/SolrStoreImpl.java
 Tue Apr 10 07:02:59 2012
@@ -25,8 +25,10 @@ import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -37,6 +39,7 @@ import org.apache.clerezza.rdf.core.Lite
 import org.apache.clerezza.rdf.core.MGraph;
 import org.apache.clerezza.rdf.core.Resource;
 import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
 import org.apache.clerezza.rdf.core.UriRef;
 import org.apache.clerezza.rdf.core.access.NoSuchEntityException;
 import org.apache.clerezza.rdf.core.access.TcManager;
@@ -95,556 +98,526 @@ import at.newmedialab.ldpath.model.progr
 @Service
 public class SolrStoreImpl implements SolrStore {
 
-       private static final Logger log = LoggerFactory
-                       .getLogger(SolrStoreImpl.class);
+    private static final Logger log = 
LoggerFactory.getLogger(SolrStoreImpl.class);
 
-       @Reference
-       private ManagedSolrServer managedSolrServer;
+    @Reference
+    private ManagedSolrServer managedSolrServer;
 
-       @Reference
-       private TcManager tcManager;
+    @Reference
+    private TcManager tcManager;
 
-       @Reference
-       private EnhancementJobManager jobManager;
-
-       @Reference
-       private SemanticIndexManager semanticIndexManager;
-
-       private BundleContext bundleContext;
-
-       @Activate
-       protected void activate(ComponentContext context)
-                       throws IllegalArgumentException, IOException,
-                       InvalidSyntaxException, StoreException {
-               if (managedSolrServer == null) {
-                       throw new IllegalStateException(
-                                       "ManagedSolrServer cannot be referenced 
within SolrServerImpl.");
-               }
-               this.bundleContext = context.getBundleContext();
-               SolrCoreManager.getInstance(bundleContext, managedSolrServer)
-                               .createDefaultSolrServer();
-       }
-
-       @Deactivate
-       protected void deactivate(ComponentContext context) {
-               managedSolrServer = null;
-       }
-
-       @Override
-       public SolrContentItem create(String id, byte[] content, String 
contentType) {
-               return create(content, id, "", contentType, null);
-       }
-
-       @Override
-       public MGraph getEnhancementGraph() {
-               final UriRef graphUri = new 
UriRef(Constants.ENHANCEMENTS_GRAPH_URI);
-               MGraph enhancementGraph = null;
-               try {
-                       enhancementGraph = tcManager.getMGraph(graphUri);
-               } catch (NoSuchEntityException e) {
-                       log.debug("Creating the enhancement graph!");
-                       enhancementGraph = tcManager.createMGraph(graphUri);
-               }
-               return enhancementGraph;
-       }
-
-       @Override
-       public SolrContentItem create(byte[] content, String id, String title,
-                       String contentType, Map<String, List<Object>> 
constraints) {
-               UriRef uri;
-               if (id == null || id.isEmpty()) {
-                       uri = ContentItemHelper.makeDefaultUri(
-                                       
ContentItemIDOrganizer.CONTENT_ITEM_URI_PREFIX, content);
-               } else {
-                       uri = new 
UriRef(ContentItemIDOrganizer.attachBaseURI(id));
-               }
-               log.debug("Created ContentItem with id:{} and uri:{}", id, uri);
-               final MGraph g = new SimpleMGraph();
-               return new SolrContentItemImpl(uri.getUnicodeString(), title, 
content,
-                               contentType, g, constraints);
-       }
-
-       private Object inferObjectType(Object val) {
-               Object ret = null;
-               try {
-                       ret = DateFormat.getInstance().parse(val.toString());
-               } catch (Exception e) {
-                       try {
-                               ret = Long.valueOf(val.toString());
-                       } catch (Exception e1) {
-                               try {
-                                       ret = Double.valueOf(val.toString());
-                               } catch (Exception e2) {
-                                       try {
-                                               ret = 
String.valueOf(val.toString());
-                                       } catch (Exception e3) {
-                                       }
-                               }
-                       }
-               }
-
-               if (ret == null)
-                       ret = val;
-               return ret;
-       }
-
-       private String addSolrDynamicFieldExtension(String fieldName,
-                       Object[] values) {
-               for (int i = 0; i < values.length; i++) {
-                       values[i] = inferObjectType(values[i]);
-               }
-               Object typed = values[0];
-               String dynamicFieldName = fieldName;
-               if (typed instanceof String) {
-                       dynamicFieldName += 
SolrVocabulary.SOLR_DYNAMIC_FIELD_TEXT;
-               } else if (typed instanceof Long) {
-                       dynamicFieldName += 
SolrVocabulary.SOLR_DYNAMIC_FIELD_LONG;
-               } else if (typed instanceof Double) {
-                       dynamicFieldName += 
SolrVocabulary.SOLR_DYNAMIC_FIELD_DOUBLE;
-               } else if (typed instanceof Date) {
-                       dynamicFieldName += 
SolrVocabulary.SOLR_DYNAMIC_FIELD_DATE;
-               }
-               return dynamicFieldName;
-       }
-
-       private void enhance(SolrContentItem sci) throws StoreException {
-               try {
-                       jobManager.enhanceContent(sci);
-               } catch (EnhancementException e) {
-                       String msg = String.format("Cannot enhance content with 
id: {}",
-                                       sci.getUri().getUnicodeString());
-                       log.error(msg, e);
-                       throw new StoreException(msg, e);
-               }
-               updateEnhancementGraph(sci);
-       }
-
-       private void removeEnhancements(String id) {
-               MGraph enhancementGraph = getEnhancementGraph();
-               Iterator<Triple> it = enhancementGraph.filter(new UriRef(id), 
null,
-                               null);
-               List<Triple> willBeRemoved = new ArrayList<Triple>();
-               while (it.hasNext()) {
-                       willBeRemoved.add(it.next());
-               }
-               enhancementGraph.removeAll(willBeRemoved);
-       }
-
-       private void updateEnhancementGraph(SolrContentItem sci) {
-               MGraph enhancementGraph = getEnhancementGraph();
-               // Delete old enhancements which belong to this content item 
from the
-               // global enhancements graph.
-               removeEnhancements(sci.getUri().getUnicodeString());
-               // Add new enhancements of this content item to the global 
enhancements
-               // graph.
-               Iterator<Triple> it = sci.getMetadata().iterator();
-               while (it.hasNext()) {
-                       Triple triple = null;
-                       try {
-                               triple = it.next();
-                               enhancementGraph.add(triple);
-                       } catch (Exception e) {
-                               log.warn(
-                                               "Cannot add triple {} to the 
TCManager.enhancementgraph",
-                                               triple, e);
-                               continue;
-                       }
-               }
-       }
-
-       @Override
-       public String enhanceAndPut(SolrContentItem sci) throws StoreException {
-               enhance(sci);
-               return put(sci);
-       }
-
-       @Override
-       public String enhanceAndPut(SolrContentItem sci, String ldProgramName)
-                       throws StoreException {
-               enhance(sci);
-               return put(sci, ldProgramName);
-       }
-
-       @Override
-       public String put(ContentItem ci) throws StoreException {
-               SolrInputDocument doc = new SolrInputDocument();
-               addDefaultFields(ci, doc);
-               if (ci instanceof SolrContentItem) {
-                       SolrContentItem sci = (SolrContentItem) ci;
-                       addSolrSpecificFields(sci, doc);
-               }
-               SolrServer solrServer = 
SolrCoreManager.getInstance(bundleContext,
-                               managedSolrServer).getServer();
-               try {
-                       solrServer.add(doc);
-                       solrServer.commit();
-                       log.debug("Documents are committed to Solr Server 
successfully.");
-               } catch (SolrServerException e) {
-                       log.error("Solr Server Exception", e);
-               } catch (IOException e) {
-                       log.error("IOException", e);
-               }
-               return ci.getUri().getUnicodeString();
-       }
-
-       @Override
-       public String put(SolrContentItem sci, String ldProgramName)
-                       throws StoreException {
-               if (ldProgramName == null
-                               || ldProgramName.isEmpty()
-                               || ldProgramName
-                                               
.equals(SolrCoreManager.CONTENTHUB_DEFAULT_INDEX_NAME)) {
-                       return put(sci);
-               }
-               SolrInputDocument doc = new SolrInputDocument();
-               addDefaultFields(sci, doc);
-               addSolrSpecificFields(sci, doc, ldProgramName);
-               SolrServer solrServer = 
SolrCoreManager.getInstance(bundleContext,
-                               managedSolrServer).getServer(ldProgramName);
-               try {
-                       solrServer.add(doc);
-                       solrServer.commit();
-                       log.debug("Documents are committed to Solr Server 
successfully.");
-               } catch (SolrServerException e) {
-                       log.error("Solr Server Exception", e);
-                       throw new StoreException(e.getMessage(), e);
-               } catch (IOException e) {
-                       log.error("IOException", e);
-                       throw new StoreException(e.getMessage(), e);
-               }
-               return sci.getUri().getUnicodeString();
-       }
-
-       private void addDefaultFields(ContentItem ci, SolrInputDocument doc)
-                       throws StoreException {
-               if (ci.getUri().getUnicodeString() == null
-                               || ci.getUri().getUnicodeString().isEmpty()) {
-                       log.debug("ID of the content item cannot be null while 
inserting to the SolrStore.");
-                       throw new IllegalArgumentException(
-                                       "ID of the content item cannot be null 
while inserting to the SolrStore.");
-               }
-
-               String content = null;
-               try {
-                       Entry<UriRef, Blob> contentPart = 
ContentItemHelper.getBlob(ci,
-                                       Collections.singleton("text/plain"));
-                       if (contentPart == null) {
-                               throw new StoreException(
-                                               "There is no textual for the 
content item");
-                       }
-                       content = 
ContentItemHelper.getText(contentPart.getValue());
-               } catch (IOException ex) {
-                       String msg = "Cannot read the stream of the 
ContentItem.";
-                       log.error(msg, ex);
-                       throw new StoreException(msg, ex);
-               }
-
-               Calendar cal = Calendar.getInstance();
-               SimpleDateFormat sdf = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-               String creationDate = sdf.format(cal.getTime());
-
-               doc.addField(SolrFieldName.ID.toString(), ci.getUri()
-                               .getUnicodeString());
-               doc.addField(SolrFieldName.CONTENT.toString(), content);
-               try {
-                       doc.addField(SolrFieldName.BINARYCONTENT.toString(),
-                                       IOUtils.toByteArray(ci.getStream()));
-               } catch (IOException e) {
-                       throw new StoreException(
-                                       "Failed to get bytes of conten item 
stream", e);
-               }
-               doc.addField(SolrFieldName.MIMETYPE.toString(), 
ci.getMimeType());
-               doc.addField(SolrFieldName.CREATIONDATE.toString(), 
creationDate);
-
-               // add the number of enhancemets to the content item
-               long enhancementCount = 0;
-               Iterator<Triple> it = ci.getMetadata().filter(null,
-                               Properties.ENHANCER_EXTRACTED_FROM,
-                               new UriRef(ci.getUri().getUnicodeString()));
-               while (it.hasNext()) {
-                       it.next();
-                       enhancementCount++;
-               }
-               doc.addField(SolrFieldName.ENHANCEMENTCOUNT.toString(),
-                               enhancementCount);
-       }
-
-       private boolean fieldAlreadyIndexedInProgram(String programName,
-                       String fieldName) {
-               Program<Object> program = semanticIndexManager
-                               .getParsedProgramByName(programName);
-               Iterator<FieldMapping<?, Object>> it = 
program.getFields().iterator();
-               while (it.hasNext()) {
-                       FieldMapping<?, Object> fm = it.next();
-                       if (fm.getFieldName().equals(fieldName))
-                               return true;
-               }
-               return false;
-       }
-
-       private void addConstraints(SolrContentItem sci, SolrInputDocument doc,
-                       String programName) {
-               if (sci.getConstraints() != null) {
-                       for (Entry<String, List<Object>> constraint : 
sci.getConstraints()
-                                       .entrySet()) {
-                               Object[] values = 
constraint.getValue().toArray();
-                               if (values == null || values.length == 0)
-                                       continue;
-                               String fieldName = constraint.getKey();
-                               if (programName != null
-                                               && 
fieldAlreadyIndexedInProgram(programName, fieldName)) {
-                                       continue;
-                               }
-                               if (!SolrFieldName.isNameReserved(fieldName)) {
-                                       fieldName = 
addSolrDynamicFieldExtension(
-                                                       constraint.getKey(), 
values);
-                               }
-                               doc.addField(fieldName, values);
-                               // Now add for the text indexing dynamic field
-                               addIndexedTextDynamicField(doc, fieldName, 
values);
-                       }
-               }
-       }
-
-       private void addSolrSpecificFields(SolrContentItem sci,
-                       SolrInputDocument doc, String ldProgramName) {
-               doc.addField(SolrFieldName.TITLE.toString(), sci.getTitle());
-               addConstraints(sci, doc, ldProgramName);
-               try {
-                       Iterator<Triple> it = sci.getMetadata().filter(null,
-                                       Properties.ENHANCER_ENTITY_REFERENCE, 
null);
-                       Set<String> contexts = new HashSet<String>();
-                       while (it.hasNext()) {
-                               Resource r = it.next().getObject();
-                               if (r instanceof UriRef) {
-                                       contexts.add(((UriRef) 
r).getUnicodeString());
-                               }
-                       }
-                       Map<String, Collection<?>> results = 
semanticIndexManager
-                                       .executeProgram(ldProgramName, 
contexts);
-                       for (Entry<String, Collection<?>> entry : 
results.entrySet()) {
-                               doc.addField(entry.getKey(), entry.getValue());
-                       }
-               } catch (LDPathException e) {
-                       log.error(
-                                       "Cannot execute the ldPathProgram on 
SolrContentItem's metadata",
-                                       e);
-               }
-       }
-
-       private void addSolrSpecificFields(SolrContentItem sci,
-                       SolrInputDocument doc) {
-               doc.addField(SolrFieldName.TITLE.toString(), sci.getTitle());
-               addConstraints(sci, doc, null);
-               if (sci.getMetadata() != null) {
-                       addSemanticFields(sci, doc);
-                       addAnnotatedEntityFieldNames(sci, doc);
-               } else {
-                       log.debug("There are no enhancements for the content 
item {}", sci
-                                       .getUri().getUnicodeString());
-               }
-       }
-
-       private void addSemanticFields(SolrContentItem sci, SolrInputDocument 
doc) {
-               for (SolrFieldName fn : SolrFieldName.getSemanticFieldNames()) {
-                       addField(sci, doc, fn);
-               }
-       }
-
-       private void addAnnotatedEntityFieldNames(SolrContentItem sci,
-                       SolrInputDocument doc) {
-               for (SolrFieldName fn : 
SolrFieldName.getAnnotatedEntityFieldNames()) {
-                       addField(sci, doc, fn);
-               }
-       }
-
-       private void addField(SolrContentItem sci, SolrInputDocument doc,
-                       SolrFieldName fieldName) {
-               SelectQuery query = null;
-               try {
-                       query = (SelectQuery) QueryParser.getInstance().parse(
-                                       
QueryGenerator.getFieldQuery(fieldName));
-               } catch (ParseException e) {
-                       log.debug("Should never reach here!");
-                       log.error("Cannot parse the query generated by 
QueryGenerator: {}",
-                                       
QueryGenerator.getFieldQuery(fieldName), e);
-                       return;
-               }
-
-               sci.getMetadata();
-               ResultSet result = tcManager.executeSparqlQuery(query,
-                               sci.getMetadata());
-               List<String> values = new ArrayList<String>();
-               while (result.hasNext()) {
-                       SolutionMapping sol = result.next();
-                       Resource res = sol.get(fieldName.toString());
-                       if (res == null)
-                               continue;
-                       String value = res.toString();
-                       if (res instanceof Literal) {
-                               value = ((Literal) res).getLexicalForm();
-                       }
-                       value = value.replaceAll("_", " ");
-                       values.add(value);
-               }
-               if (!values.isEmpty()) {
-                       String fn = fieldName.toString();
-                       Object[] valArr = values.toArray();
-                       doc.addField(fn, valArr);
-                       // Now add for the text indexing dynamic field
-                       addIndexedTextDynamicField(doc, fn, valArr);
-               }
-       }
-
-       private void addIndexedTextDynamicField(SolrInputDocument doc, String 
fn,
-                       Object[] valArr) {
-               if (fn.endsWith(SolrVocabulary.SOLR_DYNAMIC_FIELD_TEXT)) {
-                       // replace the last "_t" with "_i"
-                       String ifn = SolrVocabulary.STANBOLRESERVED_PREFIX
-                                       + fn.substring(
-                                                       0,
-                                                       
fn.lastIndexOf(SolrVocabulary.SOLR_DYNAMIC_FIELD_TEXT))
-                                       + 
SolrVocabulary.SOLR_DYNAMIC_FIELD_INDEXEDTEXT;
-                       doc.addField(ifn, valArr);
-               }
-       }
-
-       @Override
-       public ContentItem get(String id) throws StoreException {
-               return get(id, SolrCoreManager.CONTENTHUB_DEFAULT_INDEX_NAME);
-       }
-
-       // TODO: we can use cache for "Recently uploaded Content Items"..
-       @Override
-       public SolrContentItem get(String id, String ldProgramName)
-                       throws StoreException {
-               id = ContentItemIDOrganizer.attachBaseURI(id);
-               SolrServer solrServer = 
SolrCoreManager.getInstance(bundleContext,
-                               managedSolrServer).getServer(ldProgramName);
-               byte[] content = null;
-               String mimeType = null;
-               String title = null;
-               Map<String, List<Object>> constraints = new HashMap<String, 
List<Object>>();
-
-               SolrQuery query = new SolrQuery();
-               StringBuilder queryString = new StringBuilder();
-               queryString.append(SolrFieldName.ID.toString());
-               queryString.append(":\"");
-               queryString.append(id);
-               queryString.append('\"');
-               query.setQuery(queryString.toString());
-               QueryResponse response;
-               try {
-                       response = solrServer.query(query);
-                       SolrDocumentList results = response.getResults();
-                       if (results != null && results.size() > 0) {
-                               SolrDocument result = results.get(0);
-                               content = (byte[]) result
-                                               
.getFieldValue(SolrFieldName.BINARYCONTENT.toString());
-                               mimeType = (String) 
result.getFieldValue(SolrFieldName.MIMETYPE
-                                               .toString());
-                               title = (String) 
result.getFieldValue(SolrFieldName.TITLE
-                                               .toString());
-
-                               Iterator<Entry<String, Object>> itr = 
result.iterator();
-                               while (itr.hasNext()) {
-                                       Entry<String, Object> entry = 
itr.next();
-                                       String key = entry.getKey();
-                                       if (!SolrFieldName.isNameReserved(key)) 
{
-                                               List<Object> values = 
(List<Object>) result
-                                                               
.getFieldValues(key);
-                                               constraints.put(key, values);
-                                       }
-                               }
-                       } else {
-                               log.warn("No matching item in Solr for the 
given id {}.", id);
-                               return null;
-                       }
-               } catch (SolrServerException ex) {
-                       log.error("", ex);
-                       throw new StoreException(ex.getMessage(), ex);
-               }
-
-               String enhancementQuery = 
QueryGenerator.getEnhancementsOfContent(id);
-               SelectQuery selectQuery = null;
-               try {
-                       selectQuery = (SelectQuery) 
QueryParser.getInstance().parse(
-                                       enhancementQuery);
-               } catch (ParseException e) {
-                       String msg = "Cannot parse the SPARQL while trying to 
retrieve the enhancements of the ContentItem";
-                       log.error(msg, e);
-                       throw new StoreException(msg, e);
-               }
-
-               ResultSet resultSet = tcManager.executeSparqlQuery(selectQuery,
-                               this.getEnhancementGraph());
-               MGraph metadata = new SimpleMGraph();
-               while (resultSet.hasNext()) {
-                       SolutionMapping mapping = resultSet.next();
-                       UriRef ref = (UriRef) mapping.get("enhID");
-                       Iterator<Triple> tripleItr = 
this.getEnhancementGraph().filter(ref,
-                                       null, null);
-                       while (tripleItr.hasNext()) {
-                               Triple triple = tripleItr.next();
-                               metadata.add(triple);
-                       }
-               }
-
-               return new SolrContentItemImpl(id, title, content, mimeType, 
metadata,
-                               constraints);
-       }
-
-       @Override
-       public void deleteById(String id, String ldProgramName)
-                       throws StoreException {
-               if (id == null || id.isEmpty())
-                       return;
-               SolrServer solrServer = 
SolrCoreManager.getInstance(bundleContext,
-                               managedSolrServer).getServer(ldProgramName);
-               id = ContentItemIDOrganizer.attachBaseURI(id);
-               removeEnhancements(id);
-               try {
-                       solrServer.deleteById(id);
-                       solrServer.commit();
-               } catch (SolrServerException e) {
-                       log.error("Solr Server Exception", e);
-                       throw new StoreException(e.getMessage(), e);
-               } catch (IOException e) {
-                       log.error("IOException", e);
-                       throw new StoreException(e.getMessage(), e);
-               }
-       }
-
-       @Override
-       public void deleteById(String id) throws StoreException {
-               deleteById(id, SolrCoreManager.CONTENTHUB_DEFAULT_INDEX_NAME);
-       }
-
-       @Override
-       public void deleteById(List<String> idList, String ldProgramName)
-                       throws StoreException {
-               SolrServer solrServer = 
SolrCoreManager.getInstance(bundleContext,
-                               managedSolrServer).getServer(ldProgramName);
-               for (int i = 0; i < idList.size(); i++) {
-                       String id = 
ContentItemIDOrganizer.attachBaseURI(idList.get(i));
-                       idList.remove(i);
-                       idList.add(i, id);
-               }
-               try {
-                       solrServer.deleteById(idList);
-                       solrServer.commit();
-               } catch (SolrServerException e) {
-                       log.error("Solr Server Exception", e);
-                       throw new StoreException(e.getMessage(), e);
-               } catch (IOException e) {
-                       log.error("IOException", e);
-                       throw new StoreException(e.getMessage(), e);
-               }
-       }
-
-       @Override
-       public void deleteById(List<String> idList) throws StoreException {
-               deleteById(idList, 
SolrCoreManager.CONTENTHUB_DEFAULT_INDEX_NAME);
-       }
+    @Reference
+    private EnhancementJobManager jobManager;
+
+    @Reference
+    private SemanticIndexManager semanticIndexManager;
+
+    private BundleContext bundleContext;
+
+    @Activate
+    protected void activate(ComponentContext context) throws 
IllegalArgumentException,
+                                                     IOException,
+                                                     InvalidSyntaxException,
+                                                     StoreException {
+        if (managedSolrServer == null) {
+            throw new IllegalStateException("ManagedSolrServer cannot be 
referenced within SolrServerImpl.");
+        }
+        this.bundleContext = context.getBundleContext();
+        SolrCoreManager.getInstance(bundleContext, 
managedSolrServer).createDefaultSolrServer();
+    }
+
+    @Deactivate
+    protected void deactivate(ComponentContext context) {
+        managedSolrServer = null;
+    }
+
+    @Override
+    public SolrContentItem create(String id, byte[] content, String 
contentType) {
+        return create(content, id, "", contentType, null);
+    }
+
+    @Override
+    public MGraph getEnhancementGraph() {
+        final UriRef graphUri = new UriRef(Constants.ENHANCEMENTS_GRAPH_URI);
+        MGraph enhancementGraph = null;
+        try {
+            enhancementGraph = tcManager.getMGraph(graphUri);
+        } catch (NoSuchEntityException e) {
+            log.debug("Creating the enhancement graph!");
+            enhancementGraph = tcManager.createMGraph(graphUri);
+
+            // register enhancement graph to OSGi environment
+            Dictionary<String,Object> props = new Hashtable<String,Object>();
+            props.put("graph.uri", graphUri);
+            props.put("graph.name", "Enhancement Graph");
+            props.put("graph.description",
+                "This graph stores enhancements of all content items stored 
within Contenthub.");
+            props.put(org.osgi.framework.Constants.SERVICE_RANKING, 
Integer.MAX_VALUE);
+            bundleContext.registerService(TripleCollection.class.getName(), 
enhancementGraph, props);
+        }
+        return enhancementGraph;
+    }
+
+    @Override
+    public SolrContentItem create(byte[] content,
+                                  String id,
+                                  String title,
+                                  String contentType,
+                                  Map<String,List<Object>> constraints) {
+        UriRef uri;
+        if (id == null || id.isEmpty()) {
+            uri = 
ContentItemHelper.makeDefaultUri(ContentItemIDOrganizer.CONTENT_ITEM_URI_PREFIX,
 content);
+        } else {
+            uri = new UriRef(ContentItemIDOrganizer.attachBaseURI(id));
+        }
+        log.debug("Created ContentItem with id:{} and uri:{}", id, uri);
+        final MGraph g = new SimpleMGraph();
+        return new SolrContentItemImpl(uri.getUnicodeString(), title, content, 
contentType, g, constraints);
+    }
+
+    private Object inferObjectType(Object val) {
+        Object ret = null;
+        try {
+            ret = DateFormat.getInstance().parse(val.toString());
+        } catch (Exception e) {
+            try {
+                ret = Long.valueOf(val.toString());
+            } catch (Exception e1) {
+                try {
+                    ret = Double.valueOf(val.toString());
+                } catch (Exception e2) {
+                    try {
+                        ret = String.valueOf(val.toString());
+                    } catch (Exception e3) {}
+                }
+            }
+        }
+
+        if (ret == null) ret = val;
+        return ret;
+    }
+
+    private String addSolrDynamicFieldExtension(String fieldName, Object[] 
values) {
+        for (int i = 0; i < values.length; i++) {
+            values[i] = inferObjectType(values[i]);
+        }
+        Object typed = values[0];
+        String dynamicFieldName = fieldName;
+        if (typed instanceof String) {
+            dynamicFieldName += SolrVocabulary.SOLR_DYNAMIC_FIELD_TEXT;
+        } else if (typed instanceof Long) {
+            dynamicFieldName += SolrVocabulary.SOLR_DYNAMIC_FIELD_LONG;
+        } else if (typed instanceof Double) {
+            dynamicFieldName += SolrVocabulary.SOLR_DYNAMIC_FIELD_DOUBLE;
+        } else if (typed instanceof Date) {
+            dynamicFieldName += SolrVocabulary.SOLR_DYNAMIC_FIELD_DATE;
+        }
+        return dynamicFieldName;
+    }
+
+    private void enhance(SolrContentItem sci) throws StoreException {
+        try {
+            jobManager.enhanceContent(sci);
+        } catch (EnhancementException e) {
+            String msg = String.format("Cannot enhance content with id: {}", 
sci.getUri().getUnicodeString());
+            log.error(msg, e);
+            throw new StoreException(msg, e);
+        }
+        updateEnhancementGraph(sci);
+    }
+
+    private void removeEnhancements(String id) throws StoreException {
+        MGraph enhancementGraph = getEnhancementGraph();
+        String enhancementQuery = QueryGenerator.getEnhancementsOfContent(id);
+        SelectQuery selectQuery = null;
+        try {
+            selectQuery = (SelectQuery) 
QueryParser.getInstance().parse(enhancementQuery);
+        } catch (ParseException e) {
+            String msg = "Cannot parse the SPARQL while trying to delete the 
enhancements of the ContentItem";
+            log.error(msg, e);
+            throw new StoreException(msg, e);
+        }
+
+        List<Triple> willBeRemoved = new ArrayList<Triple>();
+        ResultSet resultSet = tcManager.executeSparqlQuery(selectQuery, 
enhancementGraph);
+        while (resultSet.hasNext()) {
+            SolutionMapping mapping = resultSet.next();
+            UriRef ref = (UriRef) mapping.get("enhID");
+            Iterator<Triple> tripleItr = 
this.getEnhancementGraph().filter(ref, null, null);
+            while (tripleItr.hasNext()) {
+                Triple triple = tripleItr.next();
+                willBeRemoved.add(triple);
+            }
+        }
+        
+        enhancementGraph.removeAll(willBeRemoved);
+    }
+
+    private void updateEnhancementGraph(SolrContentItem sci) throws 
StoreException {
+        MGraph enhancementGraph = getEnhancementGraph();
+        // Delete old enhancements which belong to this content item from the
+        // global enhancements graph.
+        removeEnhancements(sci.getUri().getUnicodeString());
+        // Add new enhancements of this content item to the global enhancements
+        // graph.
+        Iterator<Triple> it = sci.getMetadata().iterator();
+        while (it.hasNext()) {
+            Triple triple = null;
+            try {
+                triple = it.next();
+                enhancementGraph.add(triple);
+            } catch (Exception e) {
+                log.warn("Cannot add triple {} to the 
TCManager.enhancementgraph", triple, e);
+                continue;
+            }
+        }
+    }
+
+    @Override
+    public String enhanceAndPut(SolrContentItem sci) throws StoreException {
+        enhance(sci);
+        return put(sci);
+    }
+
+    @Override
+    public String enhanceAndPut(SolrContentItem sci, String ldProgramName) 
throws StoreException {
+        enhance(sci);
+        return put(sci, ldProgramName);
+    }
+
+    @Override
+    public String put(ContentItem ci) throws StoreException {
+        SolrInputDocument doc = new SolrInputDocument();
+        addDefaultFields(ci, doc);
+        if (ci instanceof SolrContentItem) {
+            SolrContentItem sci = (SolrContentItem) ci;
+            addSolrSpecificFields(sci, doc);
+        }
+        SolrServer solrServer = SolrCoreManager.getInstance(bundleContext, 
managedSolrServer).getServer();
+        try {
+            solrServer.add(doc);
+            solrServer.commit();
+            log.debug("Documents are committed to Solr Server successfully.");
+        } catch (SolrServerException e) {
+            log.error("Solr Server Exception", e);
+        } catch (IOException e) {
+            log.error("IOException", e);
+        }
+        return ci.getUri().getUnicodeString();
+    }
+
+    @Override
+    public String put(SolrContentItem sci, String ldProgramName) throws 
StoreException {
+        if (ldProgramName == null || ldProgramName.isEmpty()
+            || 
ldProgramName.equals(SolrCoreManager.CONTENTHUB_DEFAULT_INDEX_NAME)) {
+            return put(sci);
+        }
+        SolrInputDocument doc = new SolrInputDocument();
+        addDefaultFields(sci, doc);
+        addSolrSpecificFields(sci, doc, ldProgramName);
+        SolrServer solrServer = SolrCoreManager.getInstance(bundleContext, 
managedSolrServer).getServer(
+            ldProgramName);
+        try {
+            solrServer.add(doc);
+            solrServer.commit();
+            log.debug("Documents are committed to Solr Server successfully.");
+        } catch (SolrServerException e) {
+            log.error("Solr Server Exception", e);
+            throw new StoreException(e.getMessage(), e);
+        } catch (IOException e) {
+            log.error("IOException", e);
+            throw new StoreException(e.getMessage(), e);
+        }
+        return sci.getUri().getUnicodeString();
+    }
+
+    private void addDefaultFields(ContentItem ci, SolrInputDocument doc) 
throws StoreException {
+        if (ci.getUri().getUnicodeString() == null || 
ci.getUri().getUnicodeString().isEmpty()) {
+            log.debug("ID of the content item cannot be null while inserting 
to the SolrStore.");
+            throw new IllegalArgumentException(
+                    "ID of the content item cannot be null while inserting to 
the SolrStore.");
+        }
+
+        String content = null;
+        try {
+            Entry<UriRef,Blob> contentPart = ContentItemHelper.getBlob(ci,
+                Collections.singleton("text/plain"));
+            if (contentPart == null) {
+                throw new StoreException("There is no textual for the content 
item");
+            }
+            content = ContentItemHelper.getText(contentPart.getValue());
+        } catch (IOException ex) {
+            String msg = "Cannot read the stream of the ContentItem.";
+            log.error(msg, ex);
+            throw new StoreException(msg, ex);
+        }
+
+        Calendar cal = Calendar.getInstance();
+        SimpleDateFormat sdf = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        String creationDate = sdf.format(cal.getTime());
+
+        doc.addField(SolrFieldName.ID.toString(), 
ci.getUri().getUnicodeString());
+        doc.addField(SolrFieldName.CONTENT.toString(), content);
+        try {
+            doc.addField(SolrFieldName.BINARYCONTENT.toString(), 
IOUtils.toByteArray(ci.getStream()));
+        } catch (IOException e) {
+            throw new StoreException("Failed to get bytes of conten item 
stream", e);
+        }
+        doc.addField(SolrFieldName.MIMETYPE.toString(), ci.getMimeType());
+        doc.addField(SolrFieldName.CREATIONDATE.toString(), creationDate);
+
+        // add the number of enhancemets to the content item
+        long enhancementCount = 0;
+        Iterator<Triple> it = ci.getMetadata().filter(null, 
Properties.ENHANCER_EXTRACTED_FROM,
+            new UriRef(ci.getUri().getUnicodeString()));
+        while (it.hasNext()) {
+            it.next();
+            enhancementCount++;
+        }
+        doc.addField(SolrFieldName.ENHANCEMENTCOUNT.toString(), 
enhancementCount);
+    }
+
+    private boolean fieldAlreadyIndexedInProgram(String programName, String 
fieldName) {
+        Program<Object> program = 
semanticIndexManager.getParsedProgramByName(programName);
+        Iterator<FieldMapping<?,Object>> it = program.getFields().iterator();
+        while (it.hasNext()) {
+            FieldMapping<?,Object> fm = it.next();
+            if (fm.getFieldName().equals(fieldName)) return true;
+        }
+        return false;
+    }
+
+    private void addConstraints(SolrContentItem sci, SolrInputDocument doc, 
String programName) {
+        if (sci.getConstraints() != null) {
+            for (Entry<String,List<Object>> constraint : 
sci.getConstraints().entrySet()) {
+                Object[] values = constraint.getValue().toArray();
+                if (values == null || values.length == 0) continue;
+                String fieldName = constraint.getKey();
+                if (programName != null && 
fieldAlreadyIndexedInProgram(programName, fieldName)) {
+                    continue;
+                }
+                if (!SolrFieldName.isNameReserved(fieldName)) {
+                    fieldName = 
addSolrDynamicFieldExtension(constraint.getKey(), values);
+                }
+                doc.addField(fieldName, values);
+                // Now add for the text indexing dynamic field
+                addIndexedTextDynamicField(doc, fieldName, values);
+            }
+        }
+    }
+
+    private void addSolrSpecificFields(SolrContentItem sci, SolrInputDocument 
doc, String ldProgramName) {
+        doc.addField(SolrFieldName.TITLE.toString(), sci.getTitle());
+        addConstraints(sci, doc, ldProgramName);
+        try {
+            Iterator<Triple> it = sci.getMetadata().filter(null, 
Properties.ENHANCER_ENTITY_REFERENCE, null);
+            Set<String> contexts = new HashSet<String>();
+            while (it.hasNext()) {
+                Resource r = it.next().getObject();
+                if (r instanceof UriRef) {
+                    contexts.add(((UriRef) r).getUnicodeString());
+                }
+            }
+            Map<String,Collection<?>> results = 
semanticIndexManager.executeProgram(ldProgramName, contexts);
+            for (Entry<String,Collection<?>> entry : results.entrySet()) {
+                doc.addField(entry.getKey(), entry.getValue());
+            }
+        } catch (LDPathException e) {
+            log.error("Cannot execute the ldPathProgram on SolrContentItem's 
metadata", e);
+        }
+    }
+
+    private void addSolrSpecificFields(SolrContentItem sci, SolrInputDocument 
doc) {
+        doc.addField(SolrFieldName.TITLE.toString(), sci.getTitle());
+        addConstraints(sci, doc, null);
+        if (sci.getMetadata() != null) {
+            addSemanticFields(sci, doc);
+            addAnnotatedEntityFieldNames(sci, doc);
+        } else {
+            log.debug("There are no enhancements for the content item {}", 
sci.getUri().getUnicodeString());
+        }
+    }
+
+    private void addSemanticFields(SolrContentItem sci, SolrInputDocument doc) 
{
+        for (SolrFieldName fn : SolrFieldName.getSemanticFieldNames()) {
+            addField(sci, doc, fn);
+        }
+    }
+
+    private void addAnnotatedEntityFieldNames(SolrContentItem sci, 
SolrInputDocument doc) {
+        for (SolrFieldName fn : SolrFieldName.getAnnotatedEntityFieldNames()) {
+            addField(sci, doc, fn);
+        }
+    }
+
+    private void addField(SolrContentItem sci, SolrInputDocument doc, 
SolrFieldName fieldName) {
+        SelectQuery query = null;
+        try {
+            query = (SelectQuery) 
QueryParser.getInstance().parse(QueryGenerator.getFieldQuery(fieldName));
+        } catch (ParseException e) {
+            log.debug("Should never reach here!");
+            log.error("Cannot parse the query generated by QueryGenerator: {}",
+                QueryGenerator.getFieldQuery(fieldName), e);
+            return;
+        }
+
+        sci.getMetadata();
+        ResultSet result = tcManager.executeSparqlQuery(query, 
sci.getMetadata());
+        List<String> values = new ArrayList<String>();
+        while (result.hasNext()) {
+            SolutionMapping sol = result.next();
+            Resource res = sol.get(fieldName.toString());
+            if (res == null) continue;
+            String value = res.toString();
+            if (res instanceof Literal) {
+                value = ((Literal) res).getLexicalForm();
+            }
+            value = value.replaceAll("_", " ");
+            values.add(value);
+        }
+        if (!values.isEmpty()) {
+            String fn = fieldName.toString();
+            Object[] valArr = values.toArray();
+            doc.addField(fn, valArr);
+            // Now add for the text indexing dynamic field
+            addIndexedTextDynamicField(doc, fn, valArr);
+        }
+    }
+
+    private void addIndexedTextDynamicField(SolrInputDocument doc, String fn, 
Object[] valArr) {
+        if (fn.endsWith(SolrVocabulary.SOLR_DYNAMIC_FIELD_TEXT)) {
+            // replace the last "_t" with "_i"
+            String ifn = SolrVocabulary.STANBOLRESERVED_PREFIX
+                         + fn.substring(0, 
fn.lastIndexOf(SolrVocabulary.SOLR_DYNAMIC_FIELD_TEXT))
+                         + SolrVocabulary.SOLR_DYNAMIC_FIELD_INDEXEDTEXT;
+            doc.addField(ifn, valArr);
+        }
+    }
+
+    @Override
+    public ContentItem get(String id) throws StoreException {
+        return get(id, SolrCoreManager.CONTENTHUB_DEFAULT_INDEX_NAME);
+    }
+
+    // TODO: we can use cache for "Recently uploaded Content Items"..
+    @Override
+    public SolrContentItem get(String id, String ldProgramName) throws 
StoreException {
+        id = ContentItemIDOrganizer.attachBaseURI(id);
+        SolrServer solrServer = SolrCoreManager.getInstance(bundleContext, 
managedSolrServer).getServer(
+            ldProgramName);
+        byte[] content = null;
+        String mimeType = null;
+        String title = null;
+        Map<String,List<Object>> constraints = new 
HashMap<String,List<Object>>();
+
+        SolrQuery query = new SolrQuery();
+        StringBuilder queryString = new StringBuilder();
+        queryString.append(SolrFieldName.ID.toString());
+        queryString.append(":\"");
+        queryString.append(id);
+        queryString.append('\"');
+        query.setQuery(queryString.toString());
+        QueryResponse response;
+        try {
+            response = solrServer.query(query);
+            SolrDocumentList results = response.getResults();
+            if (results != null && results.size() > 0) {
+                SolrDocument result = results.get(0);
+                content = (byte[]) 
result.getFieldValue(SolrFieldName.BINARYCONTENT.toString());
+                mimeType = (String) 
result.getFieldValue(SolrFieldName.MIMETYPE.toString());
+                title = (String) 
result.getFieldValue(SolrFieldName.TITLE.toString());
+
+                Iterator<Entry<String,Object>> itr = result.iterator();
+                while (itr.hasNext()) {
+                    Entry<String,Object> entry = itr.next();
+                    String key = entry.getKey();
+                    if (!SolrFieldName.isNameReserved(key)) {
+                        List<Object> values = (List<Object>) 
result.getFieldValues(key);
+                        constraints.put(key, values);
+                    }
+                }
+            } else {
+                log.warn("No matching item in Solr for the given id {}.", id);
+                return null;
+            }
+        } catch (SolrServerException ex) {
+            log.error("", ex);
+            throw new StoreException(ex.getMessage(), ex);
+        }
+
+        String enhancementQuery = QueryGenerator.getEnhancementsOfContent(id);
+        SelectQuery selectQuery = null;
+        try {
+            selectQuery = (SelectQuery) 
QueryParser.getInstance().parse(enhancementQuery);
+        } catch (ParseException e) {
+            String msg = "Cannot parse the SPARQL while trying to retrieve the 
enhancements of the ContentItem";
+            log.error(msg, e);
+            throw new StoreException(msg, e);
+        }
+
+        ResultSet resultSet = tcManager.executeSparqlQuery(selectQuery, 
this.getEnhancementGraph());
+        MGraph metadata = new SimpleMGraph();
+        while (resultSet.hasNext()) {
+            SolutionMapping mapping = resultSet.next();
+            UriRef ref = (UriRef) mapping.get("enhID");
+            Iterator<Triple> tripleItr = 
this.getEnhancementGraph().filter(ref, null, null);
+            while (tripleItr.hasNext()) {
+                Triple triple = tripleItr.next();
+                metadata.add(triple);
+            }
+        }
+
+        return new SolrContentItemImpl(id, title, content, mimeType, metadata, 
constraints);
+    }
+
+    @Override
+    public void deleteById(String id, String ldProgramName) throws 
StoreException {
+        if (id == null || id.isEmpty()) return;
+        SolrServer solrServer = SolrCoreManager.getInstance(bundleContext, 
managedSolrServer).getServer(
+            ldProgramName);
+        id = ContentItemIDOrganizer.attachBaseURI(id);
+        removeEnhancements(id);
+        try {
+            solrServer.deleteById(id);
+            solrServer.commit();
+        } catch (SolrServerException e) {
+            log.error("Solr Server Exception", e);
+            throw new StoreException(e.getMessage(), e);
+        } catch (IOException e) {
+            log.error("IOException", e);
+            throw new StoreException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public void deleteById(String id) throws StoreException {
+        deleteById(id, SolrCoreManager.CONTENTHUB_DEFAULT_INDEX_NAME);
+    }
+
+    @Override
+    public void deleteById(List<String> idList, String ldProgramName) throws 
StoreException {
+        SolrServer solrServer = SolrCoreManager.getInstance(bundleContext, 
managedSolrServer).getServer(
+            ldProgramName);
+        for (int i = 0; i < idList.size(); i++) {
+            String id = ContentItemIDOrganizer.attachBaseURI(idList.get(i));
+            idList.remove(i);
+            idList.add(i, id);
+        }
+        try {
+            solrServer.deleteById(idList);
+            solrServer.commit();
+        } catch (SolrServerException e) {
+            log.error("Solr Server Exception", e);
+            throw new StoreException(e.getMessage(), e);
+        } catch (IOException e) {
+            log.error("IOException", e);
+            throw new StoreException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public void deleteById(List<String> idList) throws StoreException {
+        deleteById(idList, SolrCoreManager.CONTENTHUB_DEFAULT_INDEX_NAME);
+    }
 
 }


Reply via email to