Skip to content

Commit

Permalink
Improved fcrepo-kernel injection patterns
Browse files Browse the repository at this point in the history
  • Loading branch information
ajs6f committed Feb 16, 2013
1 parent 5a05432 commit 1eafff1
Show file tree
Hide file tree
Showing 12 changed files with 176 additions and 107 deletions.
70 changes: 70 additions & 0 deletions fcrepo-kernel/src/main/java/org/fcrepo/eventing/DefaultFilter.java
@@ -0,0 +1,70 @@

package org.fcrepo.eventing;

import static com.google.common.collect.Iterables.any;
import static com.google.common.collect.Sets.newHashSet;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.inject.Default;
import javax.inject.Inject;
import javax.jcr.LoginException;
import javax.jcr.PathNotFoundException;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
import javax.jcr.observation.Event;

import org.modeshape.common.SystemFailureException;

import com.google.common.base.Predicate;

@Default
public class DefaultFilter implements EventFilter {

@Inject
private Repository repository;

// it's safe to keep the session around, because this code does not mutate
// the state of the repository
private Session session;

private Predicate<NodeType> isFedoraNodeType = new Predicate<NodeType>() {

@Override
public boolean apply(NodeType type) {
return type.getName().startsWith("fedora:");
}
};

@Override
public boolean apply(Event event) {

try {
return any(newHashSet(session.getNode(event.getPath())
.getMixinNodeTypes()), isFedoraNodeType);

} catch (PathNotFoundException e) {
return false; // not a node in the fedora workspace
} catch (LoginException e) {
throw new SystemFailureException(e);
} catch (RepositoryException e) {
throw new SystemFailureException(e);
}
}

@PostConstruct
public void acquireSession() {
try {
session = repository.login();
} catch (RepositoryException e) {
throw new IllegalStateException(e);
}
}

@PreDestroy
public void releaseSession() {
session.logout();
}
}
@@ -1,4 +1,4 @@
package org.fcrepo.observer;
package org.fcrepo.eventing;

import javax.jcr.observation.Event;

Expand Down
@@ -0,0 +1,21 @@

package org.fcrepo.eventing;

import javax.inject.Singleton;

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

import com.google.common.eventbus.EventBus;

@Singleton
public class FedoraEventBus extends EventBus {

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

public FedoraEventBus() {
super();
logger.debug("Created Fedora event bus.");
}

}
@@ -1,7 +1,9 @@
package org.fcrepo.observer;
package org.fcrepo.eventing;

import javax.enterprise.inject.Alternative;
import javax.jcr.observation.Event;

@Alternative
public class NOOPFilter implements EventFilter {
@Override
public boolean apply(Event event) {
Expand Down
@@ -1,17 +1,17 @@

package org.fcrepo.observer;
package org.fcrepo.eventing;

import static com.google.common.collect.Collections2.filter;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;

import org.modeshape.jcr.api.Repository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down
@@ -0,0 +1,20 @@
package org.fcrepo.jcr;

import java.net.MalformedURLException;
import java.net.URL;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.Produces;

@ApplicationScoped
@Default
public class DefaultConfiguration {

@Produces
@ModeShapeRepositoryConfiguration
public URL getConfiguration() throws MalformedURLException {
return this.getClass().getResource("/repository.json");
}

}
@@ -1,16 +1,21 @@

package org.fcrepo.jcr;

import static java.util.Collections.singletonMap;
import static org.modeshape.jcr.api.RepositoryFactory.URL;

import java.net.URL;
import java.util.Collections;

import javax.annotation.PostConstruct;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;

import org.modeshape.jcr.JcrRepository;
import org.modeshape.jcr.JcrRepositoryFactory;
import org.modeshape.jcr.api.RepositoryFactory;

public class ModeShapeRepositoryFactoryBean {

Expand All @@ -28,17 +33,22 @@ public void buildRepository() {
try {
repository =
(JcrRepository) jcrRepositoryFactory
.getRepository(Collections.singletonMap(
RepositoryFactory.URL,
.getRepository(singletonMap(URL,
repositoryConfiguration));
} catch (RepositoryException e) {
throw new IllegalStateException(e);
}
}

public JcrRepository getRepository() {
@Produces
@Singleton
public Repository getRepository() {
if (repository == null) buildRepository();
return repository;
}

@Default
public static class FedoraRepositoryFactory extends JcrRepositoryFactory {
}

}
62 changes: 0 additions & 62 deletions fcrepo-kernel/src/main/java/org/fcrepo/observer/DefaultFilter.java

This file was deleted.

Empty file.
@@ -1,3 +1,4 @@

package org.fcrepo.observer;

import static org.junit.Assert.assertEquals;
Expand All @@ -9,58 +10,63 @@
import javax.jcr.observation.Event;

import org.fcrepo.AbstractTest;
import org.fcrepo.eventing.FedoraEventBus;
import org.fcrepo.eventing.SimpleObserver;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

public class SimpleObserverTest extends AbstractTest {

private Integer eventBusMessageCount;
@Inject
private Repository repository;
private Integer eventBusMessageCount;

@Inject
private SimpleObserver observer;

@Inject
private Repository repository;

@Inject
private EventBus eventBus;
@Inject
private FedoraEventBus eventBus;

@Test
public void TestEventBusPublishing() throws RepositoryException {
@Test
public void TestEventBusPublishing() throws RepositoryException {

Session se = repository.login();
se.getRootNode().addNode("/object1").addMixin("fedora:object");
se.getRootNode().addNode("/object2").addMixin("fedora:object");
se.save();
se.logout();
Session se = repository.login();
se.getRootNode().addNode("/object1").addMixin("fedora:object");
se.getRootNode().addNode("/object2").addMixin("fedora:object");
se.save();
se.logout();

try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}

// Should be two messages, for each time
// each node becomes a Fedora object
// Should be two messages, for each time
// each node becomes a Fedora object

assertEquals("Where are my messages!?", (Integer) 2,
eventBusMessageCount);
assertEquals("Where are my messages!?", (Integer) 2,
eventBusMessageCount);

}
}

@Subscribe
public void countMessages(Event e) {
eventBusMessageCount++;
}
@Subscribe
public void countMessages(Event e) {
eventBusMessageCount++;
}

@Before
public void acquireConnections() {
eventBusMessageCount = 0;
eventBus.register(this);
}
@Before
public void acquireConnections() {
eventBusMessageCount = 0;
eventBus.register(this);
}

@After
public void releaseConnections() {
eventBus.unregister(this);
}
@After
public void releaseConnections() {
eventBus.unregister(this);
}
}
2 changes: 2 additions & 0 deletions fcrepo-kernel/src/test/resources/exam.properties
@@ -0,0 +1,2 @@
pax.exam.system = cdi
pax.exam.logging = none

0 comments on commit 1eafff1

Please sign in to comment.