Skip to content

Commit

Permalink
Merge branch 'master' into StoreAndRetrieveSizesOfThings
Browse files Browse the repository at this point in the history
* master:
  More test cleanup
  Cleaned tests, factored boilerplate into AbstractResourceTest
  Just moving some duplicate methods into a utils package.
  Create initial Dublin Core indexer framework and REST API endpoint.
  43942653: Build an audit (logging) service

Conflicts:
	src/test/java/org/fcrepo/modeshape/FedoraRepositoryTest.java
  • Loading branch information
cbeer committed Feb 7, 2013
2 parents 1a5d140 + 3547faa commit c195410
Show file tree
Hide file tree
Showing 28 changed files with 606 additions and 145 deletions.
8 changes: 7 additions & 1 deletion pom.xml
Expand Up @@ -20,7 +20,6 @@
<enunciate.version>1.26.2</enunciate.version>
</properties>


<dependencyManagement>
<dependencies>
<!-- Import the ModeShape BOM for embedded usage. This adds to the "dependenciesManagement"
Expand Down Expand Up @@ -160,6 +159,13 @@
<artifactId>rome</artifactId>
<version>1.0</version>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/fcrepo/modeshape/AbstractResource.java
Expand Up @@ -21,6 +21,7 @@

import org.codehaus.jackson.map.ObjectMapper;
import org.fcrepo.modeshape.identifiers.PidMinter;
import org.fcrepo.modeshape.utils.Constants;
import org.modeshape.jcr.api.JcrTools;
import org.modeshape.jcr.api.Repository;
import org.slf4j.Logger;
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/fcrepo/modeshape/FedoraDatastreams.java
Expand Up @@ -234,6 +234,10 @@ private URI addDatastreamNode(final String pid, final String dsPath,
ds.setProperty("fedora:created", Calendar.getInstance());
}
ds.setProperty("jcr:lastModified", Calendar.getInstance());

// TODO: I guess we should also have the PID + DSID..
ds.setProperty("dc:identifier", new String[] { ds.getIdentifier() });

session.save();
if (created) {
/*
Expand Down
7 changes: 3 additions & 4 deletions src/main/java/org/fcrepo/modeshape/FedoraObjects.java
Expand Up @@ -12,10 +12,7 @@
import java.io.IOException;
import java.util.Calendar;

import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.*;
import javax.jcr.nodetype.NodeType;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
Expand Down Expand Up @@ -75,6 +72,7 @@ public Response ingest(@PathParam("pid") final String pid)
obj.addMixin("fedora:owned");
obj.setProperty("fedora:ownerId", "Fedo Radmin");
obj.setProperty("jcr:lastModified", Calendar.getInstance());
obj.setProperty("dc:identifier", new String[] { obj.getIdentifier(), pid });
session.save();
/*
* we save before updating the repo size because the act of
Expand Down Expand Up @@ -169,4 +167,5 @@ private static Long getObjectDSSize(Node obj) throws RepositoryException {
}
return size;
}

}
58 changes: 58 additions & 0 deletions src/main/java/org/fcrepo/modeshape/indexer/DublinCore.java
@@ -0,0 +1,58 @@
package org.fcrepo.modeshape.indexer;

import org.fcrepo.modeshape.AbstractResource;
import org.fcrepo.modeshape.indexer.dublincore.AbstractIndexer;
import org.fcrepo.modeshape.indexer.dublincore.IndexFromWellKnownPath;

import javax.inject.Inject;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

import java.io.InputStream;
import java.util.List;

import static javax.ws.rs.core.MediaType.TEXT_XML;
import static javax.ws.rs.core.Response.ok;


@Path("/objects/{pid}/oai_dc")
public class DublinCore extends AbstractResource {

@Inject
List<AbstractIndexer> indexers;

@GET
@Produces({ TEXT_XML })
public Response getObjectAsDublinCore(@PathParam("pid") final String pid) throws RepositoryException {
final Session session = repo.login();

try {
if (session.nodeExists("/objects/" + pid)) {
final Node obj = session.getNode("/objects/" + pid);

for(AbstractIndexer indexer : indexers) {
InputStream inputStream = indexer.getStream(obj);

if(inputStream != null) {
return ok(inputStream, TEXT_XML).build();
}
}

return four04;
} else {
return four04;
}

} finally {
session.logout();
}

}

}
@@ -0,0 +1,16 @@
package org.fcrepo.modeshape.indexer.dublincore;


import javax.jcr.Node;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

public abstract class AbstractIndexer {

public AbstractIndexer() {
}

public abstract InputStream getStream(Node node);

}
@@ -0,0 +1,46 @@
package org.fcrepo.modeshape.indexer.dublincore;

import javax.jcr.*;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

public class IndexFromJcrProperties extends AbstractIndexer {

@Override
public InputStream getStream(Node node) {


String str = "<oai_dc:dc xmlns:oai_dc=\"http://www.openarchives.org/OAI/2.0/oai_dc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">";

try {
final String[] nameGlobs = new String[] { "dc:*"};
PropertyIterator iter = node.getProperties(nameGlobs);

while(iter.hasNext()) {
Property property = iter.nextProperty();
if(property.isMultiple()) {
for(final Value v : property.getValues()) {
str += "\t<" + property.getName() + ">" + v.getString() + "</" + property.getName() + ">\n";
}
}
else {
str += "\t<" + property.getName() + ">" + property.getValue().getString() + "</" + property.getName() + ">\n";

}
}

str += "</oai_dc:dc>";

try {
return new ByteArrayInputStream(str.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
} catch (RepositoryException e) {
e.printStackTrace();
return null;
}
}
}
@@ -0,0 +1,44 @@
package org.fcrepo.modeshape.indexer.dublincore;

import javax.inject.Inject;
import javax.jcr.Binary;
import javax.jcr.Node;
import javax.jcr.RepositoryException;

import java.io.InputStream;

import static org.modeshape.jcr.api.JcrConstants.JCR_CONTENT;
import static org.modeshape.jcr.api.JcrConstants.JCR_DATA;

public class IndexFromWellKnownPath extends AbstractIndexer {

private String wellKnownPath;

@Override
public InputStream getStream(Node node) {

try {
return getContentInputStream(node);
} catch (RepositoryException e) {
e.printStackTrace();

return null;
}
}

private InputStream getContentInputStream(Node node) throws RepositoryException {
if(node.hasNode(this.wellKnownPath)) {
final Node dc = node.getNode(this.wellKnownPath);

Binary binary = dc.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();

return binary.getStream();
} else {
return null;
}
}

public void setWellKnownPath(String wellKnownPath) {
this.wellKnownPath = wellKnownPath;
}
}
@@ -0,0 +1,21 @@
package org.fcrepo.modeshape.indexer.dublincore;

import javax.jcr.Node;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

public class WorstCaseIndexer extends AbstractIndexer {

@Override
public InputStream getStream(Node node) {
String str = "<oai_dc:dc xmlns:oai_dc=\"http://www.openarchives.org/OAI/2.0/oai_dc/\" ></oai_dc:dc>";

try {
return new ByteArrayInputStream(str.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
}
17 changes: 17 additions & 0 deletions src/main/java/org/fcrepo/modeshape/modules/audit/Auditor.java
@@ -0,0 +1,17 @@
package org.fcrepo.modeshape.modules.audit;

import javax.jcr.RepositoryException;
import javax.jcr.observation.Event;

import com.google.common.eventbus.Subscribe;

/**
* An interface for recording auditable Fedora events.
*
* @author Edwin Shin
*/
public interface Auditor {

@Subscribe
public void recordEvent(Event e) throws RepositoryException;
}
@@ -0,0 +1,31 @@
package org.fcrepo.modeshape.modules.audit;

import static org.fcrepo.modeshape.utils.EventType.getEventName;

import javax.jcr.RepositoryException;
import javax.jcr.observation.Event;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.eventbus.Subscribe;

/**
* A proof-of-concept Auditor implementation that uses Logback.
*
* @author Edwin Shin
*/
public class LogbackAuditor implements Auditor {

Logger logger = LoggerFactory.getLogger(LogbackAuditor.class);

/**
*
*/
@Override
@Subscribe
public void recordEvent(Event e) throws RepositoryException {
logger.info(e.getUserID() + " " + getEventName(e.getType()) + " "
+ e.getPath());
}
}
28 changes: 2 additions & 26 deletions src/main/java/org/fcrepo/modeshape/observer/RSSPublisher.java
Expand Up @@ -2,6 +2,7 @@

import static com.google.common.collect.ImmutableList.copyOf;
import static com.google.common.collect.Lists.transform;
import static org.fcrepo.modeshape.utils.EventType.getEventType;

import java.io.ByteArrayInputStream;
import java.util.concurrent.ArrayBlockingQueue;
Expand Down Expand Up @@ -80,8 +81,7 @@ public SyndEntry apply(Event event) {
entry.setPublishedDate(new DateTime(event.getDate()).toDate());
SyndContent description = new SyndContentImpl();
description.setType("text/plain");
description.setValue(EventType.getEventType(event.getType())
.toString());
description.setValue(getEventType(event.getType()).toString());
entry.setDescription(description);
} catch (RepositoryException e) {
throw new SystemFailureException(e);
Expand All @@ -91,30 +91,6 @@ public SyndEntry apply(Event event) {

};

public enum EventType {
NODE_ADDED, NODE_REMOVED, PROPERTY_ADDED, PROPERTY_REMOVED, PROPERTY_CHANGED, NODE_MOVED, PERSIST;

public static EventType getEventType(Integer i) {
switch (i) {
case 0x1:
return NODE_ADDED;
case 0x2:
return NODE_REMOVED;
case 0x4:
return PROPERTY_ADDED;
case 0x8:
return PROPERTY_REMOVED;
case 0x10:
return PROPERTY_CHANGED;
case 0x20:
return NODE_MOVED;
case 0x40:
return PERSIST;
}
return null;
}
}

@PostConstruct
public void initialize() {
eventBus.register(this);
Expand Down
@@ -1,4 +1,4 @@
package org.fcrepo.modeshape;
package org.fcrepo.modeshape.utils;

import static javax.ws.rs.core.Response.status;
import static javax.ws.rs.core.Response.Status.FORBIDDEN;
Expand Down

0 comments on commit c195410

Please sign in to comment.