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