Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
auto-discover serialization implementations, allowing the serializers…
… to be scanned and injected without additional spring configuration
  • Loading branch information
cbeer committed Jun 12, 2013
1 parent 2514d1b commit b2a793f
Show file tree
Hide file tree
Showing 13 changed files with 82 additions and 85 deletions.
11 changes: 1 addition & 10 deletions fcrepo-generator-dc/src/test/resources/spring-test/generator.xml
Expand Up @@ -10,7 +10,7 @@

<context:annotation-config />

<context:component-scan base-package="org.fcrepo.services, org.fcrepo.generator, org.fcrepo.api, org.fcrepo.exceptionhandlers"/>
<context:component-scan base-package="org.fcrepo.services, org.fcrepo.generator, org.fcrepo.serialization, org.fcrepo.api, org.fcrepo.exceptionhandlers"/>

<bean class="org.fcrepo.session.SessionFactory" />

Expand All @@ -24,13 +24,4 @@
<bean class="org.fcrepo.generator.dublincore.JcrPropertiesGenerator"/>
</util:list>

<util:map id="serializers" key-type="java.lang.String" map-class="java.util.HashMap"
value-type="org.fcrepo.serialization.FedoraObjectSerializer">
<description>Map from formats to serializers for Fedora objects</description>
<entry key="jcr/xml">
<bean class="org.fcrepo.serialization.jcrxml.JcrXmlSerializer"/>
</entry>
</util:map>


</beans>
13 changes: 8 additions & 5 deletions fcrepo-http-api/src/main/java/org/fcrepo/api/FedoraExport.java
Expand Up @@ -22,15 +22,18 @@

import org.fcrepo.AbstractResource;
import org.fcrepo.serialization.FedoraObjectSerializer;
import org.fcrepo.serialization.SerializerUtil;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@Path("/{path: .*}/fcr:export")
public class FedoraExport extends AbstractResource {

@Resource
private Map<String, FedoraObjectSerializer> serializers;
@Autowired
protected SerializerUtil serializers;

private final Logger logger = getLogger(this.getClass());

Expand All @@ -51,7 +54,7 @@ public void write(final OutputStream out) throws IOException {
logger.debug("Selecting from serializer map: " +
serializers);
final FedoraObjectSerializer serializer =
serializers.get(format);
serializers.getSerializer(format);
logger.debug("Retrieved serializer for format: " + format);
serializer.serialize(objectService.getObject(session, path), out);
logger.debug("Successfully serialized object: " + path);
Expand All @@ -64,8 +67,8 @@ public void write(final OutputStream out) throws IOException {
};
}

public void setSerializers(
final Map<String, FedoraObjectSerializer> serializers) {
public void setSerializers(final SerializerUtil serializers) {
this.serializers = serializers;
}

}
11 changes: 6 additions & 5 deletions fcrepo-http-api/src/main/java/org/fcrepo/api/FedoraImport.java
Expand Up @@ -23,15 +23,17 @@
import org.fcrepo.AbstractResource;
import org.fcrepo.exception.InvalidChecksumException;
import org.fcrepo.serialization.FedoraObjectSerializer;
import org.fcrepo.serialization.SerializerUtil;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@Path("/{path: .*}/fcr:import")
public class FedoraImport extends AbstractResource {

@Resource
private Map<String, FedoraObjectSerializer> serializers;
@Autowired
protected SerializerUtil serializers;

private final Logger logger = getLogger(this.getClass());

Expand All @@ -47,16 +49,15 @@ public Response importObject(@PathParam("path")
final Session session = getAuthenticatedSession();

try {
serializers.get(format).deserialize(session, path, stream);
serializers.getSerializer(format).deserialize(session, path, stream);
session.save();
return created(uriInfo.getAbsolutePathBuilder().path(FedoraNodes.class).build(path.substring(1))).build();
} finally {
session.logout();
}
}

public void setSerializers(
final Map<String, FedoraObjectSerializer> serializers) {
public void setSerializers(final SerializerUtil serializers) {
this.serializers = serializers;
}
}
Expand Up @@ -18,42 +18,13 @@
import javax.ws.rs.core.Response;

import org.fcrepo.AbstractResource;
import org.fcrepo.api.FedoraImport;
import org.fcrepo.exception.InvalidChecksumException;
import org.fcrepo.serialization.FedoraObjectSerializer;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;

@Component
@Path("/fcr:import")
public class FedoraRepositoryImport extends AbstractResource {

@Resource
private Map<String, FedoraObjectSerializer> serializers;

private final Logger logger = getLogger(this.getClass());

@POST
public Response importObject(@QueryParam("format")
@DefaultValue("jcr/xml")
final String format, final InputStream stream) throws IOException,
RepositoryException, InvalidChecksumException {

final String path = "/";
logger.debug("Deserializing at {}", path);
final Session session = getAuthenticatedSession();

try {
serializers.get(format).deserialize(session, path, stream);
session.save();
// TODO return proper URI for new resource
return created(uriInfo.getAbsolutePath()).build();
} finally {
session.logout();
}
}

public void setSerializers(final Map<String, FedoraObjectSerializer> serializers) {
this.serializers = serializers;
}

public class FedoraRepositoryImport extends FedoraImport {
}
Expand Up @@ -12,6 +12,7 @@
import javax.jcr.Session;

import org.fcrepo.serialization.FedoraObjectSerializer;
import org.fcrepo.serialization.SerializerUtil;
import org.fcrepo.test.util.TestHelpers;
import org.junit.Before;
import org.junit.Test;
Expand All @@ -21,15 +22,15 @@ public class FedoraImportTest {
FedoraImport testObj;

Session mockSession;
Map<String, FedoraObjectSerializer> mockSerializers;
SerializerUtil mockSerializers;

@Before
public void setUp() throws RepositoryException {

testObj = new FedoraImport();

mockSession = TestHelpers.mockSession(testObj);
mockSerializers = mock(Map.class);
mockSerializers = mock(SerializerUtil.class);
testObj.setSerializers(mockSerializers);


Expand All @@ -40,7 +41,7 @@ public void setUp() throws RepositoryException {
public void testImportObject() throws Exception {
InputStream mockInputStream = mock(InputStream.class);
FedoraObjectSerializer mockSerializer = mock(FedoraObjectSerializer.class);
when(mockSerializers.get("fake-format")).thenReturn(mockSerializer);
when(mockSerializers.getSerializer("fake-format")).thenReturn(mockSerializer);

testObj.importObject(createPathList("test", "object"), "fake-format", mockInputStream);
verify(mockSerializer).deserialize(mockSession, "/test/object", mockInputStream);
Expand Down
@@ -1,5 +1,6 @@
package org.fcrepo.api.repository;

import static org.fcrepo.test.util.PathSegmentImpl.createPathList;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
Expand All @@ -11,6 +12,7 @@
import javax.jcr.Session;

import org.fcrepo.serialization.FedoraObjectSerializer;
import org.fcrepo.serialization.SerializerUtil;
import org.fcrepo.test.util.TestHelpers;
import org.junit.Before;
import org.junit.Test;
Expand All @@ -20,15 +22,15 @@ public class FedoraRepositoryImportTest {
FedoraRepositoryImport testObj;

Session mockSession;
Map<String, FedoraObjectSerializer> mockSerializers;
SerializerUtil mockSerializers;

@Before
public void setUp() throws RepositoryException {

testObj = new FedoraRepositoryImport();

mockSession = TestHelpers.mockSession(testObj);
mockSerializers = mock(Map.class);
mockSerializers = mock(SerializerUtil.class);
testObj.setSerializers(mockSerializers);


Expand All @@ -39,9 +41,9 @@ public void setUp() throws RepositoryException {
public void testImportObject() throws Exception {
InputStream mockInputStream = mock(InputStream.class);
FedoraObjectSerializer mockSerializer = mock(FedoraObjectSerializer.class);
when(mockSerializers.get("fake-format")).thenReturn(mockSerializer);
when(mockSerializers.getSerializer("fake-format")).thenReturn(mockSerializer);

testObj.importObject("fake-format", mockInputStream);
testObj.importObject(createPathList(), "fake-format", mockInputStream);
verify(mockSerializer).deserialize(mockSession, "/", mockInputStream);

}
Expand Down
8 changes: 0 additions & 8 deletions fcrepo-http-api/src/test/resources/spring-test/rest.xml
Expand Up @@ -16,12 +16,4 @@
<context:component-scan
base-package="org.fcrepo.services, org.fcrepo.api, org.fcrepo.serialization, org.fcrepo.responses, org.fcrepo.exceptionhandlers, org.fcrepo.url"/>

<util:map id="serializers" key-type="java.lang.String" map-class="java.util.HashMap"
value-type="org.fcrepo.serialization.FedoraObjectSerializer">
<description>Map from formats to serializers for Fedora objects</description>
<entry key="jcr/xml">
<bean class="org.fcrepo.serialization.jcrxml.JcrXmlSerializer"/>
</entry>
</util:map>

</beans>
Expand Up @@ -15,6 +15,8 @@
@Component
public interface FedoraObjectSerializer {

String getKey();

void serialize(final FedoraObject obj, final OutputStream out)
throws RepositoryException, IOException;

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

package org.fcrepo.serialization.jcrxml;
package org.fcrepo.serialization;

import java.io.IOException;
import java.io.InputStream;
Expand All @@ -12,9 +12,16 @@

import org.fcrepo.FedoraObject;
import org.fcrepo.serialization.BaseFedoraObjectSerializer;
import org.springframework.stereotype.Component;

@Component
public class JcrXmlSerializer extends BaseFedoraObjectSerializer {

@Override
public String getKey() {
return "jcr/xml";
}

@Override
public void serialize(final FedoraObject obj, final OutputStream out)
throws RepositoryException, IOException {
Expand Down
@@ -0,0 +1,42 @@
package org.fcrepo.serialization;

import org.slf4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

import static org.slf4j.LoggerFactory.getLogger;

/**
* Helper service that aggregates serializers and makes them accessible by key
*/
@Component
public class SerializerUtil implements ApplicationContextAware {
private static final Logger LOGGER = getLogger(SerializerUtil.class);
private ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}

public FedoraObjectSerializer getSerializer(final String format) {
return getFedoraObjectSerializers().get(format);
}

private Map<String, FedoraObjectSerializer> getFedoraObjectSerializers() {
final Map<String, FedoraObjectSerializer> beans = applicationContext.getBeansOfType(FedoraObjectSerializer.class);

Map<String, FedoraObjectSerializer> m = new HashMap<String, FedoraObjectSerializer>();

for(Map.Entry<String, FedoraObjectSerializer> e : beans.entrySet()) {
m.put(e.getValue().getKey(), e.getValue());
}

return m;
}
}
Expand Up @@ -13,6 +13,7 @@
import javax.jcr.Session;

import org.fcrepo.FedoraObject;
import org.fcrepo.serialization.JcrXmlSerializer;
import org.junit.Test;

public class JcrXmlSerializerTest {
Expand Down
10 changes: 1 addition & 9 deletions fcrepo-webapp/src/main/resources/spring/rest.xml
Expand Up @@ -5,8 +5,7 @@
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- Context that houses JAX-RS Resources that compose the API
as well as some utility gear. -->
Expand All @@ -19,11 +18,4 @@

<context:component-scan base-package="org.fcrepo.services, org.modeshape.web.jcr.rest, org.fcrepo.api, org.fcrepo.serialization, org.fcrepo.responses, org.fcrepo.exceptionhandlers, org.fcrepo.audit, org.fcrepo.url"/>

<util:map id="serializers" key-type="java.lang.String" map-class="java.util.HashMap"
value-type="org.fcrepo.serialization.FedoraObjectSerializer">
<description>Map from formats to serializers for Fedora objects</description>
<entry key="jcr/xml">
<bean class="org.fcrepo.serialization.jcrxml.JcrXmlSerializer"/>
</entry>
</util:map>
</beans>
10 changes: 1 addition & 9 deletions fcrepo-webhooks/src/test/resources/spring-test/rest.xml
Expand Up @@ -15,19 +15,11 @@

<context:annotation-config/>

<context:component-scan base-package="org.fcrepo.services, org.fcrepo.api, org.fcrepo.webhooks, org.fcrepo.integration.webhooks, org.fcrepo.exceptionhandlers"/>
<context:component-scan base-package="org.fcrepo.services, org.fcrepo.api, org.fcrepo.webhooks, org.fcrepo.integration.webhooks, org.fcrepo.serialization, org.fcrepo.exceptionhandlers"/>

<bean class="org.fcrepo.session.SessionFactory" />

<!-- Mints PIDs-->
<bean class="org.fcrepo.identifiers.UUIDPidMinter"/>

<util:map id="serializers" key-type="java.lang.String" map-class="java.util.HashMap"
value-type="org.fcrepo.serialization.FedoraObjectSerializer">
<description>Map from formats to serializers for Fedora objects</description>
<entry key="jcr/xml">
<bean class="org.fcrepo.serialization.jcrxml.JcrXmlSerializer"/>
</entry>
</util:map>

</beans>

0 comments on commit b2a793f

Please sign in to comment.