Skip to content

Commit

Permalink
New fcrepo-foxml in support of https://www.pivotaltracker.com/story/s…
Browse files Browse the repository at this point in the history
  • Loading branch information
ajs6f committed Feb 14, 2013
1 parent 0c48e63 commit e770c0f
Show file tree
Hide file tree
Showing 23 changed files with 578 additions and 244 deletions.
139 changes: 139 additions & 0 deletions fcrepo-foxml/pom.xml
@@ -0,0 +1,139 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.fcrepo</groupId>
<artifactId>fcrepo</artifactId>
<version>4.0-SNAPSHOT</version>
</parent>
<artifactId>fcrepo-foxml</artifactId>
<packaging>bundle</packaging>

<name>FOXML services</name>
<description>Services for accepting and parsing FOXML</description>

<dependencies>
<dependency>
<groupId>org.fcrepo</groupId>
<artifactId>fcrepo-kernel</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.fcrepo</groupId>
<artifactId>fcrepo-http-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>

<!-- test gear -->
<dependency>
<groupId>org.fcrepo</groupId>
<artifactId>fcrepo-legacy-api</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>

<!-- This dependency is for compile-time: it keeps this module independent
of any given choice of JAX-RS implementation. It must be _after_ the test
gear. Otherwise it will get loaded during test phase, but because this is
just an API, the tests will not be able to execute. -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<configuration>
<args>
<arg>-feature</arg>
</args>
</configuration>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src/main/scala</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

<repositories>
<repository>
<id>Scala Tools</id>
<url>https://oss.sonatype.org/content/groups/scala-tools/</url>
</repository>
</repositories>

</project>
@@ -1,4 +1,5 @@
package org.fcrepo.api.legacy.foxml;

package org.fcrepo.legacy.foxml;

import java.io.IOException;

Expand All @@ -7,15 +8,14 @@
import javax.jcr.Property;
import javax.jcr.RepositoryException;

import org.fcrepo.api.legacy.foxml.FOXMLParser;
import org.modeshape.common.i18n.TextI18n;
import org.modeshape.common.logging.Logger;
import org.modeshape.jcr.api.nodetype.NodeTypeManager;
import org.modeshape.jcr.api.sequencer.Sequencer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FOXMLSequencer extends Sequencer {

private final Logger log = Logger.getLogger(FOXMLSequencer.class);
private final Logger log = LoggerFactory.getLogger(FOXMLSequencer.class);

private FOXMLParser parser;

Expand All @@ -31,7 +31,7 @@ public boolean execute(Property inputProperty, Node outputNode,
parser.parse(inputProperty.getBinary().getStream(), outputNode);
return true;
} catch (Exception e) {
log.error(e, new TextI18n("Failed to sequence FOXML"));
log.error("Failed to parse FOXML!", e);
return false;
}

Expand All @@ -43,8 +43,8 @@ public void initialize(NamespaceRegistry registry,
IOException {
// registerDefaultMimeTypes("text/xml");
getLogger().debug(
"Initializing " + getClass().getCanonicalName() + "["
+ getName() + "]");
"Initializing " + getClass().getCanonicalName() + "[" +
getName() + "]");
parser = new FOXMLParser();
}

Expand Down
@@ -1,5 +1,7 @@

package org.fcrepo.api.legacy.foxml;
package org.fcrepo.legacy.foxml;

import static org.slf4j.LoggerFactory.getLogger;

import java.io.IOException;
import java.io.InputStream;
Expand All @@ -19,13 +21,14 @@
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.fcrepo.AbstractResource;
import org.slf4j.Logger;

import com.google.common.collect.ImmutableMap;

@Path("/foxml")
public class FedoraOXML extends AbstractResource {

//private final Logger logger = Logger.getLogger(FedoraOXML.class);
private final Logger logger = getLogger(FedoraOXML.class);

@PUT
@Path("/{filename}")
Expand All @@ -37,6 +40,7 @@ public Response addFOXML(@PathParam("filename")
final Session session = repo.login();
if (session.hasPermission("/foxml", "add_node")) {
final String foxmlpath = "/foxml/" + filename;
logger.debug("Received FOXML file with name: " + filename);
jcrTools.uploadFile(session, foxmlpath, foxml);
session.save();
session.logout();
Expand Down
@@ -1,9 +1,10 @@
package org.fcrepo.api.legacy.foxml
package org.fcrepo.legacy.foxml

import java.io.ByteArrayInputStream
import java.io.InputStream
import scala.xml.XML
import org.modeshape.common.logging.Logger
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.modeshape.jcr.api.JcrTools
import javax.jcr.Node

Expand All @@ -12,15 +13,14 @@ import scala.language.postfixOps
class FOXMLParser {

val jcrTools: JcrTools = new JcrTools()
val log: Logger = LoggerFactory.getLogger("FOXMLParser");

def parse(input: InputStream, objNode: Node) {

val log: Logger = Logger.getLogger("FOXMLParser");

log.debug("Operating to alter node: " + objNode.getPath())

val foxmlObj = XML.load(input)
//log.debug("Found object XML: \n" + foxmlObj.toString)
log.debug("Found object XML: \n" + foxmlObj.toString)

objNode.addMixin("fedora:object")

Expand All @@ -38,15 +38,15 @@ class FOXMLParser {
for (datastream <- foxmlObj \\ "datastream") {
//log.debug("Found datastream: " + datastream.toString)
val dsId = (datastream \ "@ID").text
val controlGroup = datastream \ "@CONTROL_GROUP"
val controlGroup = datastream \ "@CONTROL_GROUP"
//log.debug("Found control group: " + controlGroup)
var latestVersion: String = null
if (controlGroup.toString == "X") {
latestVersion = (datastream \\ "xmlContent" \ "_").head.toString
log.debug("Found content: \n" + latestVersion)
} else {
// insert placeholder
latestVersion = "PLACEHOLDER"
latestVersion = "PLACEHOLDER"
}
val dsNode = jcrTools.uploadFile(objNode.getSession(), objNode.getPath() + "/" + dsId, new ByteArrayInputStream(latestVersion.getBytes))
dsNode.addMixin("fedora:datastream")
Expand All @@ -57,7 +57,7 @@ class FOXMLParser {
}

def report = {
"FOXML parser for ffmodeshapeprototype"
"FOXML parser"
}

}
@@ -0,0 +1,79 @@

package org.fcrepo.legacy.foxml;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.TimeUnit;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/spring-test/repo.xml", "/spring-test/rest.xml"})
public abstract class AbstractResourceTest {

protected Logger logger;

@Before
public void setLogger() {
logger = LoggerFactory.getLogger(this.getClass());
}

protected static final int SERVER_PORT = Integer.parseInt(System
.getProperty("test.port", "8080"));

protected static final String HOSTNAME = "localhost";

protected static final String serverAddress = "http://" + HOSTNAME + ":" +
SERVER_PORT + "/rest/";

protected final PoolingClientConnectionManager connectionManager =
new PoolingClientConnectionManager();

protected static HttpClient client;

public AbstractResourceTest() {
connectionManager.setMaxTotal(Integer.MAX_VALUE);
connectionManager.setDefaultMaxPerRoute(5);
connectionManager.closeIdleConnections(3, TimeUnit.SECONDS);
client = new DefaultHttpClient(connectionManager);
}

protected static HttpPost postObjMethod(final String pid) {
return new HttpPost(serverAddress + "objects/" + pid);
}

protected static HttpPost postDSMethod(final String pid, final String ds,
final String content) throws UnsupportedEncodingException {
final HttpPost post =
new HttpPost(serverAddress + "objects/" + pid +
"/datastreams/" + ds);
post.setEntity(new StringEntity(content));
return post;
}

protected static HttpPut putDSMethod(final String pid, final String ds) {
return new HttpPut(serverAddress + "objects/" + pid + "/datastreams/" +
ds);
}

protected int getStatus(HttpUriRequest method)
throws ClientProtocolException, IOException {
logger.debug("Executing: " + method.getMethod() + " to " +
method.getURI());
return client.execute(method).getStatusLine().getStatusCode();
}

}

0 comments on commit e770c0f

Please sign in to comment.