You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2010/04/19 11:28:42 UTC

svn commit: r935490 - /incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.jaxrs.rdf.providers/src/main/java/org/apache/clerezza/jaxrs/rdf/providers/GraphNodeWriter.java

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;
 	}
 }