Skip to content

Commit

Permalink
Added cheap getDatastream method
Browse files Browse the repository at this point in the history
  • Loading branch information
ajs6f committed Jan 26, 2013
1 parent ff0b8d1 commit 271d8a3
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 20 deletions.
5 changes: 0 additions & 5 deletions pom.xml
Expand Up @@ -41,11 +41,6 @@
<version>${org.springframework.version}</version>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava-collections</artifactId>
<version>r03</version>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
15 changes: 12 additions & 3 deletions src/main/java/org/fcrepo/lily/AbstractResource.java
@@ -1,6 +1,8 @@
package org.fcrepo.lily;

import java.io.IOException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
Expand All @@ -19,8 +21,8 @@ public abstract class AbstractResource {
static final String fedoraNamespace = "fedora";
static final QName fedoraObjectRecordTypeName = new QName(fedoraNamespace,
"object");
static final QName fedoraDatastreamRecordTypeName = new QName(fedoraNamespace,
"datastream");
static final QName fedoraDatastreamRecordTypeName = new QName(
fedoraNamespace, "datastream");
static final QName label = new QName(fedoraNamespace, "label");
static final QName datastreams = new QName(fedoraNamespace, "datastreams");
static final QName datastreamId = new QName(fedoraNamespace, "datastreamId");
Expand All @@ -35,6 +37,8 @@ public abstract class AbstractResource {
@Resource(name = "fedoraSchema")
public org.springframework.core.io.Resource schemaResource;

static protected final ObjectMapper mapper = new ObjectMapper();

final static private Logger logger = LoggerFactory
.getLogger(AbstractResource.class);

Expand All @@ -46,12 +50,17 @@ public abstract class AbstractResource {
}

@PostConstruct
void loadSchema() throws IOException, Exception {
void initialize() throws IOException, Exception {
logger.debug("Loading Fedora schema");
JsonImport.load(getRepo(), schemaResource.getInputStream(), true);

repo = getRepo();

idGenerator = (IdGeneratorImpl) repo.getIdGenerator();
userRecordIdFactory = new UserRecordIdFactory();

mapper.configure(SerializationConfig.Feature.AUTO_DETECT_IS_GETTERS,
false);

}

Expand Down
43 changes: 34 additions & 9 deletions src/main/java/org/fcrepo/lily/FedoraDatastreams.java
@@ -1,37 +1,48 @@
package org.fcrepo.lily;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.SerializationConfig;
import org.lilyproject.repository.api.Link;
import org.lilyproject.repository.api.QName;
import org.lilyproject.repository.api.Record;
import org.lilyproject.repository.api.RecordId;
import org.lilyproject.repository.api.RepositoryException;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;

@Path("/objects/{pid}/datastreams")
public class FedoraDatastreams extends AbstractResource {

@Path("/")
@GET
public Response getDatastreams(@PathParam("pid") final String pid)
throws RepositoryException, InterruptedException {
throws RepositoryException, InterruptedException,
JsonGenerationException, JsonMappingException, IOException {
RecordId pidRecId = userRecordIdFactory.fromString(pid, idGenerator);
Record rec = repo.read(pidRecId, label, datastreams);
List dses = (List) rec.getField(datastreams);
ImmutableSet.Builder dsset = new ImmutableSet.Builder();
for (final Object ds : dses) {
dsset.add(ds);
Record objRec = repo.read(pidRecId, label, datastreams);
List<Link> dses = (List<Link>) objRec.getField(datastreams);
Builder<Map<QName, Object>> dsset = new Builder<Map<QName, Object>>();
for (final Link ds : dses) {
dsset.add(repo.read(ds.resolve(objRec, idGenerator)).getFields());
}
return Response.ok(dsset.build().toString()).build();

return Response.ok(
mapper.writerWithType(Set.class).writeValueAsString(
dsset.build())).build();
}

@Path("/{dsid}")
Expand All @@ -46,12 +57,26 @@ public Response addDatastream(@PathParam("pid") final String pid,
.field(datastreamId, dsid).createOrUpdate();
// add link to object
RecordId pidRecId = userRecordIdFactory.fromString(pid, idGenerator);
Record objRec = repo.read(pidRecId, label, datastreams);
Record objRec = repo.read(pidRecId, datastreams);
List<Link> dses = (List<Link>) objRec.getField(datastreams);
dses.add(new Link(dsRec.getId()));
objRec.setField(datastreams, dses);
repo.createOrUpdate(objRec);
return Response.created(URI.create(dsid)).build();
}

@Path("/{dsid}")
@GET
public Response getDatastream(@PathParam("pid") final String pid,
@PathParam("dsid") final String dsid) throws RepositoryException,
InterruptedException, JsonGenerationException,
JsonMappingException, IOException {

return Response.ok(
mapper.writerWithType(Map.class).writeValueAsString(
repo.read(
userRecordIdFactory.fromString(
pid + "/" + dsid, idGenerator))
.getFields())).build();
}
}
13 changes: 10 additions & 3 deletions src/main/java/org/fcrepo/lily/FedoraObjects.java
@@ -1,7 +1,9 @@
package org.fcrepo.lily;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Map;

import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
Expand All @@ -11,6 +13,8 @@
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.lilyproject.repository.api.Link;
import org.lilyproject.repository.api.Record;
import org.lilyproject.repository.api.RecordId;
Expand All @@ -25,10 +29,13 @@ public class FedoraObjects extends AbstractResource {
@Path("/{pid}")
@GET
public Response getObject(@PathParam("pid") final String pid)
throws RepositoryException, InterruptedException {
throws RepositoryException, InterruptedException,
JsonGenerationException, JsonMappingException, IOException {
RecordId pidRecId = userRecordIdFactory.fromString(pid, idGenerator);
Record rec = repo.read(pidRecId, label);
return Response.ok((String) rec.getField(label)).build();
Record rec = repo.read(pidRecId);
return Response.ok(
mapper.writerWithType(Map.class).writeValueAsString(
rec.getFields().toString())).build();
}

@Path("/{pid}")
Expand Down

0 comments on commit 271d8a3

Please sign in to comment.