Author: reto
Date: Mon Apr 19 09:28:42 2010
New Revision: 935490

URL: http://svn.apache.org/viewvc?rev=935490&view=rev
Log:
CLEREZZA-192: preliminary version

Modified:
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.jaxrs.rdf.providers/src/main/java/org/apache/clerezza/jaxrs/rdf/providers/GraphNodeWriter.java

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.jaxrs.rdf.providers/src/main/java/org/apache/clerezza/jaxrs/rdf/providers/GraphNodeWriter.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.jaxrs.rdf.providers/src/main/java/org/apache/clerezza/jaxrs/rdf/providers/GraphNodeWriter.java?rev=935490&r1=935489&r2=935490&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.jaxrs.rdf.providers/src/main/java/org/apache/clerezza/jaxrs/rdf/providers/GraphNodeWriter.java
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.jaxrs.rdf.providers/src/main/java/org/apache/clerezza/jaxrs/rdf/providers/GraphNodeWriter.java
 Mon Apr 19 09:28:42 2010
@@ -18,22 +18,32 @@
  */
 package org.apache.clerezza.jaxrs.rdf.providers;
 
+import org.apache.clerezza.rdf.core.serializedform.Serializer;
+import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
 
 import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.MessageBodyWriter;
 import javax.ws.rs.ext.Provider;
 
+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.impl.SimpleMGraph;
 import org.apache.clerezza.rdf.utils.GraphNode;
-import org.apache.clerezza.rdf.core.serializedform.Serializer;
-import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
-
 
 /**
  * @scr.component
@@ -48,13 +58,16 @@ import org.apache.clerezza.rdf.core.seri
        SupportedFormat.X_TURTLE, SupportedFormat.RDF_JSON})
 public class GraphNodeWriter implements MessageBodyWriter<GraphNode> {
 
+       public static final String OBJ_EXP_PARAM = "xPropObj";
+       public static final String SUBJ_EXP_PARAM = "xPropSubj";
        /**
         * @scr.reference
         */
        private Serializer serializer;
-       
+       private UriInfo uriInfo;
+
        @Override
-       public boolean isWriteable(Class<?> type, Type genericType, 
+       public boolean isWriteable(Class<?> type, Type genericType,
                        Annotation[] annotations, MediaType mediaType) {
                return GraphNode.class.isAssignableFrom(type);
        }
@@ -70,6 +83,74 @@ public class GraphNodeWriter implements 
                        Annotation[] annotations, MediaType mediaType,
                        MultivaluedMap<String, Object> httpHeaders,
                        OutputStream entityStream) throws IOException, 
WebApplicationException {
-               serializer.serialize(entityStream, node.getNodeContext(), 
mediaType.toString());
+               serializer.serialize(entityStream, getExpandedContext(node), 
mediaType.toString());
+       }
+
+       @Context
+       public void setUriInfo(UriInfo uriInfo) {
+               this.uriInfo = uriInfo;
+       }
+
+       private TripleCollection getExpandedContext(GraphNode node) {
+               final TripleCollection result = new 
SimpleMGraph(node.getNodeContext());
+               final Set<Resource> expandedResources = new HashSet<Resource>();
+               expandedResources.add(node.getNode());
+               while (true) {
+                       Set<Resource> additionalExpansionRes = 
getAdditionalExpansionResources(result);
+                       additionalExpansionRes.removeAll(expandedResources);
+                       if (additionalExpansionRes.size() == 0) {
+                               return result;
+                       }
+                       for (Resource resource : additionalExpansionRes) {
+                               final GraphNode additionalNode = new 
GraphNode(resource, node.getGraph());
+                               result.addAll(additionalNode.getNodeContext());
+                               expandedResources.add(resource);
+                       }
+               }
+       }
+
+       private Set<Resource> getAdditionalExpansionResources(TripleCollection 
tc) {
+               final Set<UriRef> subjectExpansionProperties = 
getSubjectExpansionProperties();
+               final Set<UriRef> objectExpansionProperties = 
getObjectExpansionProperties();
+               final Set<Resource> result = new HashSet<Resource>();
+               if ((subjectExpansionProperties.size() > 0)
+                               || (objectExpansionProperties.size() > 0)) {
+                       for (Triple triple : tc) {
+                               final UriRef predicate = triple.getPredicate();
+                               if 
(subjectExpansionProperties.contains(predicate)) {
+                                       result.add(triple.getSubject());
+                               }
+                               if 
(objectExpansionProperties.contains(predicate)) {
+                                       result.add(triple.getObject());
+                               }
+                       }
+               }
+               return result;
+       }
+
+       private Set<UriRef> getSubjectExpansionProperties() {
+               final MultivaluedMap<String, String> queryParams = 
uriInfo.getQueryParameters();
+               final List<String> paramValues = 
queryParams.get(SUBJ_EXP_PARAM);
+               if (paramValues == null) {
+                       return new HashSet<UriRef>(0);
+               }
+               final Set<UriRef> result = new 
HashSet<UriRef>(paramValues.size());
+               for (String uriString : paramValues) {
+                       result.add(new UriRef(uriString));
+               }
+               return result;
+       }
+
+       private Set<UriRef> getObjectExpansionProperties() {
+               final MultivaluedMap<String, String> queryParams = 
uriInfo.getQueryParameters();
+               final List<String> paramValues = queryParams.get(OBJ_EXP_PARAM);
+               if (paramValues == null) {
+                       return new HashSet<UriRef>(0);
+               }
+               final Set<UriRef> result = new 
HashSet<UriRef>(paramValues.size());
+               for (String uriString : paramValues) {
+                       result.add(new UriRef(uriString));
+               }
+               return result;
        }
 }


Reply via email to