listSubscriptions(String prefix);
+
+ /**
+ * removes a particular subscription.
+ *
+ * @param subscriptionId identifier
+ * @return true if successful
+ */
+ boolean removeSubscription(String subscriptionId);
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SubscriptionRegistry.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SubscriptionRegistry.java
new file mode 100644
index 0000000..9f6cfc2
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SubscriptionRegistry.java
@@ -0,0 +1,84 @@
+package eu.dnetlib.enabling.is.sn;
+
+import java.util.Collection;
+
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscription;
+import eu.dnetlib.enabling.is.sn.rmi.SubscriptionRequestRejectedException;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+
+/**
+ * A subscription registry stores subscriptions.
+ *
+ *
+ * Different subscription registries know how to to store different kind of subscriptions. Each registry is specialized
+ * in one type of subscriptions and knows how to quickly find all potentially interesting subscriptions so that a
+ * particular NotificationDetector can do his job the quickest way possible.
+ *
+ *
+ *
+ * This interface is generic only for subscription purposes because the Subscriber component simply tries to register a
+ * new subscription to all available subscription registries.
+ *
+ *
+ *
+ * Normally a subscription registry manages only a set of topic expression prefixes, but this interface doesn't force
+ * the Subscriber to know this information; instead the subscription registry itself will decide whether to accept the
+ * subscription or not.
+ *
+ *
+ * Since many subscription registries may accept the same subscription, the identifier is preallocated by the
+ * Subscriber, since the subscription is only one, and even if we give the possibility for several detectors to detect
+ * it from different sources only one event will be generated.
+ *
+ *
+ * @author marko
+ *
+ */
+public interface SubscriptionRegistry {
+
+ /**
+ * register a subscription.
+ *
+ * @param subscription
+ * subscription request
+ * @return if we can accept this subcription we return the (possibly changed) identifier, otherwise null
+ */
+ String registerSubscription(SubscriptionRequest subscription) throws SubscriptionRequestRejectedException;
+
+ /**
+ * Unsubscribe a subscription if it exists.
+ *
+ * @param subId subscription identifier
+ * @return true if this subscription existed and was successfully removed
+ */
+ boolean unsubscribe(final String subId);
+
+ /**
+ * return all subscriptions matching a given prefix and a given type. Wildcard subscriptions will match any resource type.
+ *
+ * @param prefix
+ * prefix
+ * @param type
+ * concrete type
+ * @param resId
+ * resource identifier
+ * @return all matching subscriptions
+ */
+ Collection listMatchingSubscriptions(final String prefix, final String type, final String resId);
+
+ /**
+ * return all subscriptions.
+ *
+ * @return all subscriptions
+ */
+ Collection listSubscriptions();
+
+ /**
+ * removes a particular subscription.
+ *
+ * @param subscriptionId identifier
+ * @return true if successful
+ */
+ boolean removeSubscription(String subscriptionId);
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SubscriptionRequest.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SubscriptionRequest.java
new file mode 100644
index 0000000..a54ffe3
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SubscriptionRequest.java
@@ -0,0 +1,88 @@
+package eu.dnetlib.enabling.is.sn;
+
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+
+/**
+ * A SubscriptionRequest encapsulates various information about a subscription request.
+ *
+ * @author marko
+ *
+ */
+public class SubscriptionRequest {
+
+ /**
+ * subscriber.
+ */
+ private W3CEndpointReference subscriber;
+
+ /**
+ * topic expression.
+ */
+ private String topicExpression;
+
+ /**
+ * Preallocated subscription Id. If registries accept the subscription, they will store this in the subscription
+ * identifier.
+ */
+ private String subscriptionId;
+
+ /**
+ * time to live.
+ */
+ private int ttl;
+
+ /**
+ * default constructor.
+ */
+ public SubscriptionRequest() {
+ // no operation
+ }
+
+ /**
+ * construct with fields.
+ *
+ * @param subscriptionId subscription id
+ * @param subscriber subscriber
+ * @param topicExpression topic expression
+ * @param ttl time to live
+ */
+ public SubscriptionRequest(final String subscriptionId, final W3CEndpointReference subscriber, final String topicExpression, final int ttl) {
+ super();
+ this.subscriptionId = subscriptionId;
+ this.subscriber = subscriber;
+ this.topicExpression = topicExpression;
+ this.ttl = ttl;
+ }
+
+ public W3CEndpointReference getSubscriber() {
+ return subscriber;
+ }
+
+ public void setSubscriber(final W3CEndpointReference subscriber) {
+ this.subscriber = subscriber;
+ }
+
+ public String getTopicExpression() {
+ return topicExpression;
+ }
+
+ public void setTopicExpression(final String topicExpression) {
+ this.topicExpression = topicExpression;
+ }
+
+ public String getSubscriptionId() {
+ return subscriptionId;
+ }
+
+ public void setSubscriptionId(final String subscriptionId) {
+ this.subscriptionId = subscriptionId;
+ }
+
+ public int getTtl() {
+ return ttl;
+ }
+
+ public void setTtl(final int ttl) {
+ this.ttl = ttl;
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SynchronousNotificationSenderImpl.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SynchronousNotificationSenderImpl.java
new file mode 100644
index 0000000..b4a1ac5
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/SynchronousNotificationSenderImpl.java
@@ -0,0 +1,40 @@
+package eu.dnetlib.enabling.is.sn;
+
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * This implementation of NotificationSender simply sends notification synchronously.
+ *
+ * NOTE: this is only for testing. Real-wold cases should use AsynchrnonousNotificationSender, because we have to
+ * get out the thread serving eXist queries.
+ *
+ * @author marko
+ *
+ */
+public class SynchronousNotificationSenderImpl extends AbstractNotificationSender {
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(SynchronousNotificationSenderImpl.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.NotificationSender#send(javax.xml.ws.wsaddressing.W3CEndpointReference,
+ * eu.dnetlib.enabling.is.sn.NotificationMessage)
+ */
+ @Override
+ public void send(final W3CEndpointReference destination, final NotificationMessage message) {
+ log.info("synchronously sending message " + message.getSubscriptionId() + ", " + message.getTopic() + ", " + message.getResourceId() + ", "
+ + message.getBody());
+ try {
+ getInvoker().send(destination, message, 0);
+ } catch (javax.xml.ws.soap.SOAPFaultException t) {
+ log.fatal("error sending notification to " + destination.toString(), t);
+ }
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/TestISSNServiceImpl.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/TestISSNServiceImpl.java
new file mode 100644
index 0000000..c23eff2
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/TestISSNServiceImpl.java
@@ -0,0 +1,40 @@
+package eu.dnetlib.enabling.is.sn;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import eu.dnetlib.enabling.is.sn.rmi.ISSNException;
+
+/**
+ * As a complementary approach w.r.t unit tests, this class is an extension of
+ * the default ISSN Service which creates a number of initial subscriptions so that we can play
+ * with some notifications.
+ *
+ * This class plays well with TestISStoreServiceImpl, which creates some profiles at startup time
+ * and schedules some automated mutations.
+ *
+ * @author marko
+ *
+ */
+public class TestISSNServiceImpl extends ISSNServiceImpl {
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(TestISSNServiceImpl.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.tools.AbstractBaseService#start()
+ */
+ @Override
+ public void start() {
+ super.start();
+
+ try {
+ subscribe(getEprBuilder().getEndpointReference(getEndpoint()), "CREATE/TestResourceType/*", 0);
+ } catch (ISSNException e) {
+ log.fatal("cannot subscribe test subscriptions", e);
+ }
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/TopicExpressionMatchResult.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/TopicExpressionMatchResult.java
new file mode 100644
index 0000000..20434f9
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/TopicExpressionMatchResult.java
@@ -0,0 +1,46 @@
+package eu.dnetlib.enabling.is.sn;
+
+/**
+ * Groups a topic expression prefix match result.
+ *
+ *
+ * Utility class.
+ *
+ *
+ * @author marko
+ *
+ */
+public class TopicExpressionMatchResult {
+ /**
+ * Topic expression prefix.
+ */
+ private final transient String prefix;
+
+ /**
+ * RestOf the topic expression.
+ */
+ private final transient String rest;
+
+ /**
+ * construct a new topic expression prefix match result.
+ * @param prefix
+ * prefix
+ * @param rest
+ * rest
+ */
+ public TopicExpressionMatchResult(final String prefix, final String rest) {
+ super();
+ this.prefix = prefix;
+ this.rest = rest;
+ }
+
+ public String getPrefix() {
+ return prefix;
+ }
+
+ public String getRest() {
+ return rest;
+ }
+
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateNotificationDetectorFilter.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateNotificationDetectorFilter.java
new file mode 100644
index 0000000..c103731
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateNotificationDetectorFilter.java
@@ -0,0 +1,83 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import eu.dnetlib.enabling.is.sn.NotificationSender;
+
+/**
+ * sits on top of a ResourceStateNotificationDetector and filters out resources for which we don't want to generate
+ * notifications.
+ *
+ * @author marko
+ *
+ * @param
+ * type of the resource object
+ */
+public abstract class AbstractResourceStateNotificationDetectorFilter implements ResourceStateNotificationDetector {
+
+ /**
+ * delegate.
+ */
+ private ResourceStateNotificationDetector delegate;
+
+ /**
+ * implement this in order to decide which resources are interesting for notifications, and which are not (for
+ * example pending resources are by ignored in dnet 1.0).
+ *
+ * @param resource
+ * resource
+ * @return true if the resource is potentially accepted for notification
+ */
+ abstract boolean accept(T resource);
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateNotificationDetector#resourceCreated(java.lang.Object)
+ */
+ @Override
+ public void resourceCreated(final T newResource) {
+ if (accept(newResource))
+ delegate.resourceCreated(newResource);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateNotificationDetector#resourceDeleted(java.lang.Object)
+ */
+ @Override
+ public void resourceDeleted(final T oldResource) {
+ if (accept(oldResource))
+ delegate.resourceDeleted(oldResource);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateNotificationDetector#resourceUpdated(java.lang.Object,
+ * java.lang.Object)
+ */
+ @Override
+ public void resourceUpdated(final T oldResource, final T newResource) {
+ if (accept(oldResource) || accept(newResource))
+ delegate.resourceUpdated(oldResource, newResource);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.NotificationDetector#setSender(eu.dnetlib.enabling.is.sn.NotificationSender)
+ */
+ @Override
+ public void setSender(final NotificationSender sender) {
+ delegate.setSender(sender);
+ }
+
+ public ResourceStateNotificationDetector getDelegate() {
+ return delegate;
+ }
+
+ public void setDelegate(final ResourceStateNotificationDetector delegate) {
+ this.delegate = delegate;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ConditionalResourceStateNotificationDetectorFilter.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ConditionalResourceStateNotificationDetectorFilter.java
new file mode 100644
index 0000000..c5640d6
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ConditionalResourceStateNotificationDetectorFilter.java
@@ -0,0 +1,39 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import org.springframework.beans.factory.annotation.Required;
+
+import eu.dnetlib.enabling.tools.OpaqueResource;
+import eu.dnetlib.miscutils.coupling.ExternalCondition;
+
+/**
+ * Ignores pending profiles from notification detection.
+ *
+ * @author marko
+ *
+ */
+public class ConditionalResourceStateNotificationDetectorFilter extends AbstractResourceStateNotificationDetectorFilter {
+
+ /**
+ * external condition that drives this filter. We accept notification while the external condition is false.
+ */
+ private ExternalCondition inhibitionCondition; // NOPMD
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.AbstractResourceStateNotificationDetectorFilter#accept(java.lang.Object)
+ */
+ @Override
+ boolean accept(final OpaqueResource resource) {
+ return !inhibitionCondition.isTrue();
+ }
+
+ public ExternalCondition getInhibitionCondition() {
+ return inhibitionCondition;
+ }
+
+ @Required
+ public void setInhibitionCondition(final ExternalCondition inhibitionCondition) { // NOPMD
+ this.inhibitionCondition = inhibitionCondition;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionDAOImpl.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionDAOImpl.java
new file mode 100644
index 0000000..0830b6a
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionDAOImpl.java
@@ -0,0 +1,132 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * dummy implementation of the resource state subscription DAO layer, using an in-memory map.
+ *
+ * @author marko
+ *
+ */
+public class MemoryResourceStateSubscriptionDAOImpl implements ResourceStateSubscriptionDAO {
+
+ /**
+ * by id.
+ */
+ private Map byId = new HashMap();
+
+ /**
+ * groups subscriptions with the same prefix and type.
+ */
+ private Map> byPrefixAndType = new HashMap>();
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscriptionDAO#listSubscriptions(java.lang.String,
+ * java.lang.String, java.lang.String)
+ */
+ @Override
+ public Collection listSubscriptions(final String prefix, final String resourceType, final String resourceId) {
+ return orDefault(getByPrefixAndType().get(prefix + "/" + resourceType + "/" + resourceId));
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#addSubscription(java.lang.Object)
+ */
+ @Override
+ public void addSubscription(final ResourceStateSubscription subscription) {
+ getById().put(subscription.getSubscriptionId(), subscription);
+
+ final String key = subscription.getPrefix() + "/" + subscription.getType() + "/" + subscription.getResourceId();
+ final Collection prefTypeList = getByPrefixAndType().get(key);
+ if (prefTypeList == null)
+ getByPrefixAndType().put(key, new ArrayList());
+ getByPrefixAndType().get(key).add(subscription);
+
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#getSubscription(java.lang.String)
+ */
+ @Override
+ public ResourceStateSubscription getSubscription(final String subscriptionId) {
+ return getById().get(subscriptionId);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#listSubscriptions()
+ */
+ @Override
+ public Collection listSubscriptions() {
+ return orDefault(getById().values());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#listSubscriptions(java.lang.String)
+ */
+ @Override
+ public Collection listSubscriptions(final String prefix) {
+ return listSubscriptions(prefix, "*", "*");
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#removeSubscription(java.lang.String)
+ */
+ @Override
+ public boolean removeSubscription(final String subscriptionId) {
+ final ResourceStateSubscription subscription = getSubscription(subscriptionId);
+ if (subscription == null)
+ return false;
+ final String key = subscription.getPrefix() + "/" + subscription.getType() + "/" + subscription.getResourceId();
+
+ final Collection prefTypeList = getByPrefixAndType().get(key);
+ prefTypeList.remove(subscription);
+
+ getById().remove(subscriptionId);
+ return true;
+ }
+
+ /**
+ * inner helper method. returns an empty collection instead of a null.
+ *
+ * @param collection
+ * some collection
+ * @return input collection or empty collection
+ */
+ private Collection orDefault(final Collection collection) {
+ if (collection == null)
+ return new ArrayList();
+ return collection;
+ }
+
+ public Map getById() {
+ return byId;
+ }
+
+ public void setById(final Map byId) {
+ this.byId = byId;
+ }
+
+ public Map> getByPrefixAndType() {
+ return byPrefixAndType;
+ }
+
+ public void setByPrefixAndType(final Map> byPrefixAndType) {
+ this.byPrefixAndType = byPrefixAndType;
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/PendingResourceStateNotificationDetectorFilter.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/PendingResourceStateNotificationDetectorFilter.java
new file mode 100644
index 0000000..a6daac3
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/PendingResourceStateNotificationDetectorFilter.java
@@ -0,0 +1,24 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import eu.dnetlib.enabling.tools.OpaqueResource;
+
+/**
+ * Ignores pending profiles from notification detection.
+ *
+ * @author marko
+ *
+ */
+public class PendingResourceStateNotificationDetectorFilter extends AbstractResourceStateNotificationDetectorFilter {
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.AbstractResourceStateNotificationDetectorFilter#accept(java.lang.Object)
+ */
+ @Override
+ boolean accept(final OpaqueResource resource) {
+ if (resource.getResourceKind().startsWith("Pending"))
+ return false;
+ return true;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateNotificationDetector.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateNotificationDetector.java
new file mode 100644
index 0000000..8bd8961
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateNotificationDetector.java
@@ -0,0 +1,39 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import eu.dnetlib.enabling.is.sn.NotificationDetector;
+
+/**
+ * Implementors detect topic assertions by sensing changes in resource state.
+ *
+ * @author marko
+ * @param
+ * type of resource
+ */
+public interface ResourceStateNotificationDetector extends NotificationDetector {
+ /**
+ * called when a new resource is created.
+ *
+ * @param newResource
+ * new resource
+ */
+ void resourceCreated(T newResource);
+
+ /**
+ * called when a resource is modified.
+ *
+ * @param oldResource
+ * old resource
+ * @param newResource
+ * new resource
+ */
+ void resourceUpdated(T oldResource, T newResource);
+
+ /**
+ * called when a resource is deleted.
+ *
+ * @param oldResource
+ * old resource
+ */
+ void resourceDeleted(T oldResource);
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscription.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscription.java
new file mode 100644
index 0000000..35e3fdb
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscription.java
@@ -0,0 +1,225 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import java.io.StringReader;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.ws.EndpointReference;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+
+import eu.dnetlib.enabling.is.sn.SubscriptionRequest;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+
+/**
+ * This class describes a ResourceState subscription, i.e. a subscription that is registered on a topic that depends on
+ * some xpath on some resource, and which is triggered when the value of this xpath changes.
+ *
+ * Topics of this type could not be there.
+ *
+ * @author marko
+ *
+ */
+@Entity(name = "subscriptions")
+@Table(name = "subscriptions")
+public class ResourceStateSubscription {
+
+ /**
+ * hash seed.
+ */
+ private static final int HASH_SEED_2 = 59;
+
+ /**
+ * hash seed.
+ */
+ private static final int HASH_SEED = 47;
+
+ /**
+ * create topic prefix.
+ */
+ public static final String PREFIX_CREATE = "CREATE";
+
+ /**
+ * delete topic prefix.
+ */
+ public static final String PREFIX_DELETE = "DELETE";
+
+ /**
+ * update topic prefix.
+ */
+ public static final String PREFIX_UPDATE = "UPDATE";
+
+ /**
+ * pending create topic prefix.
+ */
+ public static final String PREFIX_PENDING_CREATE = "PENDING_CREATE";
+
+ /**
+ * pending delete topic prefix.
+ */
+ public static final String PREFIX_PENDING_DELETE = "PENDING_DELETE";
+
+ /**
+ * pending update topic prefix.
+ */
+ public static final String PREFIX_PENDING_UPDATE = "PENDING_UPDATE";
+
+
+ /**
+ * subscription identifier.
+ */
+ @Id
+ @Column(name = "subscriptionid")
+ private String subscriptionId;
+
+ /**
+ * prefix: crude.
+ */
+ @Column(name = "prefix")
+ private String prefix;
+
+ /**
+ * resource type.
+ */
+ @Column(name = "type")
+ private String type;
+
+ /**
+ * resource id.
+ */
+ @Column(name = "resourceid")
+ private String resourceId;
+
+ /**
+ * xpath.
+ */
+ @Column(name = "xpath")
+ private String xpath;
+
+ /**
+ * consumer (subscriber) reference.
+ */
+ @Column(name = "subscriber", length = 4096)
+ private String subscriber;
+
+ /**
+ * default constructor. for unit testing.
+ */
+ public ResourceStateSubscription() {
+ this.type = "*";
+ this.resourceId = "*";
+ }
+
+ /**
+ * create a new instance.
+ *
+ * @param request
+ * original request.
+ * @param prefix
+ * prefix
+ * @param type
+ * resource type
+ * @param resourceId
+ * resource identifier
+ * @param xpath
+ * xpath
+ */
+ public ResourceStateSubscription(final SubscriptionRequest request, final String prefix, final String type, final String resourceId,
+ final String xpath) {
+ super();
+ setSubscriptionId(request.getSubscriptionId());
+ setSubscriber(request.getSubscriber());
+ setPrefix(prefix);
+ setType(type);
+ setResourceId(resourceId);
+ setXpath(xpath);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(HASH_SEED, HASH_SEED_2).append(subscriptionId).append(subscriber.toString()).append(prefix).append(type).append(xpath)
+ .toHashCode();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(final Object obj) {
+ if (!(obj instanceof ResourceStateSubscription))
+ return false;
+
+ if (this == obj)
+ return true;
+
+ final ResourceStateSubscription rhs = (ResourceStateSubscription) obj;
+ return new EqualsBuilder().append(subscriptionId, rhs.getSubscriptionId()).append(prefix, rhs.getPrefix()).append(
+ resourceId, rhs.getResourceId()).append(xpath, rhs.getXpath()).isEquals();
+ }
+
+ public String getSubscriptionId() {
+ return subscriptionId;
+ }
+
+ public void setSubscriptionId(final String subscriptionId) {
+ this.subscriptionId = subscriptionId;
+ }
+
+ public String getPrefix() {
+ return prefix;
+ }
+
+ public void setPrefix(final String prefix) {
+ this.prefix = prefix;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(final String type) {
+ this.type = type == null || type.isEmpty() ? "*" : type;
+ }
+
+ public String getXpath() {
+ return xpath;
+ }
+
+ public void setXpath(final String xpath) {
+ this.xpath = xpath;
+ }
+
+ public String getSubscriber() {
+ return subscriber;
+ }
+
+ public W3CEndpointReference getSubscriberAsEpr() {
+ return (W3CEndpointReference) EndpointReference.readFrom(new StreamSource(new StringReader(getSubscriber())));
+ }
+
+ public void setSubscriber(final W3CEndpointReference epr) {
+ this.subscriber = (epr != null) ? epr.toString() : null;;
+ }
+
+ public void setSubscriber(final String subscriber) {
+ this.subscriber = subscriber;
+ }
+
+ public void setResourceId(final String resourceId) {
+ this.resourceId = resourceId == null || resourceId.isEmpty() ? "*" : resourceId;
+ }
+
+ public String getResourceId() {
+ return resourceId;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionDAO.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionDAO.java
new file mode 100644
index 0000000..18a223d
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionDAO.java
@@ -0,0 +1,24 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import java.util.Collection;
+
+import eu.dnetlib.enabling.is.sn.SubscriptionDAO;
+
+/**
+ * Stores ResourceState subscriptions.
+ *
+ * @author marko
+ *
+ */
+public interface ResourceStateSubscriptionDAO extends SubscriptionDAO {
+
+ /**
+ * get all subscriptions matching a given prefix and a given resource type.
+ *
+ * @param prefix null means any prefix
+ * @param resourceType resource type.
+ * @param resourceId resource identifier
+ * @return matching subscriptions
+ */
+ Collection listSubscriptions(String prefix, String resourceType, String resourceId);
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionRegistry.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionRegistry.java
new file mode 100644
index 0000000..f573b82
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionRegistry.java
@@ -0,0 +1,233 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import com.google.common.collect.Sets;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.oro.text.perl.Perl5Util;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Required;
+
+import eu.dnetlib.enabling.is.sn.AbstractSubscriptionRegistry;
+import eu.dnetlib.enabling.is.sn.SubscriptionRegistry;
+import eu.dnetlib.enabling.is.sn.SubscriptionRequest;
+import eu.dnetlib.enabling.is.sn.TopicExpressionMatchResult;
+import eu.dnetlib.enabling.is.sn.rmi.SubscriptionRequestRejectedException;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+
+/**
+ * Manage subscription for UPDATE/CREATE/DELETE resource-related topic prefixes.
+ *
+ * @author marko
+ *
+ */
+public class ResourceStateSubscriptionRegistry extends AbstractSubscriptionRegistry implements SubscriptionRegistry {
+
+ private static final Log log = LogFactory.getLog(ResourceStateSubscriptionRegistry.class);
+
+ /**
+ * subscription DAO.
+ */
+ private ResourceStateSubscriptionDAO subscriptionDao;
+
+ /**
+ * subscription request filter.
+ */
+ @Autowired
+ private SubscriptionRequestFilter subscriptionRequestFilter;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionRegistry#registerSubscription(eu.dnetlib.enabling.is.sn.SubscriptionRequest)
+ */
+ @Override
+ @CacheEvict(value = "subscriptions", allEntries = true)
+ public String registerSubscription(final SubscriptionRequest subscription) throws SubscriptionRequestRejectedException {
+ final TopicExpressionMatchResult prefixMatch = matchPrefix(subscription);
+ if (prefixMatch == null)
+ return null;
+
+ final TopicExpressionMatchResult typeMatch = matchType(prefixMatch.getRest());
+ if (typeMatch == null)
+ return null; // TODO: decide whether to fail or not
+
+ final TopicExpressionMatchResult idMatch = matchId(typeMatch.getRest());
+
+ if (idMatch == null)
+ return null; // TODO: decide whether to fail or not
+
+ final ResourceStateSubscription rss = new ResourceStateSubscription(subscription, prefixMatch.getPrefix(), typeMatch.getPrefix(), idMatch.getPrefix(),
+ idMatch.getRest());
+
+ if (!getSubscriptionRequestFilter().accept(rss))
+ throw new SubscriptionRequestRejectedException(String.format("rejected subscription request, resourceId: '%s', xpath: '%s', from: %s",
+ rss.getResourceId(), rss.getXpath(), rss.getSubscriber()));
+
+ return registerSubscription(rss);
+ }
+
+ /**
+ * this registers the real subscription.
+ *
+ * TODO: am I sure that the overload is a good thing here?
+ *
+ * @param subscription
+ * subscription
+ * @return subscription id (potentially changed)
+ */
+ private String registerSubscription(final ResourceStateSubscription subscription) {
+ if(log.isDebugEnabled()) {
+ log.debug("evict subscriptions cache");
+ }
+
+ // TODO: change the dao, and implement a method which finds a given subscription directly.
+ final Collection similar = subscriptionDao.listSubscriptions(subscription.getPrefix(), subscription.getType(),
+ subscription.getResourceId());
+ for (final ResourceStateSubscription r : similar) {
+ if (r != null && getAddress(subscription.getSubscriberAsEpr()).equals(getAddress(r.getSubscriberAsEpr()))
+ && (subscription.getXpath() == r.getXpath() || subscription.getXpath().equals(r.getXpath()))
+ && (subscription.getResourceId() == r.getResourceId() || subscription.getResourceId().equals(r.getResourceId())))
+ return r.getSubscriptionId();
+ }
+
+ subscriptionDao.addSubscription(subscription);
+
+ return subscription.getSubscriptionId();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionRegistry#unsubscribe(java.lang.String)
+ */
+ @Override
+ @CacheEvict(value = "subscriptions", allEntries = true)
+ public boolean unsubscribe(final String subId) {
+ log.info("evict subscriptions cache");
+ return subscriptionDao.removeSubscription(subId);
+ }
+
+ /**
+ * Obtains the address component of the EPR.
+ *
+ * TODO: refactor in a utility class.
+ *
+ * @param epr
+ * endpoint reference
+ * @return address contained in the endpoint reference
+ */
+ private Object getAddress(final W3CEndpointReference epr) {
+ final DOMResult dom = new DOMResult();
+ epr.writeTo(dom);
+
+ try {
+ return XPathFactory.newInstance().newXPath().evaluate("//*[local-name() = 'Address']", dom.getNode());
+ } catch (final XPathExpressionException e) {
+ throw new IllegalStateException("cannot construct xpath expression", e);
+ }
+ }
+
+ /**
+ * extract resource type name.
+ *
+ * @param rest
+ * topic expression without prefix
+ * @return tuple containing type name and rest of the prefix
+ */
+ public TopicExpressionMatchResult matchType(final String rest) {
+ final Perl5Util matcher = new Perl5Util(); // NOPMD
+ if (!matcher.match("/^(\\*|[a-zA-Z_0-9]*)($|/)(.*)$/", rest))
+ return null;
+
+ return new TopicExpressionMatchResult(matcher.getMatch().group(1), matcher.getMatch().group(2 + 1));
+ }
+
+ /**
+ * extract resource id.
+ *
+ * @param rest
+ * topic expression without prefix
+ * @return tuple containing type name and rest of the prefix
+ */
+ public TopicExpressionMatchResult matchId(final String rest) {
+ final Perl5Util matcher = new Perl5Util(); // NOPMD
+ if (!matcher.match("/^([^/]*)(.*)/", rest))
+ return null;
+
+ return new TopicExpressionMatchResult(matcher.getMatch().group(1), matcher.getMatch().group(2));
+ }
+
+ /**
+ * return all subscriptions matching a given prefix and a given type. Wildcard subscriptions will match any resource type.
+ *
+ * @param prefix
+ * prefix
+ * @param type
+ * concrete type
+ * @param resId
+ * resource identifier
+ * @return all matching subscriptions
+ */
+ @Override
+ @Cacheable(value="subscriptions", key="{ #prefix, #type, #resId }")
+ public Collection listMatchingSubscriptions(final String prefix, final String type, final String resId) {
+
+ if(log.isDebugEnabled()) {
+ log.debug(String.format("uncached list subscriptions [prefix: '%s', type: '%s', resourceId: '%s']", prefix, type, resId));
+ }
+ final Set merged = new HashSet();
+ merged.addAll(subscriptionDao.listSubscriptions(prefix, type, resId));
+ merged.addAll(subscriptionDao.listSubscriptions(prefix, type, "*"));
+ merged.addAll(subscriptionDao.listSubscriptions(prefix, "*", "*"));
+ return merged;
+ }
+
+ @Override
+ @Cacheable(value="subscriptions")
+ public Collection listSubscriptions() {
+ log.info("uncached list subscriptions");
+
+ return Sets.newHashSet(subscriptionDao.listSubscriptions());
+ }
+
+ @Override
+ @CacheEvict(value = "subscriptions", allEntries = true)
+ public boolean removeSubscription(final String subscriptionId) {
+ return subscriptionDao.removeSubscription(subscriptionId);
+ }
+
+ @Override
+ protected Collection getAcceptedPrefixes() {
+ return Arrays.asList(new String[] { ResourceStateSubscription.PREFIX_CREATE, ResourceStateSubscription.PREFIX_DELETE,
+ ResourceStateSubscription.PREFIX_UPDATE });
+ }
+
+ public ResourceStateSubscriptionDAO getSubscriptionDao() {
+ return subscriptionDao;
+ }
+
+ @Required
+ public void setSubscriptionDao(final ResourceStateSubscriptionDAO subscriptionDao) {
+ this.subscriptionDao = subscriptionDao;
+ }
+
+ public SubscriptionRequestFilter getSubscriptionRequestFilter() {
+ return subscriptionRequestFilter;
+ }
+
+ public void setSubscriptionRequestFilter(final SubscriptionRequestFilter subscriptionRequestFilter) {
+ this.subscriptionRequestFilter = subscriptionRequestFilter;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/SubscriptionRequestFilter.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/SubscriptionRequestFilter.java
new file mode 100644
index 0000000..e42c44c
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/SubscriptionRequestFilter.java
@@ -0,0 +1,43 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Value;
+
+public class SubscriptionRequestFilter {
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(SubscriptionRequestFilter.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * resource wildcard
+ */
+ private static final String ANY_RESOURCE = "*";
+
+ @Value("${services.issn.subscription.filter.active}")
+ private boolean active = false;
+
+ public boolean accept(final ResourceStateSubscription rss) {
+
+ if (!isActive()) return true;
+
+ if (StringUtils.isBlank(rss.getXpath()) & StringUtils.equals(rss.getResourceId(), ANY_RESOURCE)) {
+ log.debug(String.format("rejected subscription request, resourceId: '%s', xpath: '%s', from: %s", rss.getResourceId(), rss.getXpath(),
+ rss.getSubscriber()));
+ return false; // we reject wide subscriptions
+ }
+
+ return true;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/EndpointReferenceType.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/EndpointReferenceType.java
new file mode 100644
index 0000000..b75fa22
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/EndpointReferenceType.java
@@ -0,0 +1,151 @@
+package eu.dnetlib.enabling.is.sn.resourcestate.hib;
+
+import static java.sql.Types.VARCHAR;
+
+import java.io.Serializable;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.ws.EndpointReference;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SessionImplementor;
+import org.hibernate.usertype.UserType;
+
+/**
+ * Serializes Endpoint reference types to database columns (strings).
+ *
+ * @author marko
+ *
+ */
+public class EndpointReferenceType implements UserType { // NOPMD
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#assemble(java.io.Serializable, java.lang.Object)
+ */
+ @Override
+ public Object assemble(final Serializable arg0, final Object owner) {
+ if (arg0 == null) return null;
+ return EndpointReference.readFrom(new StreamSource(new StringReader((String) arg0)));
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object)
+ */
+ @Override
+ public Object deepCopy(final Object arg0) {
+ if (arg0 == null) return null;
+
+ return arg0;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#disassemble(java.lang.Object)
+ */
+ @Override
+ public Serializable disassemble(final Object arg0) {
+ final StringWriter buffer = new StringWriter();
+ ((W3CEndpointReference) arg0).writeTo(new StreamResult(buffer));
+ return buffer.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#equals(java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public boolean equals(final Object arg0, final Object arg1) {
+ if (arg0 == arg1) // NOPMD
+ return true;
+ if ((arg0 == null) || (arg1 == null)) return false;
+ return arg0.equals(arg1);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#hashCode(java.lang.Object)
+ */
+ @Override
+ public int hashCode(final Object arg0) {
+ return disassemble(arg0).hashCode();
+ }
+
+ @Override
+ public boolean isMutable() {
+ return false;
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], org.hibernate.engine.spi.SessionImplementor,
+ * java.lang.Object)
+ */
+ @Override
+ public Object nullSafeGet(final ResultSet rset, final String[] names, final SessionImplementor si, final Object owner) throws SQLException {
+ return assemble(rset.getString(names[0]), owner);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int,
+ * org.hibernate.engine.spi.SessionImplementor)
+ */
+ @Override
+ public void nullSafeSet(final PreparedStatement statement, final Object epr, final int index, final SessionImplementor arg3) throws HibernateException,
+ SQLException {
+ if (epr != null) {
+ statement.setString(index, (String) disassemble(epr));
+ }
+
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#replace(java.lang.Object, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public Object replace(final Object arg0, final Object arg1, final Object arg2) {
+ // is not mutable
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#returnedClass()
+ */
+ @Override
+ @SuppressWarnings("rawtypes")
+ public Class returnedClass() {
+ return W3CEndpointReference.class;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.hibernate.usertype.UserType#sqlTypes()
+ */
+ @Override
+ public int[] sqlTypes() {
+ return new int[] { VARCHAR };
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImpl.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImpl.java
new file mode 100644
index 0000000..7d618ac
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImpl.java
@@ -0,0 +1,137 @@
+package eu.dnetlib.enabling.is.sn.resourcestate.hib;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscription;
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscriptionDAO;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.Example;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Hibernate storage for resource state subscriptions.
+ *
+ * @author marko
+ *
+ */
+public class HibernateResourceStateSubscriptionDAOImpl implements ResourceStateSubscriptionDAO {
+
+ private static final Log log = LogFactory.getLog(HibernateResourceStateSubscriptionDAOImpl.class);
+
+ private SessionFactory sessionFactory;
+
+ private Collection transformToSubscription(final List inputList) {
+ return inputList.stream()
+ .map(o -> (ResourceStateSubscription) o)
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscriptionDAO#listSubscriptions(java.lang.String, java.lang.String,
+ * java.lang.String)
+ */
+ @Override
+ @Transactional(readOnly = true)
+ public Collection listSubscriptions(final String prefix, final String resourceType, final String resourceId) {
+
+ final ResourceStateSubscription exampleEntity = new ResourceStateSubscription();
+ exampleEntity.setPrefix(prefix);
+ exampleEntity.setType(resourceType);
+ exampleEntity.setResourceId(resourceId);
+
+ return transformToSubscription(queryByCriteria(exampleEntity));
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#addSubscription(java.lang.Object)
+ */
+ @Override
+ @Transactional
+ public void addSubscription(final ResourceStateSubscription subscription) {
+
+ log.debug("evict cached subscriptions");
+
+ getSessionFactory().getCurrentSession().save(subscription);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#getSubscription(java.lang.String)
+ */
+ @Override
+ @Transactional(readOnly = true)
+ public ResourceStateSubscription getSubscription(final String subscriptionId) {
+ return (ResourceStateSubscription) getSessionFactory().getCurrentSession().get(ResourceStateSubscription.class, subscriptionId);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#listSubscriptions()
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ @Transactional(readOnly = true)
+ public Collection listSubscriptions() {
+ return getSessionFactory().getCurrentSession().createQuery("from subscriptions").list();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#listSubscriptions(java.lang.String)
+ */
+ @Override
+ @Transactional(readOnly = true)
+ public Collection listSubscriptions(final String prefix) {
+ final ResourceStateSubscription exampleEntity = new ResourceStateSubscription();
+ exampleEntity.setPrefix(prefix);
+
+ return transformToSubscription(queryByCriteria(exampleEntity));
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.SubscriptionDAO#removeSubscription(java.lang.String)
+ */
+ @Override
+ @Transactional
+ public boolean removeSubscription(final String subscriptionId) {
+ if (StringUtils.isBlank(subscriptionId)) return false;
+
+ final ResourceStateSubscription entity = getSubscription(subscriptionId);
+
+ if (entity == null) return false;
+
+ getSessionFactory().getCurrentSession().delete(entity);
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ private List queryByCriteria(final ResourceStateSubscription exampleEntity) {
+ Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(ResourceStateSubscription.class).add(Example.create(exampleEntity));
+ return criteria.list();
+ }
+
+ public SessionFactory getSessionFactory() {
+ return sessionFactory;
+ }
+
+ @Required
+ public void setSessionFactory(SessionFactory sessionFactory) {
+ this.sessionFactory = sessionFactory;
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/ISStoreServiceImpl.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/ISStoreServiceImpl.java
new file mode 100644
index 0000000..aeac473
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/ISStoreServiceImpl.java
@@ -0,0 +1,323 @@
+package eu.dnetlib.enabling.is.store;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import javax.annotation.Resource;
+import javax.jws.WebService;
+import javax.xml.ws.Endpoint;
+
+import com.google.common.collect.Iterators;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreException;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreService;
+import eu.dnetlib.enabling.tools.AbstractBaseService;
+import eu.dnetlib.soap.EndpointReferenceBuilder;
+import eu.dnetlib.xml.database.XMLDatabase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.quartz.Job;
+import org.quartz.JobExecutionException;
+import org.xmldb.api.base.XMLDBException;
+
+/**
+ * ISStore service implementation.
+ *
+ * @author marko
+ *
+ */
+@WebService(targetNamespace = "http://services.dnetlib.eu/")
+public class ISStoreServiceImpl extends AbstractBaseService implements ISStoreService { // NOPMD by marko on 11/24/08
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(ISStoreServiceImpl.class); // NOPMD by marko on 11/24/08 4:46 PM
+
+ /**
+ * xml database used by the ISStore.
+ */
+ private XMLDatabase xmlDatabase;
+
+ /**
+ * Service endpoint.
+ */
+ private Endpoint endpoint;
+
+ /**
+ * injected EPR builder.
+ */
+ @Resource(name = "jaxwsEndpointReferenceBuilder")
+ private EndpointReferenceBuilder eprBuilder;
+
+ /**
+ * initializer job
+ */
+ private Job contentInitializerJob;
+
+ @Override
+ public void start() {
+ super.start();
+
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(500);
+ contentInitializerJob.execute(null);
+ } catch (JobExecutionException e) {
+ log.fatal("failed to initialize xmldb", e);
+ } catch (InterruptedException e) {
+ log.fatal("failed to initialize xmldb", e);
+ }
+ }
+ }).start();
+
+ }
+
+ /**
+ * web service context (not really useful right now).
+ */
+ // @Resource
+ // private WebServiceContext context;
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#createFileColl(java.lang.String)
+ */
+ @Override
+ public boolean createFileColl(final String fileColl) throws ISStoreException {
+ try {
+ xmlDatabase.createCollection(fileColl);
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#deleteFileColl(java.lang.String)
+ */
+ @Override
+ public boolean deleteFileColl(final String fileColl) throws ISStoreException {
+ try {
+ xmlDatabase.removeCollection(fileColl);
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#deleteXML(java.lang.String, java.lang.String)
+ */
+ @Override
+ public boolean deleteXML(final String fileName, final String fileColl) throws ISStoreException {
+ try {
+ return xmlDatabase.remove(fileName, fileColl);
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#executeXUpdate(java.lang.String)
+ */
+ @Override
+ public boolean executeXUpdate(final String query) throws ISStoreException {
+ getXMLbyQuery(query);
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#getFileColls()
+ */
+ @Override
+ public List getFileColls() throws ISStoreException {
+ try {
+ return xmlDatabase.listChildCollections(xmlDatabase.getRootCollection());
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#getFileNames(java.lang.String)
+ */
+ @Override
+ public List getFileNames(final String fileColl) throws ISStoreException {
+ try {
+ return xmlDatabase.list(fileColl);
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#getXML(java.lang.String, java.lang.String)
+ */
+ @Override
+ public String getXML(final String fileName, final String fileColl) throws ISStoreException {
+ try {
+ return xmlDatabase.read(fileName, fileColl);
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#getXMLbyQuery(java.lang.String)
+ */
+ @Override
+ public String getXMLbyQuery(final String query) throws ISStoreException {
+ log.debug(query);
+
+ try {
+ final Iterator res = xmlDatabase.xquery(query);
+ if (res == null) return null;
+ if (!res.hasNext()) return null;
+ return res.next();
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#insertXML(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public boolean insertXML(final String fileName, final String fileColl, final String file) throws ISStoreException {
+ try {
+ xmlDatabase.create(fileName, fileColl, file);
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#quickSearchXML(java.lang.String)
+ */
+ @Override
+ public List quickSearchXML(final String query) throws ISStoreException {
+ log.debug(query);
+ try {
+ final Iterator res = xmlDatabase.xquery(query);
+ if (res == null) return new ArrayList<>();
+
+ final ArrayList ans = new ArrayList();
+ Iterators.addAll(ans, res);
+ return ans;
+ } catch (XMLDBException e) {
+ log.fatal("searching", e);
+ throw new ISStoreException(e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#reindex()
+ */
+ @Override
+ public boolean reindex() {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#sync()
+ */
+ @Override
+ public boolean sync() {
+ log.info("TEST: " + endpoint);
+
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#updateXML(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public boolean updateXML(final String fileName, final String fileColl, final String file) throws ISStoreException {
+ try {
+ xmlDatabase.update(fileName, fileColl, file);
+ } catch (XMLDBException e) {
+ throw new ISStoreException(e);
+ }
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.store.rmi.ISStoreService#backup()
+ */
+ @Override
+ public String backup() throws ISStoreException {
+ try {
+ return xmlDatabase.backup();
+ } catch (Exception e) {
+ throw new ISStoreException(e);
+ }
+ }
+
+ public XMLDatabase getXmlDatabase() {
+ return xmlDatabase;
+ }
+
+ public void setXmlDatabase(final XMLDatabase xmlDatabase) {
+ this.xmlDatabase = xmlDatabase;
+ }
+
+ @Override
+ public boolean isRunning() {
+ return true;
+ }
+
+ public Endpoint getEndpoint() {
+ return endpoint;
+ }
+
+ public void setEndpoint(final Endpoint endpoint) {
+ this.endpoint = endpoint;
+ }
+
+ protected EndpointReferenceBuilder getEprBuilder() {
+ return eprBuilder;
+ }
+
+ protected void setEprBuilder(final EndpointReferenceBuilder eprBuilder) {
+ this.eprBuilder = eprBuilder;
+ }
+
+ public Job getContentInitializerJob() {
+ return contentInitializerJob;
+ }
+
+ public void setContentInitializerJob(final Job contentInitializerJob) {
+ this.contentInitializerJob = contentInitializerJob;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/TestContentInitializerJob.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/TestContentInitializerJob.java
new file mode 100644
index 0000000..d121309
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/TestContentInitializerJob.java
@@ -0,0 +1,180 @@
+package eu.dnetlib.enabling.is.store;
+
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.core.io.Resource;
+import org.xml.sax.SAXException;
+
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
+import eu.dnetlib.enabling.tools.ResourceLoaderHelper;
+import eu.dnetlib.miscutils.coupling.StaticCondition;
+
+/**
+ * This job is scheduled at startup of a test environment to load some data into the store.
+ *
+ *
+ * You should configure this bean with paths to the profile and schema files you want to add. This can be done setting
+ * the 'resources' and 'schemas' properties using the syntax documented here
+ *
+ *
+ * @author marko
+ *
+ */
+public class TestContentInitializerJob extends AbstractContentInitializer implements Job {
+ /**
+ * milliseconds in a second.
+ */
+ private static final double MILLIS = 1000.0;
+
+ /**
+ * logger.
+ */
+ static final Log log = LogFactory.getLog(TestContentInitializerJob.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * hackish way of communicating to the integration tester that we have finished.
+ */
+ private static boolean initialized = false;
+
+ /**
+ * resourceLoader compatible pattern matching all files to load.
+ */
+ private String resources;
+
+ /**
+ * resourceLoader compatible pattern matching all xsd files to load.
+ */
+ private String schemas;
+
+ /**
+ * resource loader helper. we cannot implement the ResourceLoaderAware interface.
+ */
+ private ResourceLoaderHelper resourceLoader;
+
+ /**
+ * set to true in order to disable notification detection. Useful for bulk profile insertion.
+ */
+ private StaticCondition snDisable;
+
+ public TestContentInitializerJob() {
+ super();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
+ */
+ @Override
+ public void execute(final JobExecutionContext arg0) throws JobExecutionException {
+ initialize();
+ setInitialized(true);
+ }
+
+ public void initialize() throws JobExecutionException {
+ log.info("Initializing store with some profiles and collections for test and development ...");
+
+ if (!getBulkImporter().isEnabled()) {
+ log.info("skipping store initialization because the database already exists");
+ return;
+ }
+
+ log.info("loading resources: " + getResources());
+
+ try {
+ String type = "schema/profile"; // NOPMD
+ String name = "none"; // NOPMD
+ try {
+ final long start = System.currentTimeMillis();
+
+ type = "schema"; // NOPMD
+ for (Resource res : resourceLoader.getResourcePatternResolver().getResources(schemas)) {
+ name = res.getURL().toString(); // NOPMD
+ registerSchema(res.getURL());
+ }
+
+ try {
+ snDisable.setCondition(true);
+ type = "profile";
+ for (Resource res : resourceLoader.getResourcePatternResolver().getResources(resources)) {
+ name = res.getURL().toString(); // NOPMD
+ registerProfile(res.getURL());
+ }
+ } finally {
+ snDisable.setCondition(false);
+ }
+
+ log.info("bulk registration finished in: " + ((System.currentTimeMillis() - start) / MILLIS) + "s");
+ } catch (ISRegistryException e) {
+ log.fatal("cannot register " + type + ": " + name, e);
+ throw new JobExecutionException("registry exception", e);
+ } catch (IOException e) {
+ throw new JobExecutionException("io exception", e);
+ } catch (XPathExpressionException e) {
+ throw new JobExecutionException("xpath exception", e);
+ } catch (SAXException e) {
+ throw new JobExecutionException("sax exception", e);
+ } catch (ParserConfigurationException e) {
+ throw new JobExecutionException("parser exception", e);
+ }
+ } finally {
+ log.info("INITIALIZED");
+ setInitialized(true);
+ }
+ }
+
+ public static void setInitialized(final boolean initialized) {
+ TestContentInitializerJob.initialized = initialized;
+ }
+
+ public static boolean isInitialized() {
+ return initialized;
+ }
+
+ public void setResources(final String resources) {
+ this.resources = resources;
+ }
+
+ public String getResources() {
+ return resources;
+ }
+
+ @Required
+ public ResourceLoaderHelper getResourceLoader() {
+ return resourceLoader;
+ }
+
+ @Required
+ public void setResourceLoader(final ResourceLoaderHelper resourceLoader) {
+ this.resourceLoader = resourceLoader;
+ }
+
+ @Required
+ public void setSchemas(final String schemas) {
+ this.schemas = schemas;
+ }
+
+ public String getSchemas() {
+ return schemas;
+ }
+
+ public void setSnDisable(final StaticCondition snDisable) {
+ this.snDisable = snDisable;
+ }
+
+ public StaticCondition getSnDisable() {
+ return snDisable;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/xquery/dnet.xqm b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/xquery/dnet.xqm
new file mode 100644
index 0000000..0a654f1
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/is/store/xquery/dnet.xqm
@@ -0,0 +1,10 @@
+xquery version "1.0";
+
+module namespace dnet="http://namespace.dnetlib.eu/xquery/dnet";
+declare namespace xmldb="http://exist-db.org/xquery/xmldb";
+
+declare function dnet:deleteDocument($x as element()) {
+
+ xmldb:remove(replace($x/base-uri(),'/[^/]*$', ''), replace($x/base-uri(),'^.*/([^/]*)$', '$1'))
+
+};
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/CompatResourceIdentifierResolverImpl.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/CompatResourceIdentifierResolverImpl.java
new file mode 100644
index 0000000..7f90e5d
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/CompatResourceIdentifierResolverImpl.java
@@ -0,0 +1,46 @@
+package eu.dnetlib.enabling.tools;
+
+import com.sun.xml.messaging.saaj.util.Base64;
+
+/**
+ * resolve resource file and collection names from the resource identifier according to the DNet 1.0 policy, by encoding
+ * the collection path in the identifier itself (as base64).
+ *
+ * @author marko
+ *
+ */
+public class CompatResourceIdentifierResolverImpl implements ResourceIdentifierResolver, ResourceIdentifierComposer {
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.tools.ResourceIdentifierResolver#getCollectionName(java.lang.String)
+ */
+ @Override
+ public String getCollectionName(final String resId) {
+ final String[] components = resId.split("_");
+ if (components.length == 1)
+ return "DefaultCollection";
+ return Base64.base64Decode(components[1]);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.tools.ResourceIdentifierResolver#getFileName(java.lang.String)
+ */
+ @Override
+ public String getFileName(final String resId) {
+ return resId.split("_")[0];
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.tools.ResourceIdentifierComposer#createResourceId(java.lang.String, java.lang.String)
+ */
+ @Override
+ public String createResourceId(final String fileName, final String coll) {
+ return fileName + "_" + new String(Base64.encode(coll.getBytes()));
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/LogInterceptor.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/LogInterceptor.java
new file mode 100644
index 0000000..447be47
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/LogInterceptor.java
@@ -0,0 +1,27 @@
+package eu.dnetlib.enabling.tools;
+
+import org.aopalliance.intercept.MethodInvocation;
+import org.apache.commons.logging.Log;
+import org.springframework.aop.interceptor.CustomizableTraceInterceptor;
+
+/**
+ * This class intercepts calls to the OAICore to measure its execution time. It uses Spring AOP.
+ *
+ * @author alessia
+ */
+public class LogInterceptor extends CustomizableTraceInterceptor {
+
+ @Override
+ protected void writeToLog(final Log logger, final String message, final Throwable ex) {
+ if (ex != null) {
+ logger.error(message, ex);
+ } else {
+ logger.debug(message);
+ }
+ }
+
+ @Override
+ protected boolean isInterceptorEnabled(final MethodInvocation invocation, final Log logger) {
+ return true;
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/ResourceIdentifierComposer.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/ResourceIdentifierComposer.java
new file mode 100644
index 0000000..f752864
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/ResourceIdentifierComposer.java
@@ -0,0 +1,18 @@
+package eu.dnetlib.enabling.tools;
+
+/**
+ * Abstracts the creation of a resource identifier from xmldb file name and xmldb collection name.
+ *
+ * @author marko
+ *
+ */
+public interface ResourceIdentifierComposer {
+ /**
+ * Create a resId from a xmldb filename and collection name.
+ *
+ * @param fileName
+ * @param coll
+ * @return
+ */
+ String createResourceId(final String fileName, final String coll);
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/ResourceType.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/ResourceType.java
new file mode 100644
index 0000000..77ea7c9
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/ResourceType.java
@@ -0,0 +1,161 @@
+package eu.dnetlib.enabling.tools;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import eu.dnetlib.enabling.is.sn.rmi.ISSNService;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreException;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreService;
+
+/**
+ *
+ * TODO: document. TODO: Too low level, why the interfacing the Store and not the Registry ?
+ *
+ * @author michele
+ *
+ */
+public class ResourceType {
+
+ /**
+ * xmldb collection where resource types are stored.
+ */
+ public static final String RESOURCE_TYPES = "DRIVERResourceTypes";
+
+ /**
+ * resource type. (Including kind?)
+ */
+ private String resourceType; // NOPMD
+
+ /**
+ * resource schema. (Body?)
+ */
+ private String resourceSchema; // NOPMD
+ /**
+ * file where a copy of the schema is stored locally TODO: why ?
+ */
+ private File fileSchema;
+
+ /**
+ * instanciate an already registered resource type, fetching it from the store.
+ *
+ * @param resourceType
+ * resourceType name
+ * @param store
+ * store service where the type is stored
+ * @param basedir
+ * base dir where a local copy is held (why?)
+ * @throws ISStoreException
+ * happens
+ */
+ public ResourceType(final String resourceType, final ISStoreService store, final String basedir) throws ISStoreException {
+ this(resourceType, store.getXML(resourceType, RESOURCE_TYPES), basedir);
+ }
+
+ /**
+ * construct a resource type.
+ *
+ * @param resourceType
+ * resourceType name
+ * @param resourceSchema
+ * resourceSchema xsd body
+ * @param basedir
+ * base directory of some local copy (?)
+ * @throws ISStoreException
+ * happens
+ */
+ public ResourceType(final String resourceType, final String resourceSchema, final String basedir) throws ISStoreException {
+ this.resourceType = resourceType;
+ this.resourceSchema = resourceSchema;
+ if (basedir != null)
+ this.fileSchema = saveSchemaAsFile(basedir);
+ }
+
+ /**
+ * stores the schema on the xmldb.
+ *
+ * @param store
+ * store service
+ * @throws ISStoreException
+ * happens
+ */
+ public void store(final ISStoreService store) throws ISStoreException {
+ store.insertXML(resourceType, RESOURCE_TYPES, resourceSchema);
+ }
+
+ /**
+ * updates the in memory resource instance from the store.
+ *
+ * @param store store service
+ * @throws ISStoreException happens
+ */
+ public void update(final ISStoreService store) throws ISStoreException {
+ store.updateXML(resourceType, RESOURCE_TYPES, resourceSchema);
+ }
+
+ /**
+ * save the schema to a file.
+ *
+ * @param basedir
+ * base directory
+ * @return the newly created file
+ * @throws ISStoreException
+ * happens, even if the file cannot be created.
+ */
+ private File saveSchemaAsFile(final String basedir) throws ISStoreException {
+ fileSchema = new File(basedir + "/" + resourceType);
+ if (!fileSchema.exists()) {
+ try {
+ final BufferedWriter out = new BufferedWriter(new FileWriter(fileSchema));
+ out.write(resourceSchema);
+ out.close();
+ } catch (IOException e) {
+ throw new ISStoreException("Error saving file", e);
+ }
+ }
+ return fileSchema;
+ }
+
+ /**
+ * it says "delete and notify" but it only deletes the schema from the filesystem and from the store.
+ *
+ * TODO: document and possibly refactor.
+ *
+ * @param store
+ * store service
+ * @param issn
+ * ISSN service
+ * @throws ISStoreException
+ * happens
+ */
+ public void deleteAndNotify(final ISStoreService store, final ISSNService issn) throws ISStoreException {
+ fileSchema.delete();
+ store.deleteXML(resourceType, RESOURCE_TYPES);
+ }
+
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ public void setResourceType(final String resourceType) {
+ this.resourceType = resourceType;
+ }
+
+ public String getResourceSchema() {
+ return resourceSchema;
+ }
+
+ public void setResourceSchema(final String resourceSchema) {
+ this.resourceSchema = resourceSchema;
+ }
+
+ public File getFileSchema() {
+ return fileSchema;
+ }
+
+ public void setFileSchema(final File fileSchema) {
+ this.fileSchema = fileSchema;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/XQueryUtilsImpl.java b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/XQueryUtilsImpl.java
new file mode 100644
index 0000000..3394354
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/enabling/tools/XQueryUtilsImpl.java
@@ -0,0 +1,52 @@
+package eu.dnetlib.enabling.tools;
+
+
+/**
+ * Standard DNet-1.0 compat xquery utils.
+ *
+ * @author marko
+ *
+ */
+public class XQueryUtilsImpl implements XQueryUtils {
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.tools.XQueryUtils#getCollectionAbsPath(eu.dnetlib.enabling.tools.OpaqueResource)
+ */
+ @Override
+ public String getCollectionAbsPath(final OpaqueResource resource) {
+ return getRootCollection() + getCollectionPath(resource);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.tools.XQueryUtils#getCollectionPath(eu.dnetlib.enabling.tools.OpaqueResource)
+ */
+ @Override
+ public String getCollectionPath(final OpaqueResource resource) {
+ final StringBuilder buffer = new StringBuilder();
+ buffer.append(resource.getResourceKind());
+ buffer.append('/');
+ buffer.append(resource.getResourceType());
+ return buffer.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.tools.XQueryUtils#getRootCollection()
+ */
+ @Override
+ public String getRootCollection() {
+ return "/db/DRIVER/";
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.tools.XQueryUtils#getFileName(eu.dnetlib.enabling.tools.OpaqueResource)
+ */
+ @Override
+ public String getFileName(final OpaqueResource resource) {
+ return resource.getResourceId().split("_")[0];
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/AbstractTrigger.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/AbstractTrigger.java
new file mode 100644
index 0000000..dfc3be6
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/AbstractTrigger.java
@@ -0,0 +1,27 @@
+package eu.dnetlib.xml.database;
+
+/**
+ * most trigger will hold the trigger name in an instance variable.
+ *
+ * The Trigger contract requires a getter (getName()). This class implements the setter too.
+ *
+ * @author marko
+ *
+ */
+public abstract class AbstractTrigger implements Trigger {
+
+ /**
+ * trigger name.
+ */
+ private String name;
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/LoggingTrigger.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/LoggingTrigger.java
new file mode 100644
index 0000000..71cb20c
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/LoggingTrigger.java
@@ -0,0 +1,46 @@
+package eu.dnetlib.xml.database;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.w3c.dom.Document;
+
+/**
+ * This trigger simply logs all xmldb CRUDE events.
+ *
+ * @author marko
+ *
+ */
+public class LoggingTrigger extends AbstractTrigger {
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(LoggingTrigger.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.xml.database.Trigger#created(java.lang.String, java.lang.String, org.w3c.dom.Document)
+ */
+ @Override
+ public void created(final String file, final String collection, final Document newDoc) {
+ log.info("xml resource created: " + collection + "/" + file);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.xml.database.Trigger#deleted(java.lang.String, java.lang.String, org.w3c.dom.Document)
+ */
+ @Override
+ public void deleted(final String file, final String collection, final Document oldDoc) {
+ log.info("xml resource deleted: " + collection + "/" + file);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.xml.database.Trigger#updated(java.lang.String, java.lang.String, org.w3c.dom.Document, org.w3c.dom.Document)
+ */
+ @Override
+ public void updated(final String file, final String collection, final Document oldDoc, final Document newDoc) {
+ log.info("xml resource updated: " + collection + "/" + file);
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/Trigger.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/Trigger.java
new file mode 100644
index 0000000..66a5b68
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/Trigger.java
@@ -0,0 +1,56 @@
+package eu.dnetlib.xml.database;
+
+import org.w3c.dom.Document;
+
+/**
+ * xml db trigger.
+ *
+ * @author marko
+ *
+ */
+public interface Trigger {
+ /**
+ * each trigger has a user defined unique name.
+ *
+ * @return trigger name
+ */
+ String getName();
+
+ /**
+ * triggered when a new document is created.
+ *
+ * @param file
+ * file name
+ * @param collection
+ * collection name
+ * @param newDoc
+ * newly created document
+ */
+ void created(String file, String collection, Document newDoc);
+
+ /**
+ * triggered when a document is updated.
+ *
+ * @param file
+ * file name
+ * @param collection
+ * collection name
+ * @param oldDoc
+ * old version
+ * @param newDoc
+ * new version
+ */
+ void updated(String file, String collection, Document oldDoc, Document newDoc);
+
+ /**
+ * triggered when a document is deleted.
+ *
+ * @param file
+ * file name
+ * @param collection
+ * collection name
+ * @param oldDoc
+ * deleted document
+ */
+ void deleted(String file, String collection, Document oldDoc);
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/XMLDatabase.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/XMLDatabase.java
new file mode 100644
index 0000000..dfec79c
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/XMLDatabase.java
@@ -0,0 +1,175 @@
+package eu.dnetlib.xml.database;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.exist.util.DatabaseConfigurationException;
+import org.xmldb.api.base.XMLDBException;
+
+/**
+ * xmldb API is ugly.
+ *
+ * This is a thin wrapper to the xmldb API with focus on the primary operations used by dnet
+ *
+ * @author marko
+ *
+ */
+public interface XMLDatabase { // NOPMD
+ /**
+ * creates a new resource or updates the resource if it already exists.
+ *
+ * @param name
+ * file name
+ * @param collection
+ * collection name
+ * @param content
+ * serialized xml string
+ * @throws XMLDBException
+ * happens
+ */
+ void create(String name, String collection, String content) throws XMLDBException;
+
+ /**
+ * updates and already existing resource.
+ *
+ * @param name
+ * file name
+ * @param collection
+ * collection name
+ * @param content
+ * serialized xml string
+ * @throws XMLDBException
+ * fails if the resource doesn't exist
+ */
+ void update(String name, String collection, String content) throws XMLDBException;
+
+ /**
+ * removes a resource.
+ *
+ * @param name
+ * file name
+ * @param collection
+ * collection name
+ * @return false if the resource doesn't exist
+ * @throws XMLDBException
+ * could happen
+ */
+ boolean remove(String name, String collection) throws XMLDBException;
+
+ /**
+ * read a resource string xml.
+ *
+ * @param name
+ * file name
+ * @param collection
+ * collection name
+ * @return null if the resource doesn't exist, otherwise it returns the xml string serialization
+ * @throws XMLDBException
+ * happens
+ */
+ String read(String name, String collection) throws XMLDBException;
+
+ /**
+ * Execute an xquery.
+ *
+ * @param xquery
+ * xquery source
+ * @return a xmldb resultset object
+ * @throws XMLDBException
+ * happens
+ */
+ Iterator xquery(String xquery) throws XMLDBException;
+
+ /**
+ * creates a new collection, non recursively.
+ *
+ * @param collection
+ * collection name
+ * @throws XMLDBException
+ * happens
+ */
+ void createCollection(String collection) throws XMLDBException;
+
+
+ /**
+ * remove a collection.
+ *
+ * @param collection
+ * collection name
+ * @throws XMLDBException
+ * happens also when the collection doesn't eXist
+ */
+ void removeCollection(String collection) throws XMLDBException;
+
+ void xupdate(String query) throws XMLDBException;
+
+ /**
+ * check whether a collection exists.
+ *
+ * @param collection
+ * collection name
+ * @return true if the collection exists
+ * @throws XMLDBException
+ * happens
+ */
+ boolean collectionExists(String collection) throws XMLDBException;
+
+ /**
+ * lists child collections.
+ *
+ * @param collection
+ * parent collections
+ * @return list of collection names
+ * @throws XMLDBException
+ * happens
+ */
+ List listChildCollections(String collection) throws XMLDBException;
+
+ /**
+ * list the content of a collection.
+ *
+ * @param collection
+ * parent collection
+ * @return list of resource names
+ * @throws XMLDBException
+ * happens
+ */
+ List list(String collection) throws XMLDBException;
+
+ /**
+ * returns the name of the root collection.
+ *
+ * @return collection name
+ */
+ String getRootCollection();
+
+ /**
+ * register a new trigger on a collection.
+ *
+ * @param trigger
+ * trigger instance
+ * @param collection
+ * collection pattern
+ * @throws XMLDBException
+ * happens
+ */
+ void registerTrigger(Trigger trigger, String collection) throws XMLDBException;
+
+
+ /**
+ * make a backup of entire database.
+ *
+ * @throws XMLDBException could happen
+ * @throws DatabaseConfigurationException could happen
+ * @return the path in which the Backup has been saved
+ */
+ String backup() throws XMLDBException, DatabaseConfigurationException;
+
+ /**
+ * Return the dir that contains all backups.
+ *
+ * @return the path in which the Backup has been saved
+ */
+ String getBackupDir();
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/DelegatingDiffTrigger.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/DelegatingDiffTrigger.java
new file mode 100644
index 0000000..ed568fa
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/DelegatingDiffTrigger.java
@@ -0,0 +1,197 @@
+package eu.dnetlib.xml.database.exist;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import eu.dnetlib.miscutils.functional.xml.IndentXmlString;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.exist.collections.Collection;
+import org.exist.collections.triggers.SAXTrigger;
+import org.exist.collections.triggers.TriggerException;
+import org.exist.dom.persistent.DocumentImpl;
+import org.exist.storage.DBBroker;
+import org.exist.storage.txn.Txn;
+import org.exist.xmldb.XmldbURI;
+
+import eu.dnetlib.xml.database.Trigger;
+
+/**
+ * this trigger delegates diffs for CRUDE events to an non-exist dependent eu.dnetlib.xml.database.Trigger instance.
+ *
+ * Since eXist triggers are instantiated by eXist, we need to locate the Trigger instances which are registered to the database instance.
+ *
+ * @author marko
+ *
+ */
+public class DelegatingDiffTrigger extends SAXTrigger {
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(DelegatingDiffTrigger.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * trigger identifier, from configuration.
+ */
+ private String triggerName;
+
+ private Map existsTriggerEventMap = new HashMap<>();
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.exist.collections.triggers.FilteringTrigger#configure(org.exist.storage.DBBroker, org.exist.collections.Collection,
+ * java.util.Map)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void configure(final DBBroker dbBroker, final Collection parent, final Map> parameters) throws TriggerException {
+ super.configure(dbBroker, parent, parameters);
+
+ if (parameters == null) { return; }
+
+ final Map> params = parameters;
+ if (parameters.containsKey("triggerName")) {
+ final List> myTriggerName = parameters.get("triggerName");
+ if ((myTriggerName != null) && (myTriggerName.size() == 1)) {
+ setTriggerName(myTriggerName.get(0).toString());
+ }
+ }
+ if (getTriggerName() == null) {
+ log.fatal("trigger id not configured");
+ throw new TriggerException("trigger name not configured");
+ }
+ }
+
+ /**
+ * find the trigger instance associated with this delegation.
+ *
+ * @return trigger instance
+ */
+ protected Trigger getTrigger() {
+ final Trigger trigger = ExistTriggerRegistry.defaultInstance().getTrigger(getTriggerName());
+ if (trigger == null) {
+ log.fatal("no trigger " + triggerName + " but there is a registered callback for it");
+ return null;
+ }
+
+ return trigger;
+ }
+
+ public String getTriggerName() {
+ return triggerName;
+ }
+
+ public void setTriggerName(final String triggerId) {
+ triggerName = triggerId;
+ }
+
+ @Override
+ public void beforeCreateDocument(final DBBroker dbBroker, final Txn txn, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void afterCreateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ try {
+ final Trigger trigger = getTrigger();
+ final String collection = document.getCollection().getURI().toString();
+ final String fileName = document.getFileURI().toString();
+ if (trigger != null) {
+ trigger.created(fileName, collection, document);
+ }
+ } catch (final Exception e) {
+ throw new TriggerException(e);
+ }
+ }
+
+ @Override
+ public void beforeUpdateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ try {
+ final String collection = document.getCollection().getURI().toString();
+ final String fileName = document.getFileURI().toString();
+ final ExistsTriggerEvent event = new ExistsTriggerEvent();
+ event.setOldDocument(IndentXmlString.apply(document));
+ event.setEventType(EventType.UPDATE);
+ event.setCollection(collection);
+ event.setName(fileName);
+ existsTriggerEventMap.put(String.valueOf(txn.getId()), event);
+ } catch (final Exception e) {
+ throw new TriggerException(e);
+ }
+ }
+
+ @Override
+ public void afterUpdateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ try {
+ if (!existsTriggerEventMap.containsKey(
+ String.valueOf(txn.getId()))) { throw new TriggerException("Error on trigger missing previous operation beforeUpdateTrigger"); }
+ final ExistsTriggerEvent existsTriggerEvent = existsTriggerEventMap.remove(String.valueOf(txn.getId()));
+
+ existsTriggerEvent.setDocument(IndentXmlString.apply(document));
+ final Trigger trigger = getTrigger();
+ if (trigger != null) {
+ trigger.updated(existsTriggerEvent.getName(), existsTriggerEvent.getCollection(), existsTriggerEvent.getOldDocument(),
+ existsTriggerEvent.getDocument());
+ }
+ } catch (final Exception e) {
+ throw new TriggerException(e);
+ }
+ }
+
+ @Override
+ public void beforeUpdateDocumentMetadata(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ }
+
+ @Override
+ public void afterUpdateDocumentMetadata(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ }
+
+ @Override
+ public void beforeCopyDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void afterCopyDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void beforeMoveDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void afterMoveDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void beforeDeleteDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ try {
+ final Trigger trigger = getTrigger();
+ final String collection = document.getCollection().getURI().toString();
+ final String fileName = document.getFileURI().toString();
+ if (trigger != null) {
+ trigger.deleted(fileName, collection, IndentXmlString.apply(document));
+ }
+ } catch (final Exception e) {
+ throw new TriggerException(e);
+ }
+ }
+
+ @Override
+ public void afterDeleteDocument(final DBBroker dbBroker, final Txn txn, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/EventType.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/EventType.java
new file mode 100644
index 0000000..30718db
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/EventType.java
@@ -0,0 +1,10 @@
+package eu.dnetlib.xml.database.exist;
+
+/**
+ * Created by claudio on 20/12/2016.
+ */
+public enum EventType {
+ UPDATE,
+ CREATE,
+ DELETE
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistDOMConverter.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistDOMConverter.java
new file mode 100644
index 0000000..050894f
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistDOMConverter.java
@@ -0,0 +1,82 @@
+package eu.dnetlib.xml.database.exist;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Exist has an internal DOM implementation.
+ *
+ * @author marko
+ *
+ */
+@SuppressWarnings("deprecation")
+public class ExistDOMConverter {
+
+ /**
+ * convert a DOM document to InputSource on which you can run an XPath.
+ *
+ * The internal eXist DOM implementation has some problems.
+ *
+ * @param input
+ * DOM document
+ * @return sax input source
+ * @throws IOException
+ * happens ?
+ */
+ public InputSource asInputSource(final Document input) throws IOException {
+ return new InputSource(new StringReader(asString(input)));
+ }
+
+ /**
+ * serialize a dom document to a string.
+ *
+ * TODO: avoid using deprecated XMLSerializer
+ *
+ * cannot use Transformer because eXist DOM impl is incomplete.
+ *
+ * @param input
+ * DOM document
+ * @return sax input source
+ * @throws IOException
+ * happens ?
+ */
+
+ public String asString(final Document input) throws IOException {
+ final StringWriter writer = new StringWriter();
+
+ new XMLSerializer(writer, new OutputFormat()).serialize(input.getDocumentElement());
+
+ return writer.toString();
+ }
+
+ /**
+ * convert a DOM document to a w3c DOM Document on which you can run an XPath.
+ *
+ * The internal eXist DOM implementation has some problems.
+ *
+ * @param input
+ * input eXist DOM document
+ * @return good DOM document
+ * @throws IOException
+ * happens
+ * @throws ParserConfigurationException
+ * happens
+ * @throws SAXException
+ * happens
+ */
+ public Document asDocument(final Document input) throws IOException, ParserConfigurationException, SAXException {
+ final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ return builder.parse(asInputSource(input));
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistDatabase.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistDatabase.java
new file mode 100644
index 0000000..5307d87
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistDatabase.java
@@ -0,0 +1,635 @@
+package eu.dnetlib.xml.database.exist; // NOPMD
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.exist.collections.CollectionConfiguration;
+import org.exist.util.DatabaseConfigurationException;
+import org.exist.xmldb.DatabaseImpl;
+import org.exist.xmldb.DatabaseInstanceManager;
+import org.exist.xmldb.EXistResource;
+import org.exist.xmldb.XmldbURI;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.context.Lifecycle;
+import org.xmldb.api.DatabaseManager;
+import org.xmldb.api.base.*;
+import org.xmldb.api.base.Collection;
+import org.xmldb.api.modules.CollectionManagementService;
+import org.xmldb.api.modules.XPathQueryService;
+
+import eu.dnetlib.miscutils.datetime.DateUtils;
+import eu.dnetlib.xml.database.Trigger;
+
+import eu.dnetlib.xml.database.XMLDatabase;
+
+/**
+ * eXist database wrapper.
+ *
+ * @author marko
+ *
+ */
+public class ExistDatabase implements XMLDatabase, Lifecycle { // NOPMD by marko
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(ExistDatabase.class); // NOPMD
+
+ /**
+ * eXist collection configuration special file.
+ */
+ public static final String COLLECTION_XCONF = "collection.xconf";
+
+ /**
+ * exist xml resource type code.
+ */
+ private static final String XMLRESOURCE = "XMLResource";
+
+ /**
+ * collection name to trigger instance map.
+ *
+ * all triggers declared here will be registered at startup.
+ *
+ */
+ private Map triggerConf = new HashMap<>();
+
+ private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
+
+ private final Lock readLock = rwl.readLock();
+
+ private final Lock writeLock = rwl.writeLock();
+
+ /**
+ * eXist database.
+ */
+ private Database database;
+
+ /**
+ * eXist collection.
+ */
+ private Collection root;
+ /**
+ * eXist database manager.
+ */
+ private DatabaseInstanceManager manager;
+ /**
+ * eXist xpath service.
+ */
+ private XPathQueryService queryService;
+ /**
+ * eXist collection manager.
+ */
+ private CollectionManagementService colman;
+ /**
+ * eXist configuration file.
+ */
+ private String configFile;
+
+ /**
+ * Directory in which backups are saved.
+ */
+ private String backupDir;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.springframework.context.Lifecycle#start()
+ */
+ @Override
+ public void start() {
+ log.info("starting database");
+ try {
+ if (getDatabase() == null) {
+ setDatabase(new DatabaseImpl());
+ getDatabase().setProperty("configuration", getConfigFile());
+ getDatabase().setProperty("create-database", "true");
+ }
+
+ DatabaseManager.registerDatabase(getDatabase());
+
+ setRoot(DatabaseManager.getCollection("xmldb:exist://" + getRootCollection(), "admin", ""));
+ setManager((DatabaseInstanceManager) getRoot().getService("DatabaseInstanceManager", "1.0"));
+ setQueryService((XPathQueryService) getRoot().getService("XPathQueryService", "1.0"));
+ setColman((CollectionManagementService) getRoot().getService("CollectionManagementService", "1.0"));
+
+ for (final Entry entry : getTriggerConf().entrySet())
+ registerTrigger(entry.getValue(), entry.getKey());
+
+ } catch (final XMLDBException e) {
+ throw new IllegalStateException("cannot open eXist database", e);
+ }
+ }
+
+ /**
+ * helper method.
+ *
+ * @param collection
+ * collection name
+ * @return an eXist collection
+ * @throws XMLDBException
+ * happens
+ */
+ protected Collection getCollection(final String collection) throws XMLDBException {
+ readLock.lock();
+ try {
+ if (!collection.startsWith("/db"))
+ throw new XMLDBException(0, "collection path should begin with /db");
+ return database.getCollection("exist://" + collection, "admin", "");
+ }finally {
+ readLock.unlock();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#create(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void create(final String name, final String collection, final String content) throws XMLDBException {
+ writeLock.lock();
+ try {
+ if ("".equals(name))
+ throw new XMLDBException(0, "cannot create a xml file with an empty file name");
+
+ Collection col = getCollection(collection);
+
+ if (col == null) {
+ // create parent collections
+ createCollection(collection, true);
+ col = getCollection(collection);
+ }
+
+ final Resource res = col.createResource(name, XMLRESOURCE);
+ res.setContent(content);
+ col.storeResource(res);
+
+ ((EXistResource) res).freeResources();
+ col.close();
+ }finally {
+ writeLock.unlock();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#remove(java.lang.String, java.lang.String)
+ */
+ @Override
+ public boolean remove(final String name, final String collection) throws XMLDBException {
+ writeLock.lock();
+ try {
+ final Collection col = getCollection(collection);
+
+ final Resource res = col.getResource(name);
+ if (res == null)
+ return false;
+
+ col.removeResource(res);
+ col.close();
+ return true;
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#update(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public void update(final String name, final String collection, final String content) throws XMLDBException {
+ writeLock.lock();
+ try{
+ final Collection col = getCollection(collection);
+
+ final Resource res = col.getResource(name);
+ if (res == null) {
+ throw new XMLDBException(0, "resource doesn't exist");
+ }
+ res.setContent(content);
+ col.storeResource(res);
+ ((EXistResource) res).freeResources();
+ col.close();
+ } finally {
+ writeLock.unlock();
+ }
+
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#read(java.lang.String, java.lang.String)
+ */
+ @Override
+ public String read(final String name, final String collection) throws XMLDBException {
+ readLock.lock();
+ try {
+ Resource res = null;
+ final Collection coll = getCollection(collection);
+ try {
+ if (coll == null)
+ return null;
+ res = coll.getResource(name);
+ if (res != null)
+ return (String) res.getContent();
+ return null;
+ } finally {
+ if (res != null)
+ ((EXistResource) res).freeResources();
+ coll.close();
+ }
+ }finally {
+ readLock.unlock();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#xquery(java.lang.String)
+ */
+ @Override
+ public Iterator xquery(final String query) throws XMLDBException {
+ readLock.lock();
+ try {
+ final ResourceSet result = getQueryService().query(query);
+ if (result == null)
+ return null;
+ final ResourceIterator iterator = result.getIterator();
+ return new Iterator() {
+ @Override
+ public boolean hasNext() {
+ try {
+ return iterator.hasMoreResources();
+ } catch (XMLDBException e) {
+ throw new RuntimeException("Error while getting next element", e);
+ }
+ }
+
+ @Override
+ public String next() {
+ Resource res = null;
+ try {
+ res = iterator.nextResource();
+ return (String) res.getContent();
+ } catch (XMLDBException e) {
+ throw new RuntimeException("Error while getting next element", e);
+ } finally {
+ if (res != null)
+ try {
+ ((EXistResource) res).freeResources();
+ } catch (XMLDBException e) {
+ log.error("error on free resource");
+ }
+ }
+ }
+ };
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+
+ @Override
+ public void xupdate(final String query) throws XMLDBException {
+ writeLock.lock();
+ try{
+ getQueryService().query(query);
+ } finally {
+ writeLock.unlock();
+ }
+
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.springframework.context.Lifecycle#stop()
+ */
+ @Override
+ public void stop() {
+ // no operation
+ try {
+ getManager().shutdown();
+ DatabaseManager.deregisterDatabase(database);
+ } catch (final XMLDBException e) {
+ log.fatal("cannot close database", e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#collectionExists(java.lang.String)
+ */
+ @Override
+ public boolean collectionExists(final String collection) throws XMLDBException {
+ Collection col = null;
+ try{
+ col = getCollection(collection);
+ return col != null;
+ } finally {
+ if (col!=null)
+ col.close();
+ }
+
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#createCollection(java.lang.String)
+ */
+ @Override
+ public void createCollection(final String collection) throws XMLDBException {
+ writeLock.lock();
+ try {
+ createCollection(collection, false);
+ }finally {
+ writeLock.unlock();
+ }
+ }
+
+
+
+ private void createCollection(final String collection, final boolean recursive) throws XMLDBException {
+ if (recursive) {
+ final XmldbURI uri = XmldbURI.create(collection).removeLastSegment();
+ if (!collectionExists(uri.toString()))
+ createCollection(uri.toString(), true);
+ }
+ getColman().createCollection(collection);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#removeCollection(java.lang.String)
+ */
+ @Override
+ public void removeCollection(final String collection) throws XMLDBException {
+ writeLock.lock();
+ try {
+ getColman().removeCollection(collection);
+ }finally {
+ writeLock.unlock();
+ }
+ }
+
+ public String getConfigFile() {
+ return configFile;
+ }
+
+ public void setConfigFile(final String configFile) {
+ this.configFile = configFile;
+ }
+
+
+ @Override
+ public String getBackupDir() {
+ return backupDir;
+ }
+
+ @Required
+ public void setBackupDir(final String backupDir) {
+ this.backupDir = backupDir;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.springframework.context.Lifecycle#isRunning() useless contract with spring.
+ *
+ */
+ @Override
+ public boolean isRunning() {
+ return false;
+ }
+
+ protected Database getDatabase() {
+ return database;
+ }
+
+ protected void setDatabase(final Database database) {
+ this.database = database;
+ }
+
+ protected Collection getRoot() {
+ return root;
+ }
+
+ protected void setRoot(final Collection root) {
+ this.root = root;
+ }
+
+ protected DatabaseInstanceManager getManager() {
+ return manager;
+ }
+
+ protected void setManager(final DatabaseInstanceManager manager) {
+ this.manager = manager;
+ }
+
+ protected XPathQueryService getQueryService() {
+ return queryService;
+ }
+
+ protected void setQueryService(final XPathQueryService queryService) {
+ this.queryService = queryService;
+ }
+
+ protected CollectionManagementService getColman() {
+ return colman;
+ }
+
+ protected void setColman(final CollectionManagementService colman) {
+ this.colman = colman;
+ }
+
+ @Override
+ public String getRootCollection() {
+ return "/db";
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#listChildCollections(java.lang.String)
+ */
+ @Override
+ public List listChildCollections(final String collection) throws XMLDBException {
+ readLock.lock();
+ try {
+ final Collection col = getCollection(collection);
+ if (col == null)
+ return new ArrayList<>();
+ return Arrays.asList(col.listChildCollections());
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#list(java.lang.String)
+ */
+ @Override
+ public List list(final String collection) throws XMLDBException {
+ readLock.lock();
+ try {
+ final Collection col = getCollection(collection);
+ if(col == null)
+ return new ArrayList();
+ return Arrays.asList(col.listResources());
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ /**
+ * sets an underlying eXist trigger class for a given collection.
+ *
+ * @param triggerClass
+ * exist trigger class
+ * @param collection
+ * collection name
+ * @param events
+ * list of event names
+ * @param parameters
+ * parameter map
+ * @throws XMLDBException
+ * happens
+ */
+ void setExistTrigger(final Class> triggerClass, final String collection, final List events, final Map parameters)
+ throws XMLDBException {
+
+ // Arrays.asList(new String[] { "store", "update", "delete" }
+
+ final StringBuilder conf = new StringBuilder();
+ conf.append("");
+
+ final String className = triggerClass.getCanonicalName(); // PMD
+
+ conf.append("");
+ if (parameters != null)
+ for (final Entry entry : parameters.entrySet())
+ conf.append(" ");
+ conf.append(" ");
+
+ conf.append(" ");
+
+ log.info(conf.toString());
+ createCollection("/db/system/config" + collection, true);
+ create(CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE_URI.toString(), "/db/system/config" + collection, conf.toString());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#registerTrigger(eu.dnetlib.xml.database.Trigger, java.lang.String)
+ */
+ @Override
+ public void registerTrigger(final Trigger trigger, final String collection) throws XMLDBException {
+ final Map params = new HashMap();
+ params.put("triggerName", trigger.getName());
+
+ ExistTriggerRegistry.defaultInstance().registerTrigger(trigger.getName(), trigger);
+
+ setExistTrigger(DelegatingDiffTrigger.class, collection, Arrays.asList("store", "update", "delete" ), params);
+ }
+
+ public Map getTriggerConf() {
+ return triggerConf;
+ }
+
+ public void setTriggerConf(final Map triggerConf) {
+ this.triggerConf = triggerConf;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.XMLDatabase#backup()
+ */
+ @Override
+ public String backup() throws XMLDBException, DatabaseConfigurationException {
+ log.info("Starting backup...");
+ readLock.lock();
+ try {
+ verifyBackupDir();
+
+ String seq = (new SimpleDateFormat("yyyyMMdd-HHmm")).format(new Date());
+
+ ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(backupDir + "/data-" + seq + ".zip"));
+
+ FileWriter logFile = new FileWriter(backupDir + "/report-" + seq + ".log");
+ logFile.write("Backup started at: " + DateUtils.now_ISO8601() + "\n\n");
+
+ backup(getRoot().getName(), zip, logFile);
+
+ logFile.write("\nBackup finished at: " + DateUtils.now_ISO8601() + "\n");
+
+ logFile.flush();
+ logFile.close();
+
+ zip.flush();
+ zip.close();
+
+ log.info("Backup finished");
+ return backupDir;
+ } catch (final Exception e) {
+ log.error("Backup failed", e);
+ throw new XMLDBException(0, "cannot backup", e);
+ }
+ finally {
+ readLock.unlock();
+ }
+ }
+
+
+ private void verifyBackupDir() {
+ File d = new File(backupDir);
+ if (!d.exists()) d.mkdirs();
+ }
+
+ private void backup(String coll, ZipOutputStream zip, FileWriter logFile) throws XMLDBException, IOException {
+ readLock.lock();
+ logFile.write("COLLECTION: " + coll + "\n");
+ log.info("Backup of collection " + coll);
+ try {
+ for (String file : list(coll)) {
+ zip.putNextEntry(new ZipEntry(coll + "/" + file + ".xml"));
+ Resource resource = getCollection(coll).getResource(file);
+ zip.write(resource.getContent().toString().getBytes());
+ zip.closeEntry();
+ }
+
+ for (String c : listChildCollections(coll)) {
+ backup(coll + "/" + c, zip, logFile);
+ }
+ }finally {
+ readLock.unlock();
+ }
+
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistTriggerRegistry.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistTriggerRegistry.java
new file mode 100644
index 0000000..6414f58
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistTriggerRegistry.java
@@ -0,0 +1,72 @@
+package eu.dnetlib.xml.database.exist;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import eu.dnetlib.xml.database.Trigger;
+
+/**
+ * eXist triggers are instantiated directly by the exist database via reflection.
+ *
+ * we need a way to manage trigger objects from outside, in order to manage them manage them from the IoC container.
+ *
+ * @author marko
+ *
+ */
+public final class ExistTriggerRegistry {
+
+ /**
+ * singleton object.
+ */
+ private static ExistTriggerRegistry singleton = new ExistTriggerRegistry();
+
+ /**
+ * get the singleton instance.
+ *
+ * @return singleton object
+ */
+ public static ExistTriggerRegistry defaultInstance() {
+ return singleton;
+ }
+
+ /**
+ * forbids instantiation.
+ */
+ private ExistTriggerRegistry() {
+ }
+
+ /**
+ * maps trigger names to trigger instances.
+ */
+ private Map triggerRegistry = new HashMap();
+
+ /**
+ * get a trigger for a given id.
+ *
+ * @param triggerId trigger identifier
+ * @return trigger instance
+ */
+ public Trigger getTrigger(final String triggerId) {
+ return getTriggerRegistry().get(triggerId);
+ }
+
+ /**
+ * associate a new trigger.
+ *
+ * @param name trigger name
+ * @param trigger trigger instance
+ */
+ public void registerTrigger(final String name, final Trigger trigger) {
+ triggerRegistry.put(name, trigger);
+ }
+
+ Map getTriggerRegistry() {
+ return triggerRegistry;
+ }
+
+ void setTriggerRegistry(final Map triggerRegistry) {
+ this.triggerRegistry = triggerRegistry;
+ }
+
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistsTriggerEvent.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistsTriggerEvent.java
new file mode 100644
index 0000000..096c4b1
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/ExistsTriggerEvent.java
@@ -0,0 +1,60 @@
+package eu.dnetlib.xml.database.exist;
+
+import org.w3c.dom.Document;
+
+/**
+ * Created by sandro on 3/14/16.
+ */
+public class ExistsTriggerEvent {
+
+ private String collection;
+
+ private String name;
+
+ private EventType eventType;
+
+ private Document document;
+
+ private Document oldDocument;
+
+
+ public String getCollection() {
+ return collection;
+ }
+
+ public void setCollection(final String collection) {
+ this.collection = collection;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public EventType getEventType() {
+ return eventType;
+ }
+
+ public void setEventType(final EventType eventType) {
+ this.eventType = eventType;
+ }
+
+ public Document getDocument() {
+ return document;
+ }
+
+ public void setDocument(final Document document) {
+ this.document = document;
+ }
+
+ public Document getOldDocument() {
+ return oldDocument;
+ }
+
+ public void setOldDocument(final Document oldDocument) {
+ this.oldDocument = oldDocument;
+ }
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/PersistentExistDatabase.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/PersistentExistDatabase.java
new file mode 100644
index 0000000..af18d82
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/PersistentExistDatabase.java
@@ -0,0 +1,207 @@
+package eu.dnetlib.xml.database.exist;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import eu.dnetlib.enabling.is.store.BulkResourceImporter;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Required;
+
+/**
+ * Persistent exist.
+ *
+ * TODO: this is copy&paste from TemporaryExistDatase. Refactor common stuff.
+ *
+ * @author marko
+ *
+ */
+public class PersistentExistDatabase extends ExistDatabase {
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(PersistentExistDatabase.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * db directory.
+ */
+ private transient File dbDirectory;
+
+ /**
+ * this config file will be copied to a newly created temporary directory.
+ */
+ private String configTemplate = "default-exist-conf.xml";
+
+ /**
+ * db root path.
+ */
+ private String dbRootPath;
+
+ /**
+ * bulk importer.
+ */
+ @Autowired
+ private BulkResourceImporter bulkImporter;
+
+ /**
+ * exist config file.
+ */
+ private File existConfigFile;
+
+ /**
+ * true if the database permits execution of java code from xquery.
+ */
+ private boolean XQueryJavaEnabled;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.exist.ExistDatabase#start()
+ */
+ @Override
+ public void start() {
+ log.warn("STARTING PERSISTENT EXIST DATABASE");
+ dbDirectory = new File(dbRootPath);
+
+ if (dbDirectory.exists()) {
+ getBulkImporter().setEnabled(false);
+ existConfigFile = new File(dbDirectory, "conf.xml");
+ enableJava(existConfigFile, isXQueryJavaEnabled());
+ setConfigFile(existConfigFile.getAbsolutePath());
+ } else {
+ createPersistentDatabase();
+ }
+
+ super.start();
+ }
+
+ @Override
+ public void stop() {
+ log.info("shutting down xmldb");
+ super.stop();
+ log.info("xmldb closed");
+ }
+
+ protected void enableJava(final File conf, final boolean enabled) {
+ final StringWriter buffer = new StringWriter();
+ if (conf.exists()) {
+ try {
+ IOUtils.copy(new FileReader(conf), buffer);
+ final String newConf = patchConfigFileEnableJava(buffer.toString(), enabled);
+ if (!newConf.equals(buffer.toString())) {
+ FileWriter writer = new FileWriter(conf);
+ try {
+ IOUtils.copy(new StringReader(newConf), writer);
+ } finally {
+ writer.close();
+ }
+ }
+ } catch (final FileNotFoundException e) {
+ log.warn("cannot patch eXist conf file", e);
+ } catch (final IOException e) {
+ log.warn("cannot patch eXist conf file", e);
+ }
+ }
+ }
+
+ /**
+ * @param conf
+ * content of the configuration file
+ * @param enabled
+ * enabled or disabled
+ * @return new conf file
+ */
+ protected String patchConfigFileEnableJava(final String conf, final boolean enabled) {
+ return conf.replaceAll("enable-java-binding=\"[^\"]*\"", "enable-java-binding=\"" + (enabled ? "yes" : "no") + "\"");
+ }
+
+ /**
+ * create a temporary directory and copy the default configuration file.
+ */
+ protected void createPersistentDatabase() {
+ log.debug("creating persistent database");
+ try {
+ new File(dbDirectory, "data").mkdirs();
+
+ final InputStream defaultConf = getClass().getResourceAsStream(getConfigTemplate());
+ if (defaultConf == null)
+ throw new IOException("cannot find " + getConfigTemplate());
+
+ existConfigFile = new File(dbDirectory, "conf.xml");
+ final FileOutputStream confOutput = new FileOutputStream(existConfigFile);
+
+ try {
+ IOUtils.copy(defaultConf, confOutput);
+ } finally {
+ confOutput.close();
+ }
+ enableJava(existConfigFile, isXQueryJavaEnabled());
+
+ setConfigFile(existConfigFile.getAbsolutePath());
+ } catch (final IOException e) {
+ log.fatal("creating database dir", e);
+ throw new IllegalStateException(e);
+ }
+ log.debug("created temp database");
+ }
+
+ public File getDbDirectory() {
+ return dbDirectory;
+ }
+
+ public void setDbDirectory(final File dbDirectory) {
+ this.dbDirectory = dbDirectory;
+ }
+
+ public String getConfigTemplate() {
+ return configTemplate;
+ }
+
+ public void setConfigTemplate(final String configTemplate) {
+ this.configTemplate = configTemplate;
+ }
+
+ public BulkResourceImporter getBulkImporter() {
+ return bulkImporter;
+ }
+
+ public void setBulkImporter(final BulkResourceImporter bulkImporter) {
+ this.bulkImporter = bulkImporter;
+ }
+
+ public File getExistConfigFile() {
+ return existConfigFile;
+ }
+
+ public void setExistConfigFile(final File existConfigFile) {
+ this.existConfigFile = existConfigFile;
+ }
+
+ @Required
+ public String getDbRootPath() {
+ return dbRootPath;
+ }
+
+ public void setDbRootPath(final String dbRootPath) {
+ this.dbRootPath = dbRootPath;
+ }
+
+ public boolean isXQueryJavaEnabled() {
+ return XQueryJavaEnabled;
+ }
+
+ public void setXQueryJavaEnabled(final boolean xQueryJavaEnabled) {
+ XQueryJavaEnabled = xQueryJavaEnabled;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/TemporaryExistDatabase.java b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/TemporaryExistDatabase.java
new file mode 100644
index 0000000..c6c5a98
--- /dev/null
+++ b/dnet-information-service/src/main/java/eu/dnetlib/xml/database/exist/TemporaryExistDatabase.java
@@ -0,0 +1,106 @@
+package eu.dnetlib.xml.database.exist;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * This class creates a temporary exist database instances.
+ *
+ * @author marko
+ *
+ */
+public class TemporaryExistDatabase extends ExistDatabase {
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(TemporaryExistDatabase.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * temporary directory. this way we won't delete other things on shutdown if somebody changes the configuration file
+ * location with setConfigFile().
+ */
+ private transient File tempDirectory;
+
+ /**
+ * this config file will be copied to a newly created temporary directory.
+ */
+ private String configTemplate = "default-exist-conf.xml";
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.exist.ExistDatabase#start()
+ */
+ @Override
+ public void start() {
+ log.warn("STARTING TEMPORARY EXIST DATABASE");
+ createTemporaryDatabase();
+ super.start();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.xml.database.exist.ExistDatabase#stop()
+ */
+ @Override
+ public void stop() {
+ super.stop();
+ try {
+ FileUtils.deleteDirectory(tempDirectory);
+ } catch (IOException e) {
+ log.fatal("cannot delete temporary exist directory", e);
+ }
+ }
+
+ /**
+ * create a temporary directory and copy the default configuration file.
+ */
+ protected void createTemporaryDatabase() {
+ log.debug("creating temp database");
+ try {
+ File tmpName;
+ tmpName = File.createTempFile("exist", "");
+
+ tmpName.delete();
+
+ tempDirectory = new File(tmpName.getAbsolutePath());
+ new File(tempDirectory, "data").mkdirs();
+
+ final InputStream defaultConf = getClass().getResourceAsStream(getConfigTemplate());
+ if (defaultConf == null)
+ throw new IOException("cannot find " + getConfigTemplate());
+
+ final File existConfigFile = new File(tempDirectory, "conf.xml");
+ final FileOutputStream confOutput = new FileOutputStream(existConfigFile);
+
+ try {
+ IOUtils.copy(defaultConf, confOutput);
+ } finally {
+ confOutput.close();
+ }
+
+ setConfigFile(existConfigFile.getAbsolutePath());
+ } catch (IOException e) {
+ log.fatal("creating database dir", e);
+ throw new IllegalStateException(e);
+ }
+ log.debug("created temp database");
+ }
+
+ protected String getConfigTemplate() {
+ return configTemplate;
+ }
+
+ protected void setConfigTemplate(final String configTemplate) {
+ this.configTemplate = configTemplate;
+ }
+
+}
diff --git a/dnet-information-service/src/main/java/org/hibernate/dialect/SQLiteDialect.java b/dnet-information-service/src/main/java/org/hibernate/dialect/SQLiteDialect.java
new file mode 100644
index 0000000..3c9d72d
--- /dev/null
+++ b/dnet-information-service/src/main/java/org/hibernate/dialect/SQLiteDialect.java
@@ -0,0 +1,264 @@
+package org.hibernate.dialect;
+
+import java.sql.SQLException;
+import java.sql.Types;
+
+import org.hibernate.dialect.function.*;
+import org.hibernate.exception.*;
+import org.hibernate.exception.spi.SQLExceptionConverter;
+import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtracter;
+import org.hibernate.exception.spi.ViolatedConstraintNameExtracter;
+import org.hibernate.internal.util.JdbcExceptionHelper;
+import org.hibernate.type.StandardBasicTypes;
+
+public class SQLiteDialect extends Dialect {
+
+ public SQLiteDialect() {
+ registerColumnType(Types.BIT, "boolean");
+ registerColumnType(Types.TINYINT, "tinyint");
+ registerColumnType(Types.SMALLINT, "smallint");
+ registerColumnType(Types.INTEGER, "integer");
+ registerColumnType(Types.BIGINT, "bigint");
+ registerColumnType(Types.FLOAT, "float");
+ registerColumnType(Types.REAL, "real");
+ registerColumnType(Types.DOUBLE, "double");
+ registerColumnType(Types.NUMERIC, "numeric($p, $s)");
+ registerColumnType(Types.DECIMAL, "decimal");
+ registerColumnType(Types.CHAR, "char");
+ registerColumnType(Types.VARCHAR, "varchar($l)");
+ registerColumnType(Types.LONGVARCHAR, "longvarchar");
+ registerColumnType(Types.DATE, "date");
+ registerColumnType(Types.TIME, "time");
+ registerColumnType(Types.TIMESTAMP, "datetime");
+ registerColumnType(Types.BINARY, "blob");
+ registerColumnType(Types.VARBINARY, "blob");
+ registerColumnType(Types.LONGVARBINARY, "blob");
+ registerColumnType(Types.BLOB, "blob");
+ registerColumnType(Types.CLOB, "clob");
+ registerColumnType(Types.BOOLEAN, "boolean");
+
+ registerFunction("concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "", "||", ""));
+ registerFunction("mod", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "?1 % ?2"));
+ registerFunction("quote", new StandardSQLFunction("quote", StandardBasicTypes.STRING));
+ registerFunction("random", new NoArgSQLFunction("random", StandardBasicTypes.INTEGER));
+ registerFunction("round", new StandardSQLFunction("round"));
+ registerFunction("substr", new StandardSQLFunction("substr", StandardBasicTypes.STRING));
+ registerFunction("trim", new AbstractAnsiTrimEmulationFunction() {
+
+ @Override
+ protected SQLFunction resolveBothSpaceTrimFunction() {
+ return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?1)");
+ }
+
+ @Override
+ protected SQLFunction resolveBothSpaceTrimFromFunction() {
+ return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?2)");
+ }
+
+ @Override
+ protected SQLFunction resolveLeadingSpaceTrimFunction() {
+ return new SQLFunctionTemplate(StandardBasicTypes.STRING, "ltrim(?1)");
+ }
+
+ @Override
+ protected SQLFunction resolveTrailingSpaceTrimFunction() {
+ return new SQLFunctionTemplate(StandardBasicTypes.STRING, "rtrim(?1)");
+ }
+
+ @Override
+ protected SQLFunction resolveBothTrimFunction() {
+ return new SQLFunctionTemplate(StandardBasicTypes.STRING, "trim(?1, ?2)");
+ }
+
+ @Override
+ protected SQLFunction resolveLeadingTrimFunction() {
+ return new SQLFunctionTemplate(StandardBasicTypes.STRING, "ltrim(?1, ?2)");
+ }
+
+ @Override
+ protected SQLFunction resolveTrailingTrimFunction() {
+ return new SQLFunctionTemplate(StandardBasicTypes.STRING, "rtrim(?1, ?2)");
+ }
+ });
+ }
+
+ @Override
+ public boolean supportsIdentityColumns() {
+ return true;
+ }
+
+ /*
+ * public boolean supportsInsertSelectIdentity() { return true; // As specified in NHibernate dialect }
+ */
+
+ @Override
+ public boolean hasDataTypeInIdentityColumn() {
+ return false; // As specified in NHibernate dialect
+ }
+
+ /*
+ * public String appendIdentitySelectToInsert(String insertString) { return new StringBuffer(insertString.length()+30). // As specified
+ * in NHibernate dialect append(insertString). append("; ").append(getIdentitySelectString()). toString(); }
+ */
+
+ @Override
+ public String getIdentityColumnString() {
+ // return "integer primary key autoincrement";
+ return "integer";
+ }
+
+ @Override
+ public String getIdentitySelectString() {
+ return "select last_insert_rowid()";
+ }
+
+ @Override
+ public boolean supportsLimit() {
+ return true;
+ }
+
+ @Override
+ public boolean bindLimitParametersInReverseOrder() {
+ return true;
+ }
+
+ @Override
+ protected String getLimitString(final String query, final boolean hasOffset) {
+ return query + (hasOffset ? " limit ? offset ?" : " limit ?");
+ }
+
+ @Override
+ public boolean supportsTemporaryTables() {
+ return true;
+ }
+
+ @Override
+ public String getCreateTemporaryTableString() {
+ return "create temporary table if not exists";
+ }
+
+ @Override
+ public Boolean performTemporaryTableDDLInIsolation() {
+ return Boolean.FALSE;
+ }
+
+ /*
+ * @Override public boolean dropTemporaryTableAfterUse() { return true; // temporary tables are only dropped when the connection is
+ * closed. If the connection is pooled... }
+ */
+
+ @Override
+ public boolean supportsCurrentTimestampSelection() {
+ return true;
+ }
+
+ @Override
+ public boolean isCurrentTimestampSelectStringCallable() {
+ return false;
+ }
+
+ @Override
+ public String getCurrentTimestampSelectString() {
+ return "select current_timestamp";
+ }
+
+ private static final int SQLITE_BUSY = 5;
+ private static final int SQLITE_LOCKED = 6;
+ private static final int SQLITE_IOERR = 10;
+ private static final int SQLITE_CORRUPT = 11;
+ private static final int SQLITE_NOTFOUND = 12;
+ private static final int SQLITE_FULL = 13;
+ private static final int SQLITE_CANTOPEN = 14;
+ private static final int SQLITE_PROTOCOL = 15;
+ private static final int SQLITE_TOOBIG = 18;
+ private static final int SQLITE_CONSTRAINT = 19;
+ private static final int SQLITE_MISMATCH = 20;
+ private static final int SQLITE_NOTADB = 26;
+
+ @Override
+ public SQLExceptionConverter buildSQLExceptionConverter() {
+ return (SQLExceptionConverter) (sqlException, message, sql) -> {
+ final int errorCode = JdbcExceptionHelper.extractErrorCode(sqlException);
+ if (errorCode == SQLITE_CONSTRAINT) {
+ final String constraintName = EXTRACTER.extractConstraintName(sqlException);
+ return new ConstraintViolationException(message, sqlException, sql, constraintName);
+ } else if ((errorCode == SQLITE_TOOBIG) || (errorCode == SQLITE_MISMATCH)) return new DataException(message, sqlException, sql);
+ else if ((errorCode == SQLITE_BUSY) || (errorCode == SQLITE_LOCKED)) return new LockAcquisitionException(message, sqlException, sql);
+ else if (((errorCode >= SQLITE_IOERR) && (errorCode <= SQLITE_PROTOCOL)) || (errorCode == SQLITE_NOTADB))
+ return new JDBCConnectionException(message, sqlException, sql);
+ return new GenericJDBCException(message, sqlException, sql);
+ };
+ }
+
+ public static final ViolatedConstraintNameExtracter EXTRACTER = new TemplatedViolatedConstraintNameExtracter() {
+
+ @Override
+ public String extractConstraintName(final SQLException sqle) {
+ return extractUsingTemplate("constraint ", " failed", sqle.getMessage());
+ }
+ };
+
+ @Override
+ public boolean supportsUnionAll() {
+ return true;
+ }
+
+ @Override
+ public boolean hasAlterTable() {
+ return false; // As specified in NHibernate dialect
+ }
+
+ @Override
+ public boolean dropConstraints() {
+ return false;
+ }
+
+ @Override
+ public String getAddColumnString() {
+ return "add column";
+ }
+
+ @Override
+ public String getForUpdateString() {
+ return "";
+ }
+
+ @Override
+ public boolean supportsOuterJoinForUpdate() {
+ return false;
+ }
+
+ @Override
+ public String getDropForeignKeyString() {
+ throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");
+ }
+
+ @Override
+ public String getAddForeignKeyConstraintString(final String constraintName,
+ final String[] foreignKey,
+ final String referencedTable,
+ final String[] primaryKey,
+ final boolean referencesPrimaryKey) {
+ throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");
+ }
+
+ @Override
+ public String getAddPrimaryKeyConstraintString(final String constraintName) {
+ throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");
+ }
+
+ @Override
+ public boolean supportsIfExistsBeforeTableName() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsTupleDistinctCounts() {
+ return false;
+ }
+
+ @Override
+ public String getSelectGUIDString() {
+ return "select hex(randomblob(16))";
+ }
+}
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/applicationContext-services.xml b/dnet-information-service/src/main/resources/eu/dnetlib/applicationContext-services.xml
new file mode 100644
index 0000000..a43cd89
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/applicationContext-services.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/lookup/applicationContext-islookup.xml b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/lookup/applicationContext-islookup.xml
new file mode 100644
index 0000000..d886239
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/lookup/applicationContext-islookup.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/DRIVERInformationSpaceApplicationProfile.xml b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/DRIVERInformationSpaceApplicationProfile.xml
new file mode 100644
index 0000000..4d616c1
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/DRIVERInformationSpaceApplicationProfile.xml
@@ -0,0 +1,245 @@
+
+
+
+
+
+
+ DRIVER Information Space Application
+
+
+
+
+
+ PendingRepositoryResources
+ RepositoryServiceResources
+
+ RepositoryServiceResourceType
+
+
+
+ PendingServiceResources
+ ServiceResources
+
+ IS_StoreServiceResourceType
+ IS_SNServiceResourceType
+ IS_LookUpServiceResourceType
+ IS_UIServiceResourceType
+ IS_RegistryServiceResourceType
+ MS_RMServiceResourceType
+ MS_ROServiceResourceType
+ HostingNodeManagerServiceResourceType
+ HostingContextManagerServiceResourceType
+ MDStoreServiceResourceType
+ DepotServiceResourceType
+ DataAccessServiceResourceType
+ AggregatorServiceResourceType
+ HarvestingServiceResourceType
+ HarvestingManagerServiceResourceType
+ TransformationServiceResourceType
+ TransformationManagerServiceResourceType
+ TransformationRuleEditorServiceResourceType
+ FeatureExtractionServiceResourceType
+ IndexServiceResourceType
+ BrowseServiceResourceType
+ DownloadServiceResourceType
+ CS_EngineServiceResourceType
+ CS_UIServiceResourceType
+ ResultSetServiceResourceType
+ OAIServiceResourceType
+ A2ServiceResourceType
+ ObjectPackagingServiceResourceType
+ DLMServiceResourceType
+ TextEngineServiceResourceType
+ PublisherServiceResourceType
+ DriverTesterServiceResourceType
+ SearchServiceResourceType
+ CollectionServiceResourceType
+ CommunityServiceResourceType
+ ForumServiceResourceType
+ RatingServiceResourceType
+ RecommendationServiceResourceType
+ UserProfileServiceResourceType
+ ValidatorServiceResourceType
+ ValidatorUserInterfaceServiceResourceType
+ WebInterfaceServiceResourceType
+ CitationServiceResourceType
+ SimilarityServiceResourceType
+ DLMSConnectionServiceResourceType
+
+ TagSessionManagerServiceResourceType
+ TagStoreServiceResourceType
+ PIDBridgeServiceResourceType
+ PIDAssignerServiceResourceType
+ CleanerServiceResourceType
+
+
+
+ PendingDSResources
+ DRIVERHostingNodeDSResources
+
+ DRIVERHostingNodeDSResourceType
+
+
+
+ PendingDSResources
+ UserDSResources
+
+ UserDSResourceType
+
+
+
+
+ CommunityDSResources
+
+ CommunityDSResourceType
+
+
+
+
+ DriverTestDSResources
+
+ DriverTestDSResourceType
+
+
+
+ PendingDSResources
+ DriverPendingTestDSResources
+
+ DriverPendingTestDSResourceType
+
+
+
+
+ CollectionDSResources
+
+ CollectionDSResourceType
+
+
+
+
+ HarvestingInstanceDSResources
+
+ HarvestingInstanceDSResourceType
+
+
+
+
+ HarvestingDSResources
+
+ HarvestingDSResourceType
+
+
+
+
+ IndexDSResources
+
+ IndexDSResourceType
+
+
+
+
+ MDStoreDSResources
+
+ MDStoreDSResourceType
+
+
+
+
+ StoreDSResources
+
+ StoreDSResourceType
+
+
+
+
+ ResultSetDSResources
+
+ ResultSetDSResourceType
+
+
+
+
+ RecommendationDSResources
+
+ RecommendationResourceType
+
+
+
+
+ TransformationDSResources
+
+ TransformationDSResourceType
+
+
+
+
+ VocabularyDSResources
+
+ VocabularyDSResourceType
+
+
+
+
+ SystemManagementDSResources
+
+ SystemManagementDSResourceType
+
+
+
+
+
+ dr:CobjContentSynthesis
+ dr:CobjTypology
+ dr:CobjIdentifier
+ dr:CobjModel
+ dr:CobjMDFormats
+ dr:CobjDescriptionSynthesis
+ dr:repositoryName
+ dr:repositoryLink
+ dr:repositoryCountry
+ dr:repositoryInstitution
+ dc:creator
+ dc:title
+ dc:subject
+ dr:CobjCategory
+ dc:language
+ dc:dateAccepted
+ dc:identifier
+ dc:publisher
+ dc:source
+ dc:contributor
+ dc:relation
+ dc:description
+
+
+ dr:repositoryCountry
+
+
+ *
+
+
+ dr:repositoryName
+ dr:repositoryLink
+ dr:repositoryCountry
+ dr:repositoryInstitution
+
+
+ ENGLISH_NAME
+ REPOSITORY_WEBPAGE
+ COUNTRY
+ REPOSITORY_INSTITUTION
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/applicationContext-isregistry.properties b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/applicationContext-isregistry.properties
new file mode 100644
index 0000000..3676cb6
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/applicationContext-isregistry.properties
@@ -0,0 +1,2 @@
+# values: idPreservingPendingManager, compatPendingManager
+services.registry.pending.resource.manager=idPreservingPendingManager
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/applicationContext-isregistry.xml b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/applicationContext-isregistry.xml
new file mode 100644
index 0000000..3fa3a0b
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/registry/applicationContext-isregistry.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/applicationContext-issn.properties b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/applicationContext-issn.properties
new file mode 100644
index 0000000..4fff392
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/applicationContext-issn.properties
@@ -0,0 +1,19 @@
+services.issn.path=${dnet.data.path}/issn
+services.issn.hib.issndb.url=jdbc:sqlite:${services.issn.path}/dnet_issn.db
+services.issn.hib.issndb.username=dnet
+services.issn.hib.issndb.password=dnetPwd
+services.issn.hibernate.hbm.auto=update
+services.issn.hib.issndb.dialect=org.hibernate.dialect.SQLiteDialect
+services.issn.hib.driverName = org.sqlite.JDBC
+
+services.issn.subscription.filter.active = false
+services.is.sn.subscriptions.cache.ttl = 86400
+services.is.sn.subscriptions.cache.size = 1000
+
+#TO USE POSTGRES YOU NEED TO UNCOMMENT THIS
+#services.issn.hib.issndb.url=jdbc:postgresql://localhost:5432/dnet_issn
+#services.issn.hib.issndb.username=dnet
+#services.issn.hib.issndb.password=dnetPwd
+#services.issn.hibernate.hbm.auto=update
+#services.issn.hib.issndb.dialect=org.hibernate.dialect.PostgreSQLDialect
+#services.issn.hib.driverName = org.postgresql.Driver
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/applicationContext-issn.xml b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/applicationContext-issn.xml
new file mode 100644
index 0000000..df533c2
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/applicationContext-issn.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/applicationContext-issn-hib.xml b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/applicationContext-issn-hib.xml
new file mode 100644
index 0000000..bf0beef
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/applicationContext-issn-hib.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscription
+
+
+
+
+ ${services.issn.hib.issndb.dialect}
+ false
+ ${services.issn.hibernate.hbm.auto}
+
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/applicationContext-isstore.properties b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/applicationContext-isstore.properties
new file mode 100644
index 0000000..77b4a83
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/applicationContext-isstore.properties
@@ -0,0 +1,2 @@
+services.is.store.enable.java=true
+services.is.store.initializer.timetosleep = 4000
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/applicationContext-isstore.xml b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/applicationContext-isstore.xml
new file mode 100644
index 0000000..ede190d
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/applicationContext-isstore.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ persistentExistLogInterceptor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/xquery/dnet.xqm b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/xquery/dnet.xqm
new file mode 100644
index 0000000..0a654f1
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/is/store/xquery/dnet.xqm
@@ -0,0 +1,10 @@
+xquery version "1.0";
+
+module namespace dnet="http://namespace.dnetlib.eu/xquery/dnet";
+declare namespace xmldb="http://exist-db.org/xquery/xmldb";
+
+declare function dnet:deleteDocument($x as element()) {
+
+ xmldb:remove(replace($x/base-uri(),'/[^/]*$', ''), replace($x/base-uri(),'^.*/([^/]*)$', '$1'))
+
+};
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/enabling/tools/applicationContext-tools.xml b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/tools/applicationContext-tools.xml
new file mode 100644
index 0000000..1fb1285
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/enabling/tools/applicationContext-tools.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/main/resources/eu/dnetlib/xml/database/exist/default-exist-conf.xml b/dnet-information-service/src/main/resources/eu/dnetlib/xml/database/exist/default-exist-conf.xml
new file mode 100644
index 0000000..bfdec64
--- /dev/null
+++ b/dnet-information-service/src/main/resources/eu/dnetlib/xml/database/exist/default-exist-conf.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/lookup/ISLookUpServiceImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/lookup/ISLookUpServiceImplTest.java
new file mode 100644
index 0000000..e25f719
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/lookup/ISLookUpServiceImplTest.java
@@ -0,0 +1,145 @@
+package eu.dnetlib.enabling.is.lookup;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.io.SAXReader;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreException;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreService;
+import eu.dnetlib.enabling.tools.XQueryUtilsImpl;
+
+/**
+ * ISLookUpService test.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ISLookUpServiceImplTest {
+
+ /**
+ * test profile id.
+ */
+ private static final String PROF_ID = "first_c2Vjb25k";
+
+ /**
+ * List of ids.
+ */
+ private static final List ID_LIST = Arrays.asList(new String[] { "fff", "ggg", "hhh" });
+
+ /**
+ * class under test.
+ */
+ private transient ISLookUpServiceImpl lookup;
+
+ /**
+ * is store service mock.
+ */
+ @Mock
+ private transient ISStoreService storeService;
+
+ /**
+ * common test case init.
+ */
+ @Before
+ public void setUp() {
+ lookup = new ISLookUpServiceImpl();
+ lookup.setXqueryUtils(new XQueryUtilsImpl());
+ lookup.setIsStore(storeService);
+ }
+
+ /**
+ * test get file name from id.
+ */
+ @Test
+ public void testGetFileNameForId() {
+ assertEquals("check", "first", lookup.getFileNameForId(PROF_ID));
+ }
+
+ /**
+ * test get file coll from id.
+ */
+ @Test
+ public void testGetFileCollForId() {
+ assertEquals("check", "second", lookup.getFileCollForId(PROF_ID));
+ }
+
+ /**
+ * test get resource profile.
+ *
+ * @throws ISLookUpException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ */
+ @Test
+ public void testGetResourceProfile() throws ISLookUpException, ISStoreException {
+ when(storeService.getXML("first", "/db/DRIVER/second")).thenReturn(" ");
+
+ assertNotNull("get profile", lookup.getResourceProfile(PROF_ID));
+ }
+
+ /**
+ * test get resource profile when no such document exists.
+ *
+ * @throws ISLookUpException
+ * expected
+ */
+ @Test(expected = ISLookUpDocumentNotFoundException.class)
+ public void testGetResourceProfileNonExisting() throws ISLookUpException {
+ lookup.getResourceProfile(PROF_ID);
+ }
+
+ /**
+ * test getCollection.
+ *
+ * @throws IOException
+ * could happen
+ * @throws ISStoreException
+ * could happen
+ * @throws ISLookUpException
+ * could happen
+ * @throws DocumentException
+ * could happen
+ */
+ @Test
+ public void testGetCollection() throws IOException, ISStoreException, ISLookUpException, DocumentException {
+ final StringWriter writer = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("collProfile.xml"), writer);
+ final String simpleProf = writer.getBuffer().toString();
+
+ when(storeService.getXML(anyString(), anyString())).thenReturn(simpleProf);
+ when(
+ storeService.quickSearchXML("for $x in collection('/db/DRIVER/CollectionDSResources') where $x//FATHER/@id = '" + PROF_ID
+ + "' return $x//RESOURCE_IDENTIFIER/@value/string()")).thenReturn(ID_LIST);
+
+ final String profile = lookup.retrieveCollection(PROF_ID);
+ final SAXReader reader = new SAXReader();
+ final Document doc = reader.read(new StringReader(profile));
+
+ assertEquals("children", ID_LIST.size(), doc.selectNodes("//CHILDREN/CHILD").size());
+ for (final String id : ID_LIST) {
+ assertNotNull("child", doc.selectSingleNode("//CHILDREN/CHILD[@id='" + id + "']"));
+ }
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ApplicationProfileResourceKindResolverTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ApplicationProfileResourceKindResolverTest.java
new file mode 100644
index 0000000..3f80807
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ApplicationProfileResourceKindResolverTest.java
@@ -0,0 +1,29 @@
+package eu.dnetlib.enabling.is.registry;
+
+import static org.junit.Assert.*;
+
+import javax.xml.xpath.XPathExpressionException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ApplicationProfileResourceKindResolverTest {
+
+ private ApplicationProfileResourceKindResolver resolver;
+
+ @Before
+ public void setUp() throws Exception {
+ resolver = new ApplicationProfileResourceKindResolver();
+ }
+
+ @Test(expected = NoSuchPendingCategoryException.class)
+ public void testPending() throws XPathExpressionException {
+ resolver.getPendingKindForType("TestType");
+ }
+
+ @Test
+ public void testPendingExisting() throws XPathExpressionException {
+ assertEquals("PendingServiceResources", resolver.getPendingKindForType("IndexServiceResourceType"));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/CompatPendingResourceManagerImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/CompatPendingResourceManagerImplTest.java
new file mode 100644
index 0000000..438dc5b
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/CompatPendingResourceManagerImplTest.java
@@ -0,0 +1,149 @@
+package eu.dnetlib.enabling.is.registry;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import javax.xml.xpath.XPathExpressionException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
+import eu.dnetlib.enabling.is.registry.schema.ValidationException;
+import eu.dnetlib.enabling.is.registry.validation.ProfileValidationStrategy;
+import eu.dnetlib.enabling.is.registry.validation.RegistrationPhase;
+import eu.dnetlib.enabling.tools.OpaqueResource;
+
+/**
+ * test compatibility pending resource manager implementation.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class CompatPendingResourceManagerImplTest {
+
+ /**
+ * instance under test.
+ */
+ private transient CompatPendingResourceManagerImpl pendingManager;
+
+ /**
+ * registry service mock.
+ */
+ @Mock
+ private transient ISRegistryService registryService;
+
+ /**
+ * resource mock.
+ */
+ @Mock
+ private transient OpaqueResource resource;
+ /**
+ * used to validate resources w.r.t. a set of defined properties.
+ */
+ @Mock
+ private ProfileValidationStrategy profileValidationStrategy;
+
+ /**
+ * prepare instance for testing.
+ */
+ @Before
+ public void setUp() {
+ pendingManager = new CompatPendingResourceManagerImpl();
+ pendingManager.setIsRegistry(registryService);
+ pendingManager.setResourceKindResolver(new ApplicationProfileResourceKindResolver());
+ pendingManager.setProfileValidationStrategy(profileValidationStrategy);
+ }
+
+ /**
+ * test that the application profile can be queried correctly.
+ *
+ * @throws XPathExpressionException
+ * shouldn't happen
+ */
+ @Test
+ public void testGetPendingKindForType() throws XPathExpressionException {
+ assertEquals("check pending", "PendingRepositoryResources", pendingManager.getPendingKindForType("RepositoryServiceResourceType"));
+ assertEquals("check pending", "PendingDSResources", pendingManager.getPendingKindForType("UserDSResourceType"));
+ }
+
+ /**
+ * check that unexistent types throw an exception.
+ *
+ * @throws XPathExpressionException
+ * shouldn't happen
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testGetPendingKindForNoSuchType() throws XPathExpressionException {
+ pendingManager.getPendingKindForType("NoSuchType");
+ }
+
+ /**
+ * test that the application profile can be queried correctly.
+ *
+ * @throws XPathExpressionException
+ * shouldn't happen
+ */
+ @Test
+ public void testGetNormalKindForType() throws XPathExpressionException {
+ assertEquals("check kind", "RepositoryServiceResources", pendingManager.getNormalKindForType("RepositoryServiceResourceType"));
+ assertEquals("check kind", "UserDSResources", pendingManager.getNormalKindForType("UserDSResourceType"));
+ assertNull("check unexisting type", pendingManager.getNormalKindForType("NoSuchType"));
+ }
+
+ /**
+ * test that the resource is correctly moved from the pending collection to the new collection.
+ *
+ * @throws ISRegistryException
+ * shoudn't happen
+ * @throws ValidationException
+ */
+ @Test
+ public void testSetValid() throws ISRegistryException, ValidationException {
+ final String profId = "123";
+ when(resource.asString()).thenReturn("");
+ when(resource.getResourceId()).thenReturn(profId);
+ //when(profileValidationStrategy.accept(any(OpaqueResource.class), eq(RegistrationPhase.Register))).thenReturn(true);
+
+ pendingManager.setValid(resource);
+
+ verify(registryService).deleteProfile(profId);
+ verify(registryService).registerProfile(anyString());
+
+ assertNotNull("dummy", registryService);
+ }
+
+ /**
+ * test that the resource is correctly moved from the current collection to the correct pending collection.
+ *
+ * @throws ISRegistryException
+ * shoudn't happen
+ */
+ @Test
+ public void testSetPending() throws ISRegistryException {
+ final String profId = "321";
+ when(resource.asString()).thenReturn("");
+ when(resource.getResourceId()).thenReturn(profId);
+ when(resource.getResourceType()).thenReturn("RepositoryServiceResourceType");
+
+ pendingManager.setPending(resource);
+
+ verify(registryService).deleteProfile(profId);
+ verify(registryService).registerProfile(anyString());
+
+ assertNotNull("dummy", registryService);
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ISRegistryServiceImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ISRegistryServiceImplTest.java
new file mode 100644
index 0000000..41812af
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ISRegistryServiceImplTest.java
@@ -0,0 +1,489 @@
+package eu.dnetlib.enabling.is.registry; // NOPMD
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.xml.sax.SAXException;
+
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
+import eu.dnetlib.enabling.is.registry.schema.OpaqueResourceValidator;
+import eu.dnetlib.enabling.is.registry.schema.ValidationException;
+import eu.dnetlib.enabling.is.registry.validation.ProfileValidationStrategy;
+import eu.dnetlib.enabling.is.registry.validation.RegistrationPhase;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreException;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreService;
+import eu.dnetlib.enabling.tools.CompatResourceIdentifierResolverImpl;
+import eu.dnetlib.enabling.tools.OpaqueResource;
+import eu.dnetlib.enabling.tools.ResourceType;
+import eu.dnetlib.enabling.tools.StringOpaqueResource;
+import eu.dnetlib.enabling.tools.XQueryUtils;
+import eu.dnetlib.enabling.tools.XQueryUtilsImpl;
+
+/**
+ * test registry service.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ISRegistryServiceImplTest { // NOPMD
+
+ /**
+ * a test resource type.
+ */
+ private static final String REPOSITORY_TYPE = "RepositoryServiceResourceType";
+
+ /**
+ * TODO: use a shared constant for this.
+ */
+ private static final String DB_DRIVER = "/db/DRIVER/";
+
+ /**
+ * class under test.
+ */
+ private transient ISRegistryServiceImpl registry;
+
+ /**
+ * store service mock.
+ */
+ @Mock
+ private transient ISStoreService storeService;
+
+ /**
+ * lookup service mock.
+ */
+ @Mock
+ private transient ISLookUpService lookUpService;
+
+ /**
+ * xml source of a test profile, loaded from test-profile.xml.
+ */
+ private transient String profileSource;
+
+ /**
+ * resource identifier resolver, converts IDs to filename/collection pairs.
+ */
+ private transient CompatResourceIdentifierResolverImpl resIdResolver;
+
+ /**
+ * schema validator.
+ */
+ @Mock
+ private transient OpaqueResourceValidator validator;
+
+ /**
+ * xquery utils, used for xmldb root path.
+ */
+ private final transient XQueryUtils xqueryUtils = new XQueryUtilsImpl();
+
+ /**
+ * used to validate resources w.r.t. a set of defined properties.
+ */
+ @Mock
+ private ProfileValidationStrategy profileValidationStrategy;
+
+ /**
+ * common initialization.
+ *
+ * @throws IOException
+ * shouldn't happen
+ */
+ @Before
+ public void setUp() throws IOException {
+ registry = new ISRegistryServiceImpl();
+ registry.setXqueryUtils(new XQueryUtilsImpl());
+ resIdResolver = new CompatResourceIdentifierResolverImpl();
+ registry.setResIdResolver(resIdResolver);
+
+ final CompatPendingResourceManagerImpl pendingManager = new CompatPendingResourceManagerImpl();
+ pendingManager.setResourceKindResolver(new ApplicationProfileResourceKindResolver());
+ pendingManager.setProfileValidationStrategy(profileValidationStrategy);
+
+ registry.setPendingManager(pendingManager);
+ pendingManager.setIsRegistry(registry);
+ registry.setIsStore(storeService);
+ registry.setIsLookup(lookUpService);
+
+ registry.setResourceValidator(validator);
+
+ final StringWriter writer = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("test-profile.xml"), writer);
+ profileSource = writer.getBuffer().toString();
+
+ registry.setProfileValidationStrategy(profileValidationStrategy);
+ }
+
+ /**
+ * test the deletion of a profile.
+ *
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws XPathExpressionException
+ * shouldn't happen
+ * @throws SAXException
+ * shouldn't happen
+ * @throws IOException
+ * shouldn't happen
+ * @throws ParserConfigurationException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ */
+ @Test
+ public void testDeleteProfile() throws ISRegistryException, XPathExpressionException, SAXException, IOException, ParserConfigurationException,
+ ISStoreException {
+ final OpaqueResource resource = new StringOpaqueResource(profileSource);
+ final String resId = resource.getResourceId();
+
+ boolean catched = false; // NOPMD
+ try {
+ registry.deleteProfile(resId);
+ } catch (ISRegistryDocumentNotFoundException e) {
+ catched = true;
+ }
+
+ assertTrue("exception raised", catched);
+ verify(storeService).deleteXML(registry.getResIdResolver().getFileName(resId), DB_DRIVER + registry.getResIdResolver().getCollectionName(resId));
+
+ assertNotNull("dummy", storeService);
+ }
+
+ /**
+ * test the deletion of an inexitent profile. It should throwa specific exception
+ *
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws XPathExpressionException
+ * shouldn't happen
+ * @throws SAXException
+ * shouldn't happen
+ * @throws IOException
+ * shouldn't happen
+ * @throws ParserConfigurationException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ */
+ @Test(expected = ISRegistryDocumentNotFoundException.class)
+ public void testDeleteInexistentProfile() throws ISRegistryException, XPathExpressionException, SAXException, IOException,
+ ParserConfigurationException, ISStoreException {
+ final OpaqueResource resource = new StringOpaqueResource(profileSource);
+ final String resId = resource.getResourceId();
+ final String wrongId = "xx" + resId;
+
+ when(storeService.deleteXML(registry.getResIdResolver().getFileName(wrongId), DB_DRIVER + registry.getResIdResolver().getCollectionName(wrongId)))
+ .thenReturn(false);
+
+ registry.deleteProfile(wrongId);
+ }
+
+ /**
+ * test register profile.
+ *
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws IOException
+ * shouldn't happen
+ * @throws ParserConfigurationException
+ * shouldn't happen
+ * @throws SAXException
+ * shouldn't happen
+ * @throws XPathExpressionException
+ * shouldn't happen
+ * @throws ValidationException
+ */
+ @Test
+ public void testRegisterProfile() throws ISRegistryException, ISStoreException, IOException, XPathExpressionException, SAXException,
+ ParserConfigurationException, ValidationException {
+
+ when(profileValidationStrategy.accept((OpaqueResource) anyObject(), eq(RegistrationPhase.Register))).thenReturn(true);
+ final String newId = registry.registerProfile(profileSource);
+
+ verify(storeService).insertXML(eq(resIdResolver.getFileName(newId)), eq(DB_DRIVER + resIdResolver.getCollectionName(newId)), anyString());
+
+ final OpaqueResource resource = new StringOpaqueResource(profileSource);
+ assertFalse("new identifier is generated", newId.equals(resource.getResourceId()));
+
+ }
+
+ /**
+ * test update profile.
+ *
+ * @throws XPathExpressionException
+ * should'nt happen
+ * @throws SAXException
+ * should'nt happen
+ * @throws IOException
+ * should'nt happen
+ * @throws ParserConfigurationException
+ * should'nt happen
+ * @throws ISRegistryException
+ * should'nt happen
+ * @throws ISStoreException
+ * should'nt happen
+ */
+ @Test
+ public void testUpdateProfile() throws XPathExpressionException, SAXException, IOException, ParserConfigurationException, ISRegistryException,
+ ISStoreException {
+ final OpaqueResource resource = new StringOpaqueResource(profileSource);
+
+ final String fileName = resIdResolver.getFileName(resource.getResourceId());
+ final String fileColl = resIdResolver.getCollectionName(resource.getResourceId());
+ when(storeService.updateXML(eq(fileName), eq(DB_DRIVER + fileColl), anyString())).thenReturn(true);
+
+ when(storeService.getXML(fileName, DB_DRIVER + fileColl)).thenReturn(resource.asString());
+
+ final boolean res = registry.updateProfile(resource.getResourceId(), resource.asString(), resource.getResourceType());
+ assertTrue("success", res);
+ }
+
+ /**
+ * Check that the xml schema is correctly validated even on updateProfile.
+ *
+ * @throws XPathExpressionException
+ * cannot happen
+ * @throws SAXException
+ * cannot happen
+ * @throws IOException
+ * cannot happen
+ * @throws ParserConfigurationException
+ * cannot happen
+ * @throws ISRegistryException
+ * mock
+ * @throws ValidationException
+ * mock
+ */
+ @Test(expected = ISRegistryException.class)
+ public void testUpdateProfileSchemaValidate() throws XPathExpressionException, SAXException, IOException, ParserConfigurationException,
+ ISRegistryException, ValidationException {
+ final OpaqueResource resource = new StringOpaqueResource(profileSource);
+
+ //doThrow(new ValidationException("invalid xml")).when(validator).validate((OpaqueResource) anyObject());
+
+ registry.updateProfile(resource.getResourceId(), " ", resource.getResourceType());
+ }
+
+ /**
+ * test profile validation.
+ *
+ * @throws XPathExpressionException
+ * shouldn't happen
+ * @throws SAXException
+ * shouldn't happen
+ * @throws IOException
+ * shouldn't happen
+ * @throws ParserConfigurationException
+ * shouldn't happen
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws ISLookUpException
+ * shouldn't happen
+ * @throws ValidationException
+ */
+ @Test
+ public void testValidateProfile() throws XPathExpressionException, SAXException, IOException, ParserConfigurationException, ISRegistryException,
+ ISStoreException, ISLookUpException, ValidationException {
+ final OpaqueResource resource = new StringOpaqueResource(profileSource);
+
+ final String oldId = registry.insertProfileForValidation(resource.getResourceType(), resource.asString());
+ resource.setResourceKind("PendingRepositoryResources"); // simulate the validation
+
+ resource.setResourceId(oldId);
+ when(lookUpService.getResourceProfile(oldId)).thenReturn(resource.asString());
+ when(storeService.deleteXML(resIdResolver.getFileName(oldId), DB_DRIVER + resIdResolver.getCollectionName(oldId))).thenReturn(true);
+ when(profileValidationStrategy.accept((OpaqueResource) anyObject(), eq(RegistrationPhase.Register))).thenReturn(true);
+
+ final String newId = registry.validateProfile(oldId);
+
+ verify(storeService).deleteXML(resIdResolver.getFileName(oldId), DB_DRIVER + resIdResolver.getCollectionName(oldId));
+ verify(storeService).insertXML(eq(resIdResolver.getFileName(newId)), eq(DB_DRIVER + resIdResolver.getCollectionName(newId)), anyString());
+
+ assertFalse("the id should be be unstable", resIdResolver.getFileName(oldId).equals(resIdResolver.getFileName(newId)));
+ }
+
+ /**
+ * test invalidate profile.
+ *
+ * @throws XPathExpressionException
+ * shouldn't happen
+ * @throws SAXException
+ * shouldn't happen
+ * @throws IOException
+ * shouldn't happen
+ * @throws ParserConfigurationException
+ * shouldn't happen
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws ISLookUpException
+ * shouldn't happen
+ */
+ @Test
+ public void testInvalidateProfile() throws XPathExpressionException, SAXException, IOException, ParserConfigurationException, ISRegistryException,
+ ISStoreException, ISLookUpException {
+
+ final OpaqueResource resource = new StringOpaqueResource(profileSource);
+ resource.setResourceKind("PendingResources");
+
+ final String oldId = registry.registerProfile(resource.asString());
+
+ resource.setResourceId(oldId);
+ when(lookUpService.getResourceProfile(oldId)).thenReturn(resource.asString());
+ when(storeService.deleteXML(resIdResolver.getFileName(oldId), DB_DRIVER + resIdResolver.getCollectionName(oldId))).thenReturn(true);
+
+ final String newId = registry.invalidateProfile(oldId);
+
+ verify(storeService).deleteXML(resIdResolver.getFileName(oldId), DB_DRIVER + resIdResolver.getCollectionName(oldId));
+ verify(storeService).insertXML(eq(resIdResolver.getFileName(newId)), eq(DB_DRIVER + resIdResolver.getCollectionName(newId)), anyString());
+
+ assertFalse("the id should be be unstable", resIdResolver.getFileName(oldId).equals(resIdResolver.getFileName(newId)));
+
+ }
+
+ /**
+ * test that the resource kind is correctly changed when inserting for validation.
+ *
+ * @throws IOException
+ * shouldn't happen
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws XPathExpressionException
+ * shouldn't happen
+ * @throws SAXException
+ * shouldn't happen
+ * @throws ParserConfigurationException
+ * shouldn't happen
+ */
+ @Test
+ public void testInsertProfileForValidation() throws IOException, ISRegistryException, ISStoreException, XPathExpressionException, SAXException,
+ ParserConfigurationException {
+
+ final OpaqueResource resource = new StringOpaqueResource(profileSource);
+ final String newId = registry.insertProfileForValidation(resource.getResourceType(), resource.asString());
+
+ verify(storeService).insertXML(eq(resIdResolver.getFileName(newId)), eq(DB_DRIVER + "PendingRepositoryResources/RepositoryServiceResourceType"),
+ anyString());
+
+ verify(storeService, never()).deleteXML(anyString(), anyString());
+
+ assertEquals("check pending id", "PendingRepositoryResources/RepositoryServiceResourceType", resIdResolver.getCollectionName(newId));
+ }
+
+ /**
+ * The ISRegistry's insertProfileForValidation contract specifies that an exception should be raised if the argument doesn't match the
+ * type.
+ *
+ * @throws IOException
+ * shouldn't happen
+ * @throws ISRegistryException
+ * expected
+ */
+ @Test(expected = ISRegistryException.class)
+ public void testInsertProfileForValidationInvalid() throws IOException, ISRegistryException {
+ registry.insertProfileForValidation("WrongRepositoryServiceResourceType", profileSource);
+ }
+
+ /**
+ * test resource type addition.
+ *
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws IOException
+ * shouldn't happen
+ * @throws ISStoreException
+ * cannot happen, mock
+ */
+ @Test
+ public void testAddResourceType() throws ISRegistryException, IOException, ISStoreException {
+ final StringWriter resourceSchema = new StringWriter();
+
+ IOUtils.copy(getClass().getResourceAsStream("RepositoryServiceResourceType.xsd"), resourceSchema);
+ assertNotNull("check schema", resourceSchema.toString());
+
+ registry.addResourceType(REPOSITORY_TYPE, resourceSchema.toString());
+
+ verify(storeService).insertXML(REPOSITORY_TYPE, xqueryUtils.getRootCollection() + ResourceType.RESOURCE_TYPES, resourceSchema.toString());
+ }
+
+ /**
+ * test resource type deletion.
+ *
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws ISStoreException
+ * cannot happen, mock
+ */
+ @Test
+ public void testDeleteResourceType() throws ISRegistryException, ISStoreException {
+ assertNotNull("dummy", registry);
+
+ registry.deleteResourceType(REPOSITORY_TYPE, false);
+
+ verify(storeService).deleteXML(REPOSITORY_TYPE, xqueryUtils.getRootCollection() + ResourceType.RESOURCE_TYPES);
+ }
+
+ /**
+ * register secure profile.
+ *
+ * @throws ISRegistryException
+ * shouldn't happen
+ * @throws ISLookUpException
+ * mocked
+ * @throws IOException
+ * shouldn't happen
+ * @throws ISStoreException
+ * mock
+ * @throws ValidationException
+ */
+ @Test
+ public void testRegisterSecureProfile() throws ISRegistryException, ISLookUpException, IOException, ISStoreException, ValidationException { // NOPMD
+ final String resourceProfId = "12-70b2a9e0-7d53-4ffb-be43-f3c571ae21a6_VXNlckRTUmVzb3VyY2VzL1VzZXJEU1Jlc291cmNlVHlwZQ==";
+ final String secureProfId = "sec123_U2VjdXJpdHlQcm9maWxlRFNSZXNvdXJjZXMvU2VjdXJpdHlQcm9maWxlRFNSZXNvdXJjZVR5cGU=";
+
+ final StringWriter profile = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("userProfile.xml"), profile);
+ when(lookUpService.getResourceProfile(resourceProfId)).thenReturn(profile.toString());
+ when(profileValidationStrategy.accept((OpaqueResource) anyObject(), eq(RegistrationPhase.Register))).thenReturn(true);
+
+ final StringWriter secure = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("securityProfile.xml"), secure);
+ when(lookUpService.getResourceProfile(secureProfId)).thenReturn(secure.toString());
+ when(storeService.deleteXML(resIdResolver.getFileName(resourceProfId), DB_DRIVER + resIdResolver.getCollectionName(resourceProfId))).thenReturn(
+ true);
+ when(storeService.updateXML(eq("sec123"), eq(DB_DRIVER + "SecurityProfileDSResources/SecurityProfileDSResourceType"), anyString())).thenReturn(
+ true);
+ when(storeService.getXML("sec123", DB_DRIVER + "SecurityProfileDSResources/SecurityProfileDSResourceType")).thenReturn(" ");
+
+ registry.registerSecureProfile(resourceProfId, secureProfId);
+ }
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/NameBasedResourceKindResolverTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/NameBasedResourceKindResolverTest.java
new file mode 100644
index 0000000..606765b
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/NameBasedResourceKindResolverTest.java
@@ -0,0 +1,41 @@
+package eu.dnetlib.enabling.is.registry;
+
+
+import static org.junit.Assert.*;
+
+import javax.xml.xpath.XPathExpressionException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test the name based resource kind resolver.
+ *
+ * @author marko
+ *
+ */
+public class NameBasedResourceKindResolverTest {
+
+ /**
+ * instance under test.
+ */
+ private NameBasedResourceKindResolver resolver;
+
+ @Before
+ public void setUp() throws Exception {
+ resolver = new NameBasedResourceKindResolver();
+ }
+
+ @Test
+ public void testService() throws XPathExpressionException {
+ assertEquals("ServiceResources", resolver.getNormalKindForType("MyNewServiceResourceType"));
+ assertEquals("PendingServiceResources", resolver.getPendingKindForType("MyNewServiceResourceType"));
+ }
+
+ @Test
+ public void testGeneric() throws XPathExpressionException {
+ assertEquals("MyNewResources", resolver.getNormalKindForType("MyNewResourceType"));
+ assertEquals("PendingDSResources", resolver.getPendingKindForType("MyNewResourceType"));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/RegistryBlackboardManagerImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/RegistryBlackboardManagerImplTest.java
new file mode 100644
index 0000000..b7ff226
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/RegistryBlackboardManagerImplTest.java
@@ -0,0 +1,293 @@
+package eu.dnetlib.enabling.is.registry; // NOPMD
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
+import eu.dnetlib.enabling.tools.OpaqueResource;
+import eu.dnetlib.enabling.tools.StringOpaqueResource;
+import eu.dnetlib.enabling.tools.blackboard.ActionStatus;
+import eu.dnetlib.enabling.tools.blackboard.BlackboardMessage;
+import eu.dnetlib.enabling.tools.blackboard.BlackboardMessageImpl;
+import eu.dnetlib.enabling.tools.blackboard.BlackboardParameter;
+import eu.dnetlib.enabling.tools.blackboard.BlackboardParameterImpl;
+import eu.dnetlib.miscutils.jaxb.JaxbFactory;
+
+/**
+ * RegistryBlackboardManagerImpl test.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class RegistryBlackboardManagerImplTest {
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(RegistryBlackboardManagerImplTest.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * test message id.
+ */
+ private static final String MSG_ID = "xxx";
+
+ /**
+ * fake message date.
+ */
+ private static final String MSG_DATE = "2009-03-19T17:55:45+01:00";
+
+ /**
+ * service profile ID.
+ */
+ private static final String PROF_ID = "123";
+
+ /**
+ * lookup service mock.
+ */
+ @Mock
+ private transient ISLookUpService lookupService;
+
+ /**
+ * registry service mock.
+ */
+ @Mock
+ private transient ISRegistryService registryService;
+
+ /**
+ * instance under test.
+ */
+ private transient RegistryBlackboardManagerImpl manager;
+
+ /**
+ * common setup.
+ *
+ * @throws JAXBException
+ * could happen
+ * @throws IOException
+ * shouldn't happen
+ * @throws ISLookUpException
+ * mock
+ */
+ @Before
+ public void setUp() throws JAXBException, IOException, ISLookUpException {
+ manager = new RegistryBlackboardManagerImpl();
+ manager.setIsLookup(lookupService);
+ manager.setRegistryService(registryService);
+
+ manager.setMessageFactory(new JaxbFactory(BlackboardMessageImpl.class));
+
+ manager.setMessageDater(new RegistryBlackboardManagerImpl.MessageDater() {
+
+ @Override
+ public String getCurrentDate() {
+ return MSG_DATE;
+ }
+
+ @Override
+ public String getNumericStamp() {
+ return "1237483712.666000";
+ }
+ });
+ }
+
+ /**
+ * add message.
+ *
+ * @throws JAXBException
+ * could happen
+ * @throws ISRegistryException
+ * could happen
+ * @throws IOException
+ * could happen
+ * @throws ISLookUpException
+ * mock
+ */
+ @Test
+ public void testAddMessage() throws JAXBException, ISRegistryException, IOException, ISLookUpException {
+ final StringWriter serviceProfile = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("serviceProfile.xml"), serviceProfile);
+ when(lookupService.getResourceProfile(PROF_ID)).thenReturn(serviceProfile.toString());
+
+ final BlackboardMessage message = manager.getMessageFactory().newInstance();
+ message.setId(MSG_ID);
+ message.setDate(MSG_DATE);
+ message.setAction("CREATE");
+ message.setActionStatus(ActionStatus.ASSIGNED);
+
+ final BlackboardParameter param1 = new BlackboardParameterImpl();
+ param1.setName("format");
+ param1.setValue("DMF");
+ message.getParameters().add(param1);
+
+ final BlackboardParameter param2 = new BlackboardParameterImpl();
+ param1.setName("id");
+ param1.setValue("");
+ message.getParameters().add(param2);
+
+ manager.addMessage(PROF_ID, MSG_ID, manager.getMessageFactory().serialize(message));
+
+ verify(registryService).updateProfile(eq(PROF_ID), argThat(new ArgumentMatcher() {
+
+ @Override
+ public boolean matches(final String argument) {
+ log.info("arg: " + argument);
+
+ try {
+ final OpaqueResource updatedResource = new StringOpaqueResource((String) argument);
+ final Node messageNode = (Node) XPathFactory.newInstance().newXPath().evaluate("//BLACKBOARD/MESSAGE[last()]",
+ updatedResource.asDom(), XPathConstants.NODE);
+
+ final BlackboardMessage updatedMessage = manager.getMessageFactory().parse(new DOMSource(messageNode));
+
+ assertEquals("messages should match", message, updatedMessage);
+
+ final Element lastUpdated = (Element) XPathFactory.newInstance().newXPath().evaluate("//BLACKBOARD/LAST_REQUEST",
+ updatedResource.asDom(), XPathConstants.NODE);
+ assertEquals("stamp date", manager.getMessageDater().getNumericStamp(), lastUpdated.getAttribute("date"));
+ assertEquals("stamp message", MSG_ID, lastUpdated.getTextContent());
+ } catch (Exception e) {
+ fail("got exception" + e);
+ }
+ return true;
+ }
+ }), anyString());
+ }
+
+ /**
+ * delete message.
+ *
+ * @throws ISLookUpException
+ * mock
+ * @throws IOException
+ * could happen
+ * @throws ISRegistryException
+ * mock
+ */
+ @Test
+ public void testDeleteMessage() throws ISLookUpException, IOException, ISRegistryException {
+ final StringWriter serviceProfile = new StringWriter();
+
+ IOUtils.copy(getClass().getResourceAsStream("serviceProfileWithMessage.xml"), serviceProfile);
+ when(lookupService.getResourceProfile(PROF_ID)).thenReturn(serviceProfile.toString());
+
+ manager.deleteMessage(PROF_ID, MSG_ID);
+
+ verify(registryService).updateProfile(eq(PROF_ID), argThat(new ArgumentMatcher() {
+
+ @Override
+ public boolean matches(final String argument) {
+ log.debug("arg: " + argument);
+
+ try {
+ final OpaqueResource updatedResource = new StringOpaqueResource((String) argument);
+
+ final Node messageNode = (Node) XPathFactory.newInstance().newXPath().evaluate("//BLACKBOARD/MESSAGE[last()]",
+ updatedResource.asDom(), XPathConstants.NODE);
+
+ assertNull("message should be deleted", messageNode);
+ } catch (Exception e) {
+ fail("got exception" + e);
+ }
+ return true;
+ }
+ }), anyString());
+
+ // assertNotNull("dummy", manager);
+ }
+
+ /**
+ * replay message.
+ *
+ * @throws ISLookUpException
+ * mock
+ * @throws IOException
+ * shouldn't happen
+ * @throws ISRegistryException
+ * mock
+ * @throws JAXBException
+ * could happen
+ */
+ @Test
+ public void testReplyMessage() throws ISLookUpException, IOException, ISRegistryException, JAXBException {
+ final StringWriter serviceProfile = new StringWriter();
+
+ IOUtils.copy(getClass().getResourceAsStream("serviceProfileWithMessage.xml"), serviceProfile);
+ when(lookupService.getResourceProfile(PROF_ID)).thenReturn(serviceProfile.toString());
+
+ final BlackboardMessage message = manager.getMessageFactory().newInstance();
+ message.setId(MSG_ID);
+ message.setDate(MSG_DATE);
+ message.setAction("CREATE");
+ message.setActionStatus(ActionStatus.ONGOING);
+
+ final BlackboardParameter param1 = new BlackboardParameterImpl();
+ param1.setName("format");
+ param1.setValue("DMF");
+ message.getParameters().add(param1);
+
+ final BlackboardParameter param2 = new BlackboardParameterImpl();
+ param1.setName("id");
+ param1.setValue("");
+ message.getParameters().add(param2);
+
+ manager.replyMessage(PROF_ID, manager.getMessageFactory().serialize(message));
+
+ verify(registryService).updateProfile(eq(PROF_ID), argThat(new ArgumentMatcher() {
+
+ @Override
+ public boolean matches(final String argument) {
+ log.info("arg: " + argument);
+
+ try {
+ final OpaqueResource updatedResource = new StringOpaqueResource((String) argument);
+
+ final Node messageNode = (Node) XPathFactory.newInstance().newXPath().evaluate("//BLACKBOARD/MESSAGE[last()]",
+ updatedResource.asDom(), XPathConstants.NODE);
+
+ final BlackboardMessage updatedMessage = manager.getMessageFactory().parse(new DOMSource(messageNode));
+
+ assertEquals("messages should match", message, updatedMessage);
+
+ final Element lastUpdated = (Element) XPathFactory.newInstance().newXPath().evaluate("//BLACKBOARD/LAST_RESPONSE",
+ updatedResource.asDom(), XPathConstants.NODE);
+ assertEquals("stamp date", manager.getMessageDater().getNumericStamp(), lastUpdated.getAttribute("date"));
+ assertEquals("stamp message", MSG_ID, lastUpdated.getTextContent());
+ } catch (Exception e) {
+ fail("got exception" + e);
+ }
+ return true;
+ }
+ }), anyString());
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ResourceKindResolverChainTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ResourceKindResolverChainTest.java
new file mode 100644
index 0000000..87cd4b4
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/ResourceKindResolverChainTest.java
@@ -0,0 +1,36 @@
+package eu.dnetlib.enabling.is.registry;
+
+import static org.junit.Assert.*;
+
+import javax.xml.xpath.XPathExpressionException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Test if the kind resolver chain correctly fails back.
+ *
+ * @author marko
+ *
+ */
+public class ResourceKindResolverChainTest {
+
+ private ResourceKindResolverChain chain;
+
+ @Before
+ public void setUp() throws Exception {
+ chain = new ResourceKindResolverChain();
+ chain.setResolvers(Lists.newArrayList(new ApplicationProfileResourceKindResolver(), new NameBasedResourceKindResolver()));
+ }
+
+ @Test
+ public void testChain() throws XPathExpressionException {
+ assertEquals("ServiceResources", chain.getNormalKindForType("MyServiceResourceType"));
+ assertEquals("PendingServiceResources", chain.getPendingKindForType("MyServiceResourceType"));
+
+ assertEquals("RepositoryServiceResources", chain.getNormalKindForType("RepositoryServiceResourceType"));
+ assertEquals("PendingRepositoryResources", chain.getPendingKindForType("RepositoryServiceResourceType"));
+ }
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/schema/OpaqueResourceValidatorImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/schema/OpaqueResourceValidatorImplTest.java
new file mode 100644
index 0000000..7c3acbe
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/schema/OpaqueResourceValidatorImplTest.java
@@ -0,0 +1,96 @@
+package eu.dnetlib.enabling.is.registry.schema;
+
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.when;
+
+import javax.xml.XMLConstants;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.xml.sax.SAXException;
+
+import eu.dnetlib.enabling.tools.StreamOpaqueResource;
+
+/**
+ * test schema validator.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class OpaqueResourceValidatorImplTest {
+
+ /**
+ * instance under test.
+ */
+ private transient OpaqueResourceValidatorImpl validator;
+
+ /**
+ * resource schema dao mock.
+ */
+ @Mock
+ private transient ResourceSchemaDAO schemaDao;
+
+ /**
+ * prepare tests.
+ *
+ * @throws SAXException
+ * schema related
+ */
+ @Before
+ public void setUp() throws SAXException {
+ final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ final Schema schema = schemaFactory.newSchema(new StreamSource(getClass().getResourceAsStream("schema.xsd")));
+
+ when(schemaDao.getResourceSchema(anyString())).thenReturn(schema);
+
+ validator = new OpaqueResourceValidatorImpl();
+ validator.setSchemaDao(schemaDao);
+ }
+
+ /**
+ * test profile validation.
+ *
+ * @throws Exception
+ * could happen
+ */
+ @Test
+ public void testValid() throws Exception { // NOPMD
+ validator.validate(new StreamOpaqueResource(getClass().getResourceAsStream("valid-profile.xml")));
+ assertNotNull("dummy", validator);
+ }
+
+ /**
+ * test profile validation.
+ *
+ * @throws Exception
+ * could happen
+ */
+ @Test(expected = ValidationException.class)
+ public void testInvalid() throws Exception { // NOPMD
+ validator.validate(new StreamOpaqueResource(getClass().getResourceAsStream("invalid-profile.xml")));
+ }
+
+ /**
+ * Validate a profile which has an optional "any" element, possible non-standard behavior in java validator.
+ *
+ * @throws Exception could happen
+ */
+ @Test
+ public void testValidAnyOptional() throws Exception { // NOPMD
+ final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ final Schema schema = schemaFactory.newSchema(new StreamSource(getClass().getResourceAsStream("any-schema.xsd")));
+
+ when(schemaDao.getResourceSchema(anyString())).thenReturn(schema);
+
+ validator.validate(new StreamOpaqueResource(getClass().getResourceAsStream("valid-any-optional.xml")));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/schema/ResourceSchemaDAOImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/schema/ResourceSchemaDAOImplTest.java
new file mode 100644
index 0000000..a24e262
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/registry/schema/ResourceSchemaDAOImplTest.java
@@ -0,0 +1,70 @@
+package eu.dnetlib.enabling.is.registry.schema;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.when;
+
+import java.io.StringWriter;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
+import eu.dnetlib.enabling.tools.StreamOpaqueResource;
+
+/**
+ * test resource schema dao.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ResourceSchemaDAOImplTest {
+
+ /**
+ * instance under test.
+ */
+ private transient ResourceSchemaDAOImpl dao;
+
+ /**
+ * lookup service.
+ */
+ @Mock
+ private transient ISLookUpService lookupService;
+
+ /**
+ * prepare common stuff.
+ *
+ * @throws Exception
+ * shouldn't happen
+ */
+ @Before
+ public void setUp() throws Exception {
+ final StringWriter writer = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("schema.xsd"), writer);
+
+ when(lookupService.getResourceTypeSchema(anyString())).thenReturn(writer.getBuffer().toString());
+
+ dao = new ResourceSchemaDAOImpl();
+ dao.setIsLookup(lookupService);
+
+ }
+
+ /**
+ * test dao by validating a resource.
+ *
+ * @throws Exception
+ * shouldn't happen
+ */
+ @Test
+ public void testGetResourceSchema() throws Exception { // NOPMD
+ final OpaqueResourceValidatorImpl validator = new OpaqueResourceValidatorImpl();
+ validator.setSchemaDao(dao);
+
+ validator.validate(new StreamOpaqueResource(getClass().getResourceAsStream("valid-profile.xml")));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/AbstractSubscriptionRegistryTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/AbstractSubscriptionRegistryTest.java
new file mode 100644
index 0000000..5ef75c9
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/AbstractSubscriptionRegistryTest.java
@@ -0,0 +1,75 @@
+package eu.dnetlib.enabling.is.sn;
+
+import static org.junit.Assert.*; // NOPMD
+
+import java.util.Collection;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/**
+ * abstract subscription registry test.
+ *
+ * @author marko
+ *
+ */
+public class AbstractSubscriptionRegistryTest {
+
+ /**
+ * object under test.
+ */
+ private transient AbstractSubscriptionRegistry registry;
+
+ /**
+ * setup .
+ *
+ * @throws Exception
+ */
+ @Before
+ public void setUp() {
+ registry = new AbstractSubscriptionRegistry() {
+
+ @Override
+ protected Collection getAcceptedPrefixes() {
+ return Arrays.asList(new String[] { "CREATE", "DELETE", "UPDATE", "DEEP/SUB" });
+ }
+
+ };
+
+ }
+
+ /**
+ * test prefixes.
+ */
+ @Test
+ public void testMatchPrefix() {
+ final SubscriptionRequest sub = new SubscriptionRequest();
+
+ sub.setTopicExpression("CREATE/MyResourceType");
+ assertNotNull("check create", registry.matchPrefix(sub));
+
+ sub.setTopicExpression("DELETE/MyResourceType");
+ assertNotNull("check delete", registry.matchPrefix(sub));
+
+ sub.setTopicExpression("UPDATE/MyResourceType");
+ assertNotNull("check update", registry.matchPrefix(sub));
+
+ sub.setTopicExpression("VERIFY/MyResourceType");
+ assertNull("check non declared prefix", registry.matchPrefix(sub));
+
+ sub.setTopicExpression("UPDATED/MyResourceType");
+ assertNull("check non delimited prefix", registry.matchPrefix(sub));
+
+ sub.setTopicExpression("UPDATE");
+ assertNotNull("check only prefix", registry.matchPrefix(sub));
+
+ sub.setTopicExpression("DEEP/MyResourceType");
+ assertNull("check deep", registry.matchPrefix(sub));
+
+ sub.setTopicExpression("DEEP/SUB/MyResourceType");
+ assertNotNull("check deep sub", registry.matchPrefix(sub));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/MemoryNotificationInvocationLoggerTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/MemoryNotificationInvocationLoggerTest.java
new file mode 100644
index 0000000..1105a85
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/MemoryNotificationInvocationLoggerTest.java
@@ -0,0 +1,114 @@
+package eu.dnetlib.enabling.is.sn;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Queue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+import eu.dnetlib.enabling.is.sn.NotificationInvocationLogger.Entry;
+import eu.dnetlib.enabling.is.sn.NotificationInvocationLogger.Entry.Status;
+
+/**
+ * Memory notification logger test.
+ *
+ * @author marko
+ *
+ */
+public class MemoryNotificationInvocationLoggerTest {
+
+ /**
+ * some size.
+ */
+ private static final int SOME_SIZE = 300;
+
+ /**
+ * instance under test.
+ */
+ private transient MemoryNotificationInvocationLogger logger;
+
+ /**
+ * message bock.
+ */
+ @Mock
+ private transient NotificationMessage message;
+
+ /**
+ * common setup.
+ *
+ * @throws Exception
+ * happens
+ */
+ @Before
+ public void setUp() throws Exception {
+ logger = new MemoryNotificationInvocationLogger();
+ }
+
+ /**
+ * test logging and queue management.
+ */
+ @Test
+ public void testStartLogging() {
+ final Queue queue = logger.getQueue();
+
+ assertEquals("queue", 0, queue.size());
+
+ final NotificationInvocationLogger.Entry entry = logger.startLogging(null, message);
+
+ assertNotNull("got an entry", entry);
+ assertEquals("queue", 1, queue.size());
+
+ for (int i = 0; i < SOME_SIZE; i++)
+ logger.startLogging(null, message);
+ assertEquals("queue", logger.getSize(), queue.size());
+ }
+
+ /**
+ * test success.
+ */
+ @Test
+ public void testSuccess() {
+ final NotificationInvocationLogger.Entry entry = logger.startLogging(null, message);
+ entry.success();
+
+ final Queue queue = logger.getQueue();
+ final Entry entry2 = queue.remove();
+ assertEquals("success", Status.Succeeded, entry2.getStatus());
+ }
+
+ /**
+ * test failure.
+ */
+ @Test
+ public void testFailure() {
+ final NotificationInvocationLogger.Entry entry = logger.startLogging(null, message);
+ entry.failure(new IllegalStateException("dummy"));
+
+ final Queue queue = logger.getQueue();
+ final Entry entry2 = queue.remove();
+ assertEquals("failure", Status.Failed, entry2.getStatus());
+
+ assertTrue("exception", entry2.getException() instanceof IllegalStateException);
+ }
+
+ /**
+ * test ongoing.
+ */
+ @Test
+ public void testOngoing() {
+ logger.startLogging(null, message);
+
+ final Queue queue = logger.getQueue();
+ final Entry entry2 = queue.remove();
+
+ assertEquals("queued", Status.Queued, entry2.getStatus());
+ entry2.ongoing();
+ assertEquals("ongoing", Status.Ongoing, entry2.getStatus());
+ }
+
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/NotificationDetectorImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/NotificationDetectorImplTest.java
new file mode 100644
index 0000000..b211329
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/NotificationDetectorImplTest.java
@@ -0,0 +1,185 @@
+package eu.dnetlib.enabling.is.sn;
+
+import static org.junit.Assert.*; // NOPMD
+import static org.mockito.Mockito.*; // NOPMD
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscription;
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscriptionRegistry;
+import eu.dnetlib.enabling.tools.OpaqueResource;
+import org.mockito.junit.MockitoJUnitRunner;
+
+/**
+ * Test the default notification detector implementation.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class NotificationDetectorImplTest {
+
+ /**
+ * some type.
+ */
+ private static final String SOME_TYPE = "SomeType";
+
+ /**
+ * some resource identifier.
+ */
+ private static final String SOME_ID = "123";
+
+ /**
+ * Check if a message has the correct content.
+ *
+ * @author marko
+ *
+ */
+ private final class CheckMessage implements ArgumentMatcher {
+
+ /**
+ * prefix.
+ */
+ private final transient String prefix;
+
+ /**
+ * constructor.
+ *
+ * @param prefix topic prefix
+ */
+ CheckMessage(final String prefix) {
+ super();
+ this.prefix = prefix;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.mockito.ArgumentMatcher#matches(java.lang.Object)
+ */
+ @Override
+ public boolean matches(final NotificationMessage argument) {
+ return argument.getSubscriptionId() == subscription.getSubscriptionId() && argument.getResourceId().equals("123")
+ && argument.getTopic().equals(prefix + ".*.*");
+ }
+ }
+
+ /**
+ * instance under test.
+ */
+ private transient NotificationDetectorImpl detector;
+
+ /**
+ * registry mock.
+ */
+ @Mock
+ private transient ResourceStateSubscriptionRegistry registry;
+
+ /**
+ * sender mock.
+ */
+ @Mock
+ private transient NotificationSender sender;
+
+ /**
+ * resource mock.
+ */
+ @Mock
+ private transient OpaqueResource resource;
+
+ /**
+ * resource subscription.
+ */
+ @Mock
+ private transient ResourceStateSubscription subscription;
+
+ /**
+ * mock subscriber.
+ */
+ private transient W3CEndpointReference subscriber;
+
+ /**
+ * common.
+ */
+ @Before
+ public void setUp() {
+ detector = new NotificationDetectorImpl();
+
+ detector.setRegistry(registry);
+
+ detector.setSender(sender);
+
+ final W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
+ builder.address("http://test.com/test/test");
+ subscriber = builder.build();
+
+ final List subscriptions = new ArrayList();
+ subscriptions.add(subscription);
+ when(registry.listMatchingSubscriptions(ResourceStateSubscription.PREFIX_CREATE, SOME_TYPE, SOME_ID)).thenReturn(subscriptions);
+ when(registry.listMatchingSubscriptions(ResourceStateSubscription.PREFIX_DELETE, SOME_TYPE, SOME_ID)).thenReturn(subscriptions);
+ when(registry.listMatchingSubscriptions(ResourceStateSubscription.PREFIX_UPDATE, SOME_TYPE, SOME_ID)).thenReturn(subscriptions);
+
+ when(resource.getResourceId()).thenReturn(SOME_ID);
+ when(resource.getResourceType()).thenReturn(SOME_TYPE);
+
+ when(subscription.getSubscriptionId()).thenReturn("sn123");
+ when(subscription.getSubscriberAsEpr()).thenReturn(subscriber);
+ when(subscription.getXpath()).thenReturn("");
+ when(subscription.getType()).thenReturn("*");
+ when(subscription.getResourceId()).thenReturn("*");
+ }
+
+ /**
+ * test 'create'.
+ */
+ @Test
+ public void testResourceCreated() {
+ when(subscription.getPrefix()).thenReturn(ResourceStateSubscription.PREFIX_CREATE);
+
+ detector.resourceCreated(resource);
+
+ verify(sender).send(eq(subscriber), argThat(new CheckMessage(ResourceStateSubscription.PREFIX_CREATE)));
+
+ assertNotNull("dummy", sender);
+ }
+
+ /**
+ * test 'delete'.
+ */
+ @Test
+ public void testResourceDeleted() {
+ when(subscription.getPrefix()).thenReturn(ResourceStateSubscription.PREFIX_DELETE);
+
+ detector.resourceDeleted(resource);
+
+ verify(sender).send(eq(subscriber), argThat(new CheckMessage(ResourceStateSubscription.PREFIX_DELETE)));
+
+ assertNotNull("dummy", sender);
+ }
+
+ /**
+ * test 'update'.
+ */
+ @Test
+ public void testResourceUpdated() {
+ when(subscription.getXpath()).thenReturn(null);
+ when(subscription.getPrefix()).thenReturn(ResourceStateSubscription.PREFIX_UPDATE);
+
+ detector.resourceUpdated(resource, resource);
+
+ verify(sender).send(eq(subscriber), argThat(new CheckMessage(ResourceStateSubscription.PREFIX_UPDATE)));
+
+ assertNotNull("dummy", sender);
+
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/NotificationTriggerImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/NotificationTriggerImplTest.java
new file mode 100644
index 0000000..22b682e
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/NotificationTriggerImplTest.java
@@ -0,0 +1,159 @@
+package eu.dnetlib.enabling.is.sn;
+
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Mockito.verify;
+
+import java.io.IOException;
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateNotificationDetector;
+import eu.dnetlib.enabling.tools.OpaqueResource;
+
+/**
+ * Test NotificationTriggerImpl, a simple forwarder.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class NotificationTriggerImplTest {
+
+ /**
+ * Check that the resource has the expected properties.
+ *
+ * @author marko
+ *
+ */
+ private static final class MatchResource implements ArgumentMatcher {
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.mockito.ArgumentMatcher#matches(java.lang.Object)
+ */
+ @Override
+ public boolean matches(final OpaqueResource argument) {
+ return argument.getResourceId().equals("123") && argument.getResourceType().equals("type") && argument.getResourceKind().equals("kind");
+ }
+ }
+
+ /**
+ * test old document version.
+ */
+ private static final String OLD_DOC = "old ";
+
+ /**
+ * test old document version.
+ */
+ private static final String NEW_DOC = "new ";
+
+ /**
+ * class under test.
+ */
+ private transient NotificationTriggerImpl trigger;
+
+ /**
+ * detector mock.
+ */
+ @Mock
+ private transient ResourceStateNotificationDetector detector;
+
+ /**
+ * common preparation.
+ *
+ */
+ @Before
+ public void setUp() {
+ trigger = new NotificationTriggerImpl();
+ trigger.setName("test trigger");
+ trigger.setDetector(detector);
+ }
+
+ /**
+ * test created.
+ *
+ * @throws IOException
+ * never
+ * @throws SAXException
+ * never
+ * @throws ParserConfigurationException
+ * never
+ */
+
+ @Test
+ public void testCreated() throws ParserConfigurationException, SAXException, IOException {
+ trigger.created("someFile", "someCollection", parse(NEW_DOC));
+ verify(detector).resourceCreated(argThat(new MatchResource()));
+
+ assertNotNull("dummy", detector);
+ }
+
+ /**
+ * test deleted.
+ *
+ * @throws IOException
+ * never
+ * @throws SAXException
+ * never
+ * @throws ParserConfigurationException
+ * never
+ */
+ @Test
+ public void testDeleted() throws ParserConfigurationException, SAXException, IOException {
+ trigger.deleted("someFile", "someCollection", parse(OLD_DOC));
+ verify(detector).resourceDeleted(argThat(new MatchResource()));
+
+ assertNotNull("dummy", detector);
+ }
+
+ /**
+ * test updated.
+ *
+ * @throws IOException
+ * never
+ * @throws SAXException
+ * never
+ * @throws ParserConfigurationException
+ * never
+ */
+ @Test
+ public void testUpdated() throws ParserConfigurationException, SAXException, IOException {
+ trigger.updated("someFile", "someCollection", parse(OLD_DOC), parse(NEW_DOC));
+ verify(detector).resourceUpdated(argThat(new MatchResource()), argThat(new MatchResource()));
+
+ assertNotNull("dummy", detector);
+ }
+
+ /**
+ * helper method.
+ *
+ * @param source
+ * xml source
+ * @return DOM object
+ * @throws ParserConfigurationException
+ * shouldn't happen
+ * @throws SAXException
+ * shouldn't happen
+ * @throws IOException
+ * shouldn't happen
+ */
+ private Document parse(final String source) throws ParserConfigurationException, SAXException, IOException {
+ final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ return builder.parse(new InputSource(new StringReader(source)));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateSubscriptionDAOImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateSubscriptionDAOImplTest.java
new file mode 100644
index 0000000..1ba0e74
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateSubscriptionDAOImplTest.java
@@ -0,0 +1,263 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collection;
+
+import org.apache.commons.beanutils.BeanComparator;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * testing MemoryResourceStateSubscriptionDAOImpl.
+ *
+ * @author marko
+ *
+ */
+public abstract class AbstractResourceStateSubscriptionDAOImplTest {
+
+ /**
+ * update topic prefix.
+ */
+ private static final String UPDATE = "UPDATE";
+
+ /**
+ * create topic prefix.
+ */
+ private static final String CREATE = "CREATE";
+
+ /**
+ * test resource type.
+ */
+ private static final String SOME_TYPE = "someType";
+
+ /**
+ * test other resource type.
+ */
+ private static final String SOME_OTHER_TYPE = "someOtherType";
+
+ /**
+ * test resource id.
+ */
+ private static final String SOME_ID = "123";
+
+ /**
+ * class under test.
+ */
+ private ResourceStateSubscriptionDAO dao;
+
+ /**
+ * test subscription.
+ */
+ private transient ResourceStateSubscription sub;
+
+ /**
+ * test subscription.
+ */
+ private transient ResourceStateSubscription sub2;
+
+ /**
+ * test subscription.
+ */
+ private transient ResourceStateSubscription sub3;
+
+ /**
+ * test subscription.
+ */
+ private transient ResourceStateSubscription sub4;
+
+ /**
+ * test subscription.
+ */
+ private transient ResourceStateSubscription sub5;
+
+ /**
+ * common setup.
+ */
+ @Before
+ public void setUp() {
+ prepareDao();
+
+ sub = new ResourceStateSubscription();
+ sub.setSubscriptionId("sn123");
+ sub.setPrefix(CREATE);
+ sub.setType(SOME_TYPE);
+ sub.setXpath("somePath");
+
+ sub2 = new ResourceStateSubscription();
+ sub2.setSubscriptionId("sn666");
+ sub2.setPrefix(UPDATE);
+ sub2.setType(SOME_TYPE);
+ sub2.setXpath("somePath");
+
+ sub3 = new ResourceStateSubscription();
+ sub3.setSubscriptionId("sn000");
+ sub3.setPrefix(CREATE);
+ sub3.setType(SOME_TYPE);
+ sub3.setXpath("somePath");
+
+ sub4 = new ResourceStateSubscription();
+ sub4.setSubscriptionId("sn987");
+ sub4.setPrefix(CREATE);
+ sub4.setType("*");
+ sub4.setResourceId(SOME_ID);
+
+ sub5 = new ResourceStateSubscription();
+ sub5.setSubscriptionId("sn888");
+ sub5.setPrefix(UPDATE);
+ sub5.setType(SOME_TYPE);
+ sub5.setResourceId(SOME_ID);
+ }
+
+ /**
+ * subsclasses should implement this in order to plug their implementation of the dao.
+ */
+ protected abstract void prepareDao();
+
+ /**
+ * compare two subscriptions.
+ *
+ * @param left
+ * lhs
+ * @param right
+ * rhs
+ * @return true if the objects are equal
+ */
+ protected boolean compare(final ResourceStateSubscription left, final ResourceStateSubscription right) {
+ return new BeanComparator("subscriptionId").compare(left, right) == 0 && new BeanComparator("prefix").compare(left, right) == 0
+ && new BeanComparator("type").compare(left, right) == 0 && new BeanComparator("resourceId").compare(left, right) == 0;
+ }
+
+ /**
+ * test list subscriptions for prefix and type.
+ */
+ @Test
+ public void testListSubscriptionsStringString() {
+ dao.addSubscription(sub);
+ dao.addSubscription(sub2);
+ dao.addSubscription(sub3);
+ dao.addSubscription(sub4);
+
+ for (ResourceStateSubscription s : dao.listSubscriptions(UPDATE, SOME_TYPE, SOME_ID))
+ assertTrue("check subscription", compare(s, sub2));
+
+ assertEquals("check size", 2, dao.listSubscriptions(CREATE, SOME_TYPE, "*").size());
+
+ for (ResourceStateSubscription s : dao.listSubscriptions(CREATE, "*", SOME_ID))
+ assertTrue("check subscription star", compare(s, sub4));
+
+ assertEquals("check size star", 1, dao.listSubscriptions(CREATE, "*", SOME_ID).size());
+ }
+
+ /**
+ * enable this test when the manual merging of subscriptions is removed from the ResourceStateSubscriptionRegistry.
+ * The ResourceState subscription DAO alone should be able to quickly resolve wildcards.
+ */
+ @Test
+ @Ignore
+ public void testListSubscriptionsStar() {
+ dao.addSubscription(sub);
+ dao.addSubscription(sub2);
+ dao.addSubscription(sub3);
+ dao.addSubscription(sub4);
+
+ for (ResourceStateSubscription s : dao.listSubscriptions(CREATE, SOME_OTHER_TYPE, SOME_ID)) {
+ assertTrue("check subscription fixed star", compare(s, sub4));
+ }
+
+ assertEquals("check size fixed tar", 1, dao.listSubscriptions(CREATE, SOME_OTHER_TYPE, SOME_ID).size());
+
+ }
+
+ /**
+ * test get a specific subscription by id.
+ */
+ @Test
+ public void testGetSubscription() {
+
+ dao.addSubscription(sub);
+
+ assertNotNull("check that it's registered", dao.getSubscription(sub.getSubscriptionId()));
+ }
+
+ /**
+ * test list all subscriptions.
+ */
+ @Test
+ public void testListSubscriptions() {
+ dao.addSubscription(sub);
+ for (ResourceStateSubscription s : dao.listSubscriptions())
+ assertTrue("check subscription", compare(s, sub));
+
+ assertEquals("check size", 1, dao.listSubscriptions().size());
+ }
+
+ /**
+ * test specific subscription.
+ */
+ @Test
+ public void testSpecificSubscription() {
+ dao.addSubscription(sub5);
+
+ final Collection res = dao.listSubscriptions(UPDATE, SOME_TYPE, SOME_ID);
+ assertEquals("only one", 1, res.size());
+
+ assertNotNull("", res.iterator().next());
+ }
+
+ /**
+ * test list subscriptions for a given prefix.
+ */
+ @Test
+ public void testListSubscriptionsString() {
+ dao.addSubscription(sub);
+ dao.addSubscription(sub2);
+
+ for (ResourceStateSubscription s : dao.listSubscriptions(UPDATE))
+ assertTrue("check subscription", compare(s, sub2));
+ }
+
+ public ResourceStateSubscriptionDAO getDao() {
+ return dao;
+ }
+
+ public void setDao(final ResourceStateSubscriptionDAO dao) {
+ this.dao = dao;
+ }
+
+ public ResourceStateSubscription getSub() {
+ return sub;
+ }
+
+ public void setSub(final ResourceStateSubscription sub) {
+ this.sub = sub;
+ }
+
+ public ResourceStateSubscription getSub2() {
+ return sub2;
+ }
+
+ public void setSub2(final ResourceStateSubscription sub2) {
+ this.sub2 = sub2;
+ }
+
+ public ResourceStateSubscription getSub3() {
+ return sub3;
+ }
+
+ public void setSub3(final ResourceStateSubscription sub3) {
+ this.sub3 = sub3;
+ }
+
+ public ResourceStateSubscription getSub4() {
+ return sub4;
+ }
+
+ public void setSub4(final ResourceStateSubscription sub4) {
+ this.sub4 = sub4;
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateSubscriptionRegistryTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateSubscriptionRegistryTest.java
new file mode 100644
index 0000000..3fb2933
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/AbstractResourceStateSubscriptionRegistryTest.java
@@ -0,0 +1,165 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Collection;
+
+import eu.dnetlib.test.utils.EPRTestUtil;
+import org.junit.Before;
+import org.junit.Test;
+
+import eu.dnetlib.enabling.is.sn.SubscriptionRequest;
+import eu.dnetlib.enabling.is.sn.rmi.SubscriptionRequestRejectedException;
+
+/**
+ * Common tests for resource state subscription registry tests.
+ *
+ * @author marko
+ *
+ */
+public abstract class AbstractResourceStateSubscriptionRegistryTest {
+
+ /**
+ * star.
+ */
+ private static final String STAR = "*";
+
+ /**
+ * create topic prefix.
+ */
+ private static final String CREATE = "CREATE";
+
+ /**
+ * test resource type.
+ */
+ private static final String SOME_TYPE = "someType";
+
+ /**
+ * test other resource type.
+ */
+ private static final String SOME_OTHER_TYPE = "someOtherType";
+
+ /**
+ * test resource id.
+ */
+ private static final String SOME_ID = "sub123";
+
+ /**
+ * instance under test.
+ */
+ private ResourceStateSubscriptionRegistry registry;
+
+ /**
+ * test subscritpion request.
+ */
+ private transient SubscriptionRequest sub;
+
+ /**
+ * setup registry. subclasses should set the dao.
+ */
+ @Before
+ public void setUpRegistry() {
+ registry = new ResourceStateSubscriptionRegistry();
+
+ final SubscriptionRequestFilter filter = new SubscriptionRequestFilter();
+ filter.setActive(true);
+ registry.setSubscriptionRequestFilter(filter);
+
+ setUpDao();
+
+ sub = new SubscriptionRequest(SOME_ID, EPRTestUtil.getTestEpr(), "CREATE/*/*/someXpath", 0);
+ }
+
+ /**
+ * test subscription registration.
+ *
+ * @throws SubscriptionRequestRejectedException
+ */
+ @Test
+ public void testRegisterSubscription() throws SubscriptionRequestRejectedException {
+ registry.registerSubscription(sub);
+
+ final Collection res = registry.listMatchingSubscriptions(CREATE, STAR, STAR);
+ for (final ResourceStateSubscription r : res) {
+ assertEquals("check add subscription", SOME_ID, r.getSubscriptionId());
+ }
+
+ assertEquals("check that is really added", 1, res.size());
+ }
+
+ /**
+ * test match.
+ *
+ * @throws SubscriptionRequestRejectedException
+ */
+ @Test
+ public void testMatch() throws SubscriptionRequestRejectedException {
+ registry.registerSubscription(sub);
+
+ ResourceStateSubscription re1 = null; // NOPMD
+ ResourceStateSubscription re2 = null; // NOPMD
+
+ final Collection res = registry.listMatchingSubscriptions(CREATE, SOME_TYPE, STAR);
+ for (final ResourceStateSubscription r : res) {
+ re1 = r; // NOPMD
+ assertEquals("check match subscription", SOME_ID, r.getSubscriptionId());
+ }
+
+ assertEquals("check that only one matched", 1, res.size());
+
+ final Collection res2 = registry.listMatchingSubscriptions(CREATE, SOME_OTHER_TYPE, STAR);
+ for (final ResourceStateSubscription r : res2) {
+ re2 = r; // NOPMD
+ assertEquals("check match subscription", SOME_ID, r.getSubscriptionId());
+ }
+
+ assertEquals("check that only one matched", 1, res2.size());
+ assertEquals("check that the same subscription is returned", re1, re2);
+ }
+
+ /**
+ * multiple subscriptions should be registered only once.
+ *
+ * @throws SubscriptionRequestRejectedException
+ */
+ @Test
+ public void testMultiple() throws SubscriptionRequestRejectedException {
+ final String subId = registry.registerSubscription(sub);
+ final String subId2 = registry.registerSubscription(sub);
+
+ assertEquals("avoid duplicates", subId, subId2);
+ }
+
+ /**
+ * test unsubscribe.
+ *
+ * @throws SubscriptionRequestRejectedException
+ */
+ @Test
+ public void testUnsubscribe() throws SubscriptionRequestRejectedException {
+ final String subId = registry.registerSubscription(sub);
+ final boolean res = registry.unsubscribe(subId);
+
+ assertTrue("unsubscribed", res);
+
+ final boolean res2 = registry.unsubscribe(subId);
+
+ assertFalse("not unsubscribed", res2);
+ }
+
+ /**
+ * subclasses should implement this with a specific instance of the dao.
+ */
+ protected abstract void setUpDao();
+
+ public ResourceStateSubscriptionRegistry getRegistry() {
+ return registry;
+ }
+
+ public void setRegistry(final ResourceStateSubscriptionRegistry registry) {
+ this.registry = registry;
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionDAOImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionDAOImplTest.java
new file mode 100644
index 0000000..aac0925
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionDAOImplTest.java
@@ -0,0 +1,51 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+/**
+ * Concrete resourcestate subscription dao test for memory backed subscription store.
+ *
+ * @author marko
+ *
+ */
+public class MemoryResourceStateSubscriptionDAOImplTest extends AbstractResourceStateSubscriptionDAOImplTest {
+
+ /**
+ * instance under test (of the specific type).
+ */
+ private transient MemoryResourceStateSubscriptionDAOImpl memdao;
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.AbstractResourceStateSubscriptionDAOImplTest#prepareDao()
+ */
+ @Override
+ protected void prepareDao() {
+ memdao = new MemoryResourceStateSubscriptionDAOImpl();
+ setDao(memdao);
+ }
+
+ /**
+ * test add subscription.
+ */
+ @Test
+ public void testAddSubscription() {
+ assertNull("not registered", getDao().getSubscription(getSub().getSubscriptionId()));
+
+ getDao().addSubscription(getSub());
+ assertEquals("check that sub is registered", getSub(), memdao.getById().get(getSub().getSubscriptionId()));
+
+ getDao().addSubscription(getSub2());
+ assertEquals("check that sub2 is registered", getSub2(), memdao.getById().get(getSub2().getSubscriptionId()));
+
+ getDao().addSubscription(getSub3());
+ assertEquals("check that sub4 is registered", getSub3(), memdao.getById().get(getSub3().getSubscriptionId()));
+
+ getDao().addSubscription(getSub4());
+ assertEquals("check that sub4is registered", getSub4(), memdao.getById().get(getSub4().getSubscriptionId()));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionRegistryTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionRegistryTest.java
new file mode 100644
index 0000000..1900532
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/MemoryResourceStateSubscriptionRegistryTest.java
@@ -0,0 +1,22 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+
+/**
+ * Perform ResourceStateSubscriptionRegistryTest tests on a memory backed resource state subscription dao instance.
+ *
+ * @author marko
+ *
+ */
+public class MemoryResourceStateSubscriptionRegistryTest extends AbstractResourceStateSubscriptionRegistryTest { // NOPMD
+
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.AbstractResourceStateSubscriptionRegistryTest#setUpDao()
+ */
+ @Override
+ protected void setUpDao() {
+ getRegistry().setSubscriptionDao(new MemoryResourceStateSubscriptionDAOImpl());
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionRegistryTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionRegistryTest.java
new file mode 100644
index 0000000..3352174
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/ResourceStateSubscriptionRegistryTest.java
@@ -0,0 +1,179 @@
+package eu.dnetlib.enabling.is.sn.resourcestate;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull; // NOPMD
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Mockito.verify; // NOPMD
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import eu.dnetlib.enabling.is.sn.SubscriptionRequest;
+import eu.dnetlib.enabling.is.sn.rmi.SubscriptionRequestRejectedException;
+
+/**
+ * test ResourceStateSubscriptionRegistryTest.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ResourceStateSubscriptionRegistryTest {
+
+ /**
+ * matches.
+ *
+ * @author marko
+ *
+ */
+ public static class MatchSubscription implements ArgumentMatcher {
+
+ /**
+ * prefix.
+ */
+ private final transient String prefix;
+
+ /**
+ * type.
+ */
+ private final transient String type;
+
+ /**
+ * resource id.
+ */
+ private final transient String resId;
+
+ /**
+ * create a new match subscription checker for a given prefix and a given type.
+ *
+ * @param prefix
+ * prefix
+ * @param type
+ * type
+ * @param resId
+ * resource id
+ */
+ MatchSubscription(final String prefix, final String type, final String resId) {
+ super();
+ this.prefix = prefix;
+ this.type = type;
+ this.resId = resId;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.mockito.ArgumentMatcher#matches(java.lang.Object)
+ */
+ @Override
+ public boolean matches(final ResourceStateSubscription sub) {
+ return sub.getPrefix().equals(this.prefix) && sub.getType().equals(this.type) && sub.getResourceId().equals(this.resId);
+ }
+
+ }
+
+ /**
+ * object under test.
+ */
+ private transient ResourceStateSubscriptionRegistry registry;
+
+ /**
+ * DAO mock.
+ */
+ @Mock
+ private transient ResourceStateSubscriptionDAO subscriptionDao;
+
+ /**
+ * subscription request.
+ */
+ private transient SubscriptionRequest sub;
+
+ /**
+ * common setup.
+ */
+ @Before
+ public void setUp() {
+ registry = new ResourceStateSubscriptionRegistry();
+ registry.setSubscriptionDao(subscriptionDao);
+
+ final SubscriptionRequestFilter filter = new SubscriptionRequestFilter();
+ filter.setActive(true);
+ registry.setSubscriptionRequestFilter(filter);
+
+ sub = new SubscriptionRequest();
+ }
+
+ /**
+ * test registration.
+ *
+ * @throws SubscriptionRequestRejectedException
+ */
+ @Test
+ public void testRegisterSubscription() throws SubscriptionRequestRejectedException {
+ sub.setTopicExpression("CREATE/MyResourceType/123/some/path");
+ registry.registerSubscription(sub);
+ verify(subscriptionDao).addSubscription(argThat(new MatchSubscription("CREATE", "MyResourceType", "123")));
+
+ assertNotNull("dummy", subscriptionDao);
+ }
+
+ /**
+ * test registration.
+ *
+ * @throws SubscriptionRequestRejectedException
+ */
+ @Test(expected = SubscriptionRequestRejectedException.class)
+ public void testRegisterSubscriptionReject1() throws SubscriptionRequestRejectedException {
+
+ sub.setTopicExpression("UPDATE/OtherResourceType");
+ registry.registerSubscription(sub);
+ verify(subscriptionDao).addSubscription(argThat(new MatchSubscription("UPDATE", "OtherResourceType", "*")));
+
+ assertNotNull("dummy", subscriptionDao);
+ }
+
+ /**
+ * test registration.
+ *
+ * @throws SubscriptionRequestRejectedException
+ */
+ @Test(expected = SubscriptionRequestRejectedException.class)
+ public void testRegisterSubscriptionReject2() throws SubscriptionRequestRejectedException {
+
+ sub.setTopicExpression("DELETE/*");
+ registry.registerSubscription(sub);
+ verify(subscriptionDao).addSubscription(argThat(new MatchSubscription("DELETE", "*", "*")));
+
+ assertNotNull("dummy", subscriptionDao);
+ }
+
+ /**
+ * test registration.
+ *
+ * @throws SubscriptionRequestRejectedException
+ */
+ @Test(expected = SubscriptionRequestRejectedException.class)
+ public void testRegisterSubscriptionReject3() throws SubscriptionRequestRejectedException {
+
+ sub.setTopicExpression("CREATE");
+ registry.registerSubscription(sub);
+ verify(subscriptionDao).addSubscription(argThat(new MatchSubscription("CREATE", "*", "*")));
+
+ assertNotNull("dummy", subscriptionDao);
+ }
+
+ /**
+ * test match id.
+ */
+ @Test
+ public void testMatchId() {
+ assertEquals("check pure id", "1234123", registry.matchId("1234123").getPrefix());
+ assertEquals("check with suffix", "1234123", registry.matchId("1234123/blabla/blabla").getPrefix());
+ assertEquals("check suffix", "/blabla/blabla", registry.matchId("1234123/blabla/blabla").getRest());
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImplTest.java
new file mode 100644
index 0000000..d998623
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImplTest.java
@@ -0,0 +1,106 @@
+package eu.dnetlib.enabling.is.sn.resourcestate.hib;
+
+import java.util.Collection;
+import javax.annotation.Resource;
+
+import eu.dnetlib.enabling.is.sn.resourcestate.AbstractResourceStateSubscriptionDAOImplTest;
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscription;
+import eu.dnetlib.test.utils.EPRTestUtil;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.junit.Assert.*;
+
+/**
+ * test HibernateResourceStateSubscriptionDAOImplTest.
+ *
+ * @author marko
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class HibernateResourceStateSubscriptionDAOImplTest extends AbstractResourceStateSubscriptionDAOImplTest {
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(HibernateResourceStateSubscriptionDAOImplTest.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * instance under test.
+ */
+ @Resource
+ private transient HibernateResourceStateSubscriptionDAOImpl hibdao;
+
+ /**
+ * cleanup db.
+ */
+ @After
+ public void tearDown() {
+ final Collection subs = hibdao.listSubscriptions();
+ if (subs != null) {
+ subs.forEach(r -> hibdao.removeSubscription(r.getSubscriptionId()));
+ }
+ }
+
+ /**
+ * test addition.
+ */
+ @Test
+ public void testAddSubscription() {
+ assertNotNull("check dao", getDao());
+
+ getDao().addSubscription(getSub());
+
+ log.info("sub id: " + getSub().getSubscriptionId());
+ }
+
+ /**
+ * test encoding of endpoint references.
+ */
+ @Test
+ @DirtiesContext
+ public void testEndpoint() {
+ getSub().setSubscriber(EPRTestUtil.getTestEpr());
+
+ getDao().addSubscription(getSub());
+
+ final ResourceStateSubscription fresh = getDao().getSubscription(getSub().getSubscriptionId());
+
+ assertNotNull("check", fresh);
+ assertTrue("equals", compare(getSub(), fresh));
+
+ assertNotNull("epr", getSub().getSubscriber());
+ assertNotNull("fetched epr", fresh.getSubscriber());
+
+ assertEquals("eprs", getSub().getSubscriber().toString(), fresh.getSubscriber().toString());
+ }
+
+ /**
+ * multiple subscriptions should not be allowed.
+ */
+ @Test(expected = DataIntegrityViolationException.class)
+ @DirtiesContext
+ public void testMultiple() { // NOPMD
+ getDao().addSubscription(getSub());
+ getDao().addSubscription(getSub());
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.AbstractResourceStateSubscriptionDAOImplTest#prepareDao()
+ */
+ @Override
+ protected void prepareDao() {
+ setDao(hibdao);
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionRegistryTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionRegistryTest.java
new file mode 100644
index 0000000..e44b296
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionRegistryTest.java
@@ -0,0 +1,53 @@
+package eu.dnetlib.enabling.is.sn.resourcestate.hib;
+
+import java.util.Collection;
+
+import javax.annotation.Resource;
+
+import org.junit.After;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import eu.dnetlib.enabling.is.sn.resourcestate.AbstractResourceStateSubscriptionRegistryTest;
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscription;
+import eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscriptionDAO;
+
+/**
+ * Perform ResourceStateSubscriptionRegistryTest tests on a hibernate backed resource state subscription dao instance.
+ *
+ * @author marko
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "HibernateResourceStateSubscriptionDAOImplTest-context.xml" })
+public class HibernateResourceStateSubscriptionRegistryTest extends AbstractResourceStateSubscriptionRegistryTest { // NOPMD
+
+ /**
+ * hibernate subscription dao.
+ */
+ @Resource
+ private transient ResourceStateSubscriptionDAO dao;
+
+ /**
+ * cleanup db. hsql doesn't recreate the database on spring context reload.
+ */
+ @After
+ public void tearDown() {
+ final Collection subs = dao.listSubscriptions();
+ if (subs != null)
+ for (ResourceStateSubscription r : subs)
+ dao.removeSubscription(r.getSubscriptionId());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see eu.dnetlib.enabling.is.sn.resourcestate.AbstractResourceStateSubscriptionRegistryTest#setUpDao()
+ */
+ @Override
+ protected void setUpDao() {
+ getRegistry().setSubscriptionDao(dao);
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/store/ISStoreServiceImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/store/ISStoreServiceImplTest.java
new file mode 100644
index 0000000..1908d87
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/store/ISStoreServiceImplTest.java
@@ -0,0 +1,70 @@
+package eu.dnetlib.enabling.is.store; // NOPMD
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.xmldb.api.base.XMLDBException;
+
+import eu.dnetlib.enabling.is.store.rmi.ISStoreException;
+import eu.dnetlib.xml.database.XMLDatabase;
+
+/**
+ * test the ISStore service.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ISStoreServiceImplTest {
+
+ /**
+ * instance under test.
+ */
+ private transient ISStoreServiceImpl storeService;
+
+ /**
+ * xml database mock.
+ */
+ @Mock
+ private transient XMLDatabase xmlDatabase;
+
+ /**
+ * setup class under test.
+ */
+ @Before
+ public void setUp() {
+ storeService = new ISStoreServiceImpl();
+ storeService.setXmlDatabase(xmlDatabase);
+ }
+
+ /**
+ * test that quick search profile returns null instead of an empty list.
+ *
+ * @throws XMLDBException shouldn't happen
+ * @throws ISStoreException shouldn't happen
+ */
+ @Test
+ public void testQuickSearchXML() throws XMLDBException, ISStoreException {
+ final Iterator rset = mock(Iterator.class);
+ when(rset.hasNext()).thenReturn(true, false);
+ when(xmlDatabase.xquery(anyString())).thenReturn(rset);
+
+ final List res = storeService.quickSearchXML("someQuery");
+
+ assertNotNull("empty result not null", res);
+ assertFalse("empty result is empty", res.isEmpty());
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/store/ISStoreServiceTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/store/ISStoreServiceTest.java
new file mode 100644
index 0000000..f31a5e2
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/is/store/ISStoreServiceTest.java
@@ -0,0 +1,266 @@
+package eu.dnetlib.enabling.is.store; // NOPMD
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import eu.dnetlib.enabling.is.store.rmi.ISStoreException;
+import eu.dnetlib.enabling.is.store.rmi.ISStoreService;
+import eu.dnetlib.xml.database.XMLDatabase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.xmldb.api.base.XMLDBException;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * test the ISStore service.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ISStoreServiceTest { // NOPMD by marko on 11/24/08 4:54 PM
+
+ /**
+ * root collection name for mocked xmldb.
+ */
+ private static final String ROOT_COLLECTION = "/db";
+ /**
+ * test resultset id.
+ */
+ private static final String SOME_RS_ID = "someRsId";
+ /**
+ * some test query.
+ */
+ private static final String SOME_QUERY = "someQuery";
+ /**
+ * a test collection name.
+ */
+ private static final String TEST_COLLECTION = "testCollection";
+ /**
+ * a test string value.
+ */
+ private static final String ONE = "one";
+ /**
+ * another test resultset value.
+ */
+ private static final String TWO = "two";
+ /**
+ * name of the a test file.
+ */
+ private static final String TEST_FILE = "testFile";
+
+ /**
+ * the ISStoreService under test.
+ */
+ private transient ISStoreService store = null;
+ /**
+ * the ISStoreService under test. Used only in setUp/tearDown().
+ */
+ private transient ISStoreServiceImpl ismo = null;
+ /**
+ * the XMLDatabase injected into the ISStore.
+ */
+ @Mock
+ private transient XMLDatabase xdb;
+
+ /**
+ * setup the ISStore instance, injecting all the dependencies.
+ *
+ * @throws Exception
+ * shouldn't throw
+ */
+ @Before
+ public void setUp() throws Exception {
+ ismo = new ISStoreServiceImpl();
+
+ ismo.setXmlDatabase(xdb);
+ ismo.start();
+
+ store = ismo;
+ }
+
+ /**
+ * respect the service lifecycle.
+ */
+ @After
+ public void tearDown() {
+ ismo.stop();
+ }
+
+ /**
+ * create collection.
+ *
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testCreateFileColl() throws ISStoreException, XMLDBException {
+ assertTrue("create collection", store.createFileColl(TEST_COLLECTION));
+ verify(xdb).createCollection(TEST_COLLECTION);
+ }
+
+ /**
+ * delete collection.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ */
+ @Test
+ public void testDeleteFileColl() throws XMLDBException, ISStoreException {
+ assertTrue("delete collection", store.deleteFileColl(TEST_COLLECTION));
+ verify(xdb).removeCollection(TEST_COLLECTION);
+ }
+
+ /**
+ * delete an xml file.
+ *
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testDeleteXML() throws ISStoreException, XMLDBException {
+ when(xdb.remove(TEST_FILE, TEST_COLLECTION)).thenReturn(true);
+
+ assertTrue("delete xml", store.deleteXML(TEST_FILE, TEST_COLLECTION));
+ verify(xdb).remove(TEST_FILE, TEST_COLLECTION);
+ }
+
+ /**
+ * execute an XUpdate.
+ */
+ // @Test
+ // public void testExecuteXUpdate() {
+ // fail(NYI);
+ // }
+ /**
+ * get collection names.
+ *
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testGetFileColls() throws ISStoreException, XMLDBException {
+ final String[] expectedNames = new String[] { "col1", "col2" };
+
+ when(xdb.getRootCollection()).thenReturn(ROOT_COLLECTION);
+ when(xdb.listChildCollections(ROOT_COLLECTION)).thenReturn(Arrays.asList(expectedNames));
+
+ final List names = store.getFileColls();
+ verify(xdb).getRootCollection();
+ assertArrayEquals(expectedNames, names.toArray());
+ }
+
+ /**
+ * list file names.
+ *
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testGetFileNames() throws ISStoreException, XMLDBException {
+ final String[] expectedNames = new String[] { "fil1", "file2", "file3" };
+
+ when(xdb.list(ROOT_COLLECTION)).thenReturn(Arrays.asList(expectedNames));
+
+ final List names = store.getFileNames(ROOT_COLLECTION);
+ assertArrayEquals(expectedNames, names.toArray());
+ }
+
+ /**
+ * read an xml file.
+ *
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testGetXML() throws ISStoreException, XMLDBException {
+ when(xdb.read(TEST_FILE, TEST_COLLECTION)).thenReturn("testContent");
+ final String res = store.getXML(TEST_FILE, TEST_COLLECTION);
+ assertEquals("get xml", "testContent", res);
+ }
+
+ /**
+ * read an xml file using a xquery.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ * @throws ISStoreException
+ * shouldn't happen
+ */
+ @Test
+ public void testGetXMLbyQuery() throws XMLDBException, ISStoreException {
+ prepareXMLDBResultSet();
+
+ final String res = store.getXMLbyQuery(SOME_QUERY);
+ assertEquals("get xml by query", ONE, res);
+ }
+
+ /**
+ * helper method. Prepares a common result mock.
+ *
+ * @throws XMLDBException
+ * the declaration of this exception is just a syntactic necessity
+ */
+ private void prepareXMLDBResultSet() throws XMLDBException {
+ List myList = Arrays.asList(ONE,TWO);
+ when(xdb.xquery(SOME_QUERY)).thenReturn(myList.iterator());
+ }
+
+ /**
+ * insert a new xml file.
+ *
+ * @throws ISStoreException
+ * shouldn't happen
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testInsertXML() throws ISStoreException, XMLDBException {
+ assertTrue("insert xml", store.insertXML("example", ROOT_COLLECTION, " "));
+ verify(xdb).create("example", ROOT_COLLECTION, " ");
+ }
+
+ /**
+ * test quick search xml.
+ *
+ * @throws ISStoreException
+ * happens
+ * @throws XMLDBException
+ * happens
+ */
+ @Test
+ public void testQuickSearchXML() throws ISStoreException, XMLDBException {
+ final List ans = new ArrayList();
+ ans.add(ONE);
+ ans.add(TWO);
+
+ prepareXMLDBResultSet();
+
+ final ArrayList res = (ArrayList) store.quickSearchXML(SOME_QUERY);
+ assertNotNull("query returned", res);
+ assertEquals("correct size", 2, res.size());
+ assertEquals("first value", ONE, res.get(0));
+ assertEquals("second value", TWO, res.get(1));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/CompatResourceIdentifierResolverImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/CompatResourceIdentifierResolverImplTest.java
new file mode 100644
index 0000000..5bbc6c7
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/CompatResourceIdentifierResolverImplTest.java
@@ -0,0 +1,51 @@
+package eu.dnetlib.enabling.tools;
+
+import static org.junit.Assert.*; // NOPMD
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * test the CompatResourceIdentifierResolverImpl.
+ *
+ * @author marko
+ *
+ */
+public class CompatResourceIdentifierResolverImplTest {
+
+ /**
+ * test resource identifier.
+ *
+ */
+ private static final String TEST_RES_ID = "first_c2Vjb25k";
+
+ /**
+ * instance under test.
+ */
+ private transient CompatResourceIdentifierResolverImpl resIdResolver;
+
+ /**
+ * prepare the instance under test.
+ */
+ @Before
+ public void setUp() {
+ resIdResolver = new CompatResourceIdentifierResolverImpl();
+ }
+
+ /**
+ * test get collection name.
+ */
+ @Test
+ public void testGetCollectionName() {
+ assertEquals("check collection name", "second", resIdResolver.getCollectionName(TEST_RES_ID));
+ }
+
+ /**
+ * test get file name.
+ */
+ @Test
+ public void testGetFileName() {
+ assertEquals("check file name", "first", resIdResolver.getFileName(TEST_RES_ID));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/DOMOpaqueResourceTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/DOMOpaqueResourceTest.java
new file mode 100644
index 0000000..80be331
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/DOMOpaqueResourceTest.java
@@ -0,0 +1,122 @@
+package eu.dnetlib.enabling.tools;
+
+import static org.junit.Assert.*; // NOPMD
+import static org.mockito.Mockito.*; // NOPMD
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+
+/**
+ * Test DOM opaque resource.
+ *
+ * @author marko
+ *
+ */
+public class DOMOpaqueResourceTest {
+
+ /**
+ * instance under test.
+ */
+ private transient DOMOpaqueResource resource;
+
+ /**
+ * xml source, read from test-profile.xml.
+ */
+ private transient String xmlSource;
+
+ /**
+ * common preparation.
+ *
+ * @throws ParserConfigurationException
+ * shouldn't happen
+ * @throws IOException
+ * shouldn't happen
+ * @throws SAXException
+ * shouldn't happen
+ * @throws XPathExpressionException
+ * shouldn't happen
+ */
+ @Before
+ public void setUp() throws SAXException, IOException, ParserConfigurationException, XPathExpressionException {
+ final StringWriter writer = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("test-profile.xml"), writer);
+ xmlSource = writer.getBuffer().toString();
+ final Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xmlSource)));
+ resource = new DOMOpaqueResource(document);
+ }
+
+ /**
+ * test dom.
+ */
+ @Test
+ public void testAsDom() {
+ assertEquals("check that dom is not recreated", resource.getDom(), resource.asDom());
+ }
+
+ /**
+ * serialization check.
+ *
+ * TODO: use xmlunit
+ */
+ @Test
+ public void testAsString() {
+ assertEquals("check xml serialization", xmlSource, resource.asString());
+ }
+
+ /**
+ * test with exception in transformer.
+ * @throws TransformerException expected
+ */
+ @Test
+ public void testAsStringException() throws TransformerException {
+ final Transformer transformer = mock(Transformer.class);
+ doThrow(new TransformerException("dummy")).when(transformer).transform((Source) anyObject(), (Result) anyObject());
+
+ resource.setTransformer(transformer);
+ assertNull("checks that upon exception we get a null string", resource.asString());
+ }
+
+ /**
+ * check resource id extraction.
+ */
+ @Test
+ public void testGetResourceId() {
+ assertEquals("check resource id",
+ "111-6b4ea417-d940-4dda-a194-3096f685789b_UmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU=", resource
+ .getResourceId());
+ }
+
+ /**
+ * check resource type extraction.
+ */
+ @Test
+ public void testGetResourceType() {
+ assertEquals("check resource type", "RepositoryServiceResourceType", resource.getResourceType());
+ }
+
+ /**
+ * check resource kind extraction.
+ */
+ @Test
+ public void testGetResourceKind() {
+ assertEquals("check resource kind", "RepositoryServiceResources", resource.getResourceKind());
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/JaxwsServiceResolverImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/JaxwsServiceResolverImplTest.java
new file mode 100644
index 0000000..778434b
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/JaxwsServiceResolverImplTest.java
@@ -0,0 +1,122 @@
+package eu.dnetlib.enabling.tools;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock; // NOPMD
+import static org.mockito.Mockito.when;
+
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.cxf.BusFactory;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
+import eu.dnetlib.enabling.resultset.rmi.ResultSetService;
+import eu.dnetlib.soap.cxf.CxfEndpointReferenceBuilder;
+import eu.dnetlib.soap.cxf.JaxwsEndpointReferenceBuilder;
+
+/**
+ * jaxws service resolution.
+ *
+ * @author marko
+ *
+ */
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = "local-cxf.xml")
+public class JaxwsServiceResolverImplTest {
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(JaxwsServiceResolverImplTest.class); // NOPMD by marko on
+ // 11/24/08 5:02 PM
+
+ /**
+ * instance under test.
+ */
+ private transient JaxwsServiceResolverImpl resolver;
+
+ /**
+ * epr builder.
+ */
+ private transient JaxwsEndpointReferenceBuilder eprBuilder;
+
+ /**
+ * resultset mock.
+ */
+ private transient ResultSetService resultSetService;
+
+ /**
+ * cleanup cxf. This test requires the local transport (declared in local-cxf.xml), but other tests may have already instantiated the
+ * cxf bus singleton.
+ */
+ @BeforeClass
+ public static void resetCxf() {
+ BusFactory.getDefaultBus().shutdown(true);
+ }
+
+ /**
+ * common.
+ */
+ @Before
+ public void setUp() {
+ resolver = new JaxwsServiceResolverImpl();
+ eprBuilder = new JaxwsEndpointReferenceBuilder();
+ eprBuilder.setBuilder(new CxfEndpointReferenceBuilder());
+
+ resultSetService = mock(ResultSetService.class);
+ }
+
+ /**
+ * get service.
+ *
+ * @throws ResultSetException
+ * shoudn't happen
+ */
+ @Test
+ public void testGetService() throws ResultSetException {
+ final String rsId = "1235";
+
+ when(resultSetService.identify()).thenReturn("foo");
+ when(resultSetService.getNumberOfElements(rsId)).thenReturn(2);
+
+ final Endpoint endpoint = Endpoint.publish("local://test", resultSetService);
+
+ assertNotNull("check endpoint", endpoint);
+
+ final W3CEndpointReference epr = eprBuilder.getEndpointReference(endpoint, rsId);
+
+ epr.writeTo(new StreamResult(System.out));
+
+ final ResultSetService rset = resolver.getService(ResultSetService.class, epr);
+
+ assertNotNull("check resultset", rset);
+
+ log.info(rset.getClass());
+ log.info(rset);
+
+ // NOTE: call to identify and getNumberOfElements fail because it seems that the methods are not
+ // in the wsdl. This error may be related with the use of mockito and
+ // method inheritance of services because there is no such error with
+ // non-mocked result set service methods.
+ // rset.identify();
+
+ // assertEquals("check resultset communication", "foo",
+ // rset.identify());
+
+ assertEquals("check resolver resource id", rsId, resolver.getResourceIdentifier(epr));
+
+ // assertEquals("check resultset communication with param", 2,
+ // rset.getNumberOfElements(resolver.getResourceIdentifier(epr)));
+ }
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/blackboard/BlackboardMessageImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/blackboard/BlackboardMessageImplTest.java
new file mode 100644
index 0000000..b11b6e4
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/blackboard/BlackboardMessageImplTest.java
@@ -0,0 +1,62 @@
+package eu.dnetlib.enabling.tools.blackboard;
+
+
+import static org.junit.Assert.assertEquals;
+
+import javax.xml.bind.JAXBException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Test;
+
+import eu.dnetlib.miscutils.jaxb.JaxbFactory;
+
+/**
+ * Jaxb Blackboard message implementation test.
+ *
+ * @author marko
+ *
+ */
+public class BlackboardMessageImplTest {
+
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(BlackboardMessageImplTest.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * test message (de)serialization.
+ *
+ * @throws JAXBException could happen
+ */
+ @Test
+ public void testMessage() throws JAXBException {
+ final JaxbFactory factory = new JaxbFactory(BlackboardMessageImpl.class);
+
+ final BlackboardMessage message = factory.newInstance();
+ message.setAction("FEED");
+ message.setActionStatus(ActionStatus.ONGOING);
+ message.setId("12");
+ message.setDate("5123");
+
+ final BlackboardParameter param1 = new BlackboardParameterImpl();
+ param1.setName("someName");
+ param1.setValue("someValue");
+ message.getParameters().add(param1);
+
+ final BlackboardParameter param2 = new BlackboardParameterImpl();
+ param2.setName("otherName");
+ param2.setValue("otherValue");
+ message.getParameters().add(param2);
+
+ final String serialized = factory.serialize(message);
+ log.info(serialized);
+
+ final BlackboardMessage res = factory.parse(serialized);
+ log.info(res.getParameters());
+
+ assertEquals("list serialization", 2, res.getParameters().size());
+ assertEquals("enum serialization", ActionStatus.ONGOING, res.getActionStatus());
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/InterfaceServiceNameGeneratorTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/InterfaceServiceNameGeneratorTest.java
new file mode 100644
index 0000000..a92bee5
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/InterfaceServiceNameGeneratorTest.java
@@ -0,0 +1,84 @@
+package eu.dnetlib.enabling.tools.registration;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import eu.dnetlib.enabling.is.registry.ISRegistryServiceImpl;
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
+
+/**
+ * test heuristic service name generator.
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class InterfaceServiceNameGeneratorTest {
+
+ /**
+ * instance under test.
+ */
+ private transient ServiceNameResolver generator = new InterfaceServiceNameResolver();
+
+ /**
+ * simulates the extension of the service interface.
+ *
+ * @author marko
+ *
+ */
+ interface SomeDummyInterface extends ISRegistryService {
+ }
+
+ /**
+ * simulates the implementation of the service interface.
+ * @author marko
+ *
+ */
+ abstract class AbstractDummyService implements SomeDummyInterface {
+ }
+
+ /**
+ * simulates the subclassing of the service implementation class.
+ *
+ * @author marko
+ *
+ */
+ abstract class AbstractDummyServiceImpl extends AbstractDummyService {
+ }
+
+ /**
+ * service mock.
+ */
+ @Mock
+ private transient AbstractDummyServiceImpl service;
+
+ /**
+ * setup.
+ */
+ @Before
+ public void setUp() {
+ generator = new InterfaceServiceNameResolver();
+ }
+
+ /**
+ * test getName().
+ */
+ @Test
+ public void testGetName() {
+ assertEquals("check service name", "ISRegistryService", generator.getName(service));
+ }
+
+ /**
+ * test getName() on real classes.
+ */
+ @Test
+ public void testGetNameReal() {
+ assertEquals("check service name", "ISRegistryService", generator.getName(new ISRegistryServiceImpl()));
+ }
+
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/InterfaceServiceNameResolverCompatibilityTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/InterfaceServiceNameResolverCompatibilityTest.java
new file mode 100644
index 0000000..6f24327
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/InterfaceServiceNameResolverCompatibilityTest.java
@@ -0,0 +1,56 @@
+package eu.dnetlib.enabling.tools.registration;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import eu.dnetlib.enabling.is.store.ISStoreServiceImpl;
+
+/**
+ * compatibility interface service name tester.
+ * @author marko
+ *
+ */
+public class InterfaceServiceNameResolverCompatibilityTest {
+
+ /**
+ * instance under test.
+ */
+ private transient InterfaceServiceNameResolverCompatibility resolver;
+
+ /**
+ * setup.
+ */
+ @Before
+ public void setUp() {
+ resolver = new InterfaceServiceNameResolverCompatibility();
+
+ }
+
+ /**
+ * test mapping without override.
+ */
+ @Test
+ public void testGetName() {
+ assertEquals("check without override", "ISStoreService", resolver.getName(new ISStoreServiceImpl()));
+ }
+
+ /**
+ * test mapping override.
+ */
+ @Test
+ public void testGetNameWithOverride() {
+ final Map mapping = new HashMap();
+ mapping.put("ISStoreService", "IS_StoreService");
+ resolver.setMapping(mapping);
+
+ assertEquals("check is store service name", "IS_StoreService", resolver.getName(new ISStoreServiceImpl()));
+ }
+
+
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ServiceRegistrationManagerImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ServiceRegistrationManagerImplTest.java
new file mode 100644
index 0000000..86d4490
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ServiceRegistrationManagerImplTest.java
@@ -0,0 +1,93 @@
+package eu.dnetlib.enabling.tools.registration;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.when;
+
+import javax.xml.ws.Endpoint;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import eu.dnetlib.enabling.is.lookup.ISLookUpServiceImpl;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
+import eu.dnetlib.enabling.locators.UniqueServiceLocator;
+
+/**
+ * test ServiceRegistrationManagerImpl.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ServiceRegistrationManagerImplTest {
+
+ /**
+ * fake profile.
+ */
+ private static final String PROFILE = " ";
+
+ /**
+ * instance under test.
+ */
+ private transient ServiceRegistrationManagerImpl manager;
+
+ /**
+ * registrator mock.
+ */
+ @Mock
+ private transient ServiceRegistrator registrator;
+
+ /**
+ * is lookup mock.
+ */
+ @Mock
+ private transient ISLookUpService lookUpService;
+ @Mock
+ private UniqueServiceLocator serviceLocator;
+
+ /**
+ * prepare.
+ *
+ * @throws ISLookUpException
+ * cannot happen
+ */
+ @Before
+ public void setUp() throws ISLookUpException {
+ manager = new ServiceRegistrationManagerImpl();
+ manager.setServiceLocator(serviceLocator);
+ manager.setRegistrator(registrator);
+ manager.setService(new ISLookUpServiceImpl());
+
+ when(serviceLocator.getService(ISLookUpService.class)).thenReturn(lookUpService);
+ when(serviceLocator.getService(ISLookUpService.class, true)).thenReturn(lookUpService);
+ when(lookUpService.getResourceProfile("123")).thenReturn(PROFILE);
+ when(lookUpService.getResourceProfileByQuery(anyString())).thenReturn(PROFILE);
+ }
+
+ /**
+ * test state machine.
+ */
+ @Test
+ @Ignore
+ public void testTick() {
+ when(registrator.registerService(anyObject(), (Endpoint) anyObject())).thenReturn("123");
+
+ assertEquals("check unregistered state", ServiceRegistrationManagerImpl.State.UNREGISTERED, manager.getState());
+ manager.tick();
+ assertEquals("check pending state", ServiceRegistrationManagerImpl.State.PENDING, manager.getState());
+ assertEquals("ensure that the mock is correct", "PendingServiceResources", manager.getServiceProfile().getResourceKind());
+ manager.tick();
+ assertEquals("should remain pending", ServiceRegistrationManagerImpl.State.PENDING, manager.getState());
+
+ manager.tick();
+ assertEquals("should remain pending forever", ServiceRegistrationManagerImpl.State.PENDING, manager.getState());
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ServiceRegistratorTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ServiceRegistratorTest.java
new file mode 100644
index 0000000..1d2875e
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ServiceRegistratorTest.java
@@ -0,0 +1,148 @@
+package eu.dnetlib.enabling.tools.registration;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+
+import javax.xml.namespace.QName;
+
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.endpoint.ServerImpl;
+import org.apache.cxf.jaxws.EndpointImpl;
+import org.apache.cxf.service.Service;
+import org.apache.cxf.service.model.EndpointInfo;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
+import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
+import eu.dnetlib.enabling.locators.UniqueServiceLocator;
+import eu.dnetlib.enabling.tools.HNMLocator;
+import eu.dnetlib.soap.cxf.CxfEndpointReferenceBuilder;
+import eu.dnetlib.soap.cxf.JaxwsEndpointReferenceBuilder;
+
+/**
+ * ServiceRegistrator test.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ServiceRegistratorTest {
+ /**
+ * instance under test.
+ */
+ private transient ServiceRegistrator registrator;
+
+ /**
+ * service mock.
+ */
+ @Mock
+ private transient Service service;
+
+ /**
+ * endpoint info mock.
+ */
+ @Mock
+ private transient EndpointInfo endpointInfo;
+
+ /**
+ * endpoint mock.
+ */
+ @Mock
+ private transient Endpoint endpoint;
+
+ /**
+ * registry service mock.
+ */
+ @Mock
+ private transient ISRegistryService registryService;
+
+ /**
+ * isLookup service mock.
+ */
+ @Mock
+ private transient ISLookUpService isLookUpService;
+
+ /**
+ * jaxws endpoint mock.
+ */
+ @Mock
+ private transient EndpointImpl jaxwsEndpoint;
+
+ /**
+ * cxf server mock.
+ */
+ @Mock
+ private transient ServerImpl server;
+
+ /**
+ * hnm locator mock.
+ */
+ @Mock
+ private transient HNMLocator hnmLocator;
+ @Mock
+ private UniqueServiceLocator serviceLocator;
+
+ /**
+ * setup common stuff.
+ *
+ */
+ @Before
+ public void disabled() throws ISLookUpException {
+ final String service = "TestService";
+ when(this.service.getName()).thenReturn(new QName("http://my.test", service));
+
+ when(endpoint.getEndpointInfo()).thenReturn(endpointInfo);
+ when(endpoint.getService()).thenReturn(this.service);
+ when(endpointInfo.getAddress()).thenReturn("http://localhost/something");
+ when(endpointInfo.getName()).thenReturn(new QName("http://my.test", "TestServiceEndpoint"));
+
+ when(jaxwsEndpoint.getServer()).thenReturn(server);
+ when(server.getEndpoint()).thenReturn(endpoint);
+
+ when(hnmLocator.getHNMForUrl("http://localhost/something")).thenReturn("555444");
+
+ // serviceLocator.getService(ISLookUpService.class).getResourceTypeSchema(serviceName);
+
+ when(isLookUpService.getResourceTypeSchema(service)).thenThrow(ISLookUpDocumentNotFoundException.class);
+
+ when(serviceLocator.getService(ISLookUpService.class)).thenReturn(isLookUpService);
+ when(serviceLocator.getService(ISRegistryService.class, true)).thenReturn(registryService);
+
+
+ registrator = new ServiceRegistrator();
+ registrator.setServiceLocator(serviceLocator);
+
+ final CxfEndpointReferenceBuilder cxfEprBuilder = new CxfEndpointReferenceBuilder();
+
+ final JaxwsEndpointReferenceBuilder eprBuilder = new JaxwsEndpointReferenceBuilder();
+ eprBuilder.setBuilder(cxfEprBuilder);
+
+ registrator.setEprBuilder(eprBuilder);
+ registrator.setHnmLocator(hnmLocator);
+ }
+
+ /**
+ * test register service.
+ * @throws ISRegistryException shouldn't happen
+ */
+ @Test
+ //@Ignore
+ public void testRegisterService() throws ISRegistryException {
+ when(registryService.insertProfileForValidation(eq("TestServiceResourceType"), anyString())).thenReturn("123");
+
+ final String rsId = registrator.registerService("TestService", jaxwsEndpoint);
+ assertEquals("registered", "123", rsId);
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ValidatingServiceRegistrationManagerImplTest.java b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ValidatingServiceRegistrationManagerImplTest.java
new file mode 100644
index 0000000..6c4f88a
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/enabling/tools/registration/ValidatingServiceRegistrationManagerImplTest.java
@@ -0,0 +1,121 @@
+package eu.dnetlib.enabling.tools.registration;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.*; // NOPMD
+
+import javax.xml.ws.Endpoint;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import eu.dnetlib.enabling.is.lookup.ISLookUpServiceImpl;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
+import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
+import eu.dnetlib.enabling.locators.UniqueServiceLocator;
+
+/**
+ * test ValidatingServiceRegistrationManagerImpl.
+ *
+ * @author marko
+ *
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class ValidatingServiceRegistrationManagerImplTest {
+
+ /**
+ * profile id.
+ */
+ private static final String PROF_ID = "123";
+
+ /**
+ * validated profile id.
+ */
+ private static final String VPROF_ID = "V123";
+
+ /**
+ * fake profile.
+ */
+ private static final String PROFILE = " ";
+
+ /**
+ * fake profile.
+ */
+ private static final String VPROFILE = " ";
+
+ /**
+ * instance under test.
+ */
+ private transient ServiceRegistrationManagerImpl manager;
+
+ /**
+ * registrator mock.
+ */
+ @Mock
+ private transient ServiceRegistrator registrator;
+
+ /**
+ * is lookup mock.
+ */
+ @Mock
+ private transient ISLookUpService lookUpService;
+
+ @Mock
+ private UniqueServiceLocator serviceLocator;
+
+ /**
+ * prepare.
+ *
+ * @throws ISLookUpException
+ * cannot happen
+ */
+ @Before
+ public void setUp() throws ISLookUpException {
+ manager = new ValidatingServiceRegistrationManagerImpl();
+
+ manager.setServiceLocator(serviceLocator);
+ manager.setRegistrator(registrator);
+ manager.setService(new ISLookUpServiceImpl());
+
+ when(lookUpService.getResourceProfile(PROF_ID)).thenReturn(PROFILE);
+ when(lookUpService.getResourceProfile(VPROF_ID)).thenReturn(VPROFILE);
+ when(lookUpService.getResourceProfileByQuery(anyString())).thenReturn(PROFILE);
+ when(registrator.validateProfile(eq(PROF_ID), any(Endpoint.class))).thenReturn(VPROF_ID);
+ when(serviceLocator.getService(ISLookUpService.class)).thenReturn(lookUpService);
+ when(serviceLocator.getService(ISLookUpService.class, true)).thenReturn(lookUpService);
+ }
+
+ /**
+ * test state machine.
+ *
+ * @throws ISLookUpException
+ * cannot happen
+ */
+ @Test
+ @Ignore
+ public void testTick() throws ISLookUpException {
+ when(registrator.registerService(anyObject(), (Endpoint) anyObject())).thenReturn(PROF_ID);
+
+ assertEquals("check unregistered state", ServiceRegistrationManagerImpl.State.UNKNOWN, manager.getState());
+ manager.tick();
+ assertEquals("check pending state", ServiceRegistrationManagerImpl.State.PENDING, manager.getState());
+ assertEquals("ensure that the mock is correct", "PendingServiceResources", manager.getServiceProfile().getResourceKind());
+ manager.tick();
+
+ assertEquals("should register directly", ServiceRegistrationManagerImpl.State.REGISTERED, manager.getState());
+
+ verify(registrator).validateProfile(eq(PROF_ID), (Endpoint) anyObject());
+
+ assertEquals("check validation id", VPROF_ID, manager.getProfileId());
+ assertEquals("check validation profile", VPROF_ID, manager.getServiceProfile().getResourceId());
+
+ manager.tick();
+ assertEquals("should remain registered", ServiceRegistrationManagerImpl.State.REGISTERED, manager.getState());
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/test/SpringContextSharer.java b/dnet-information-service/src/test/java/eu/dnetlib/test/SpringContextSharer.java
new file mode 100644
index 0000000..41748cb
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/test/SpringContextSharer.java
@@ -0,0 +1,42 @@
+package eu.dnetlib.test;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+/**
+ * integration tests may need to access the container application context, for example in order
+ * directly interact with components or access shared resources like the CXF bus.
+ *
+ * This bean should be instantiated in the container context.
+ *
+ * @author marko
+ *
+ */
+public class SpringContextSharer implements ApplicationContextAware {
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(SpringContextSharer.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * global application context.
+ */
+ private static ApplicationContext globalContext;
+
+ /**
+ * {@inheritDoc}
+ * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
+ */
+ @Override
+ public void setApplicationContext(final ApplicationContext context) {
+ log.debug("registering global application context");
+ globalContext = context;
+ }
+
+ public static ApplicationContext getGlobalContext() {
+ return globalContext;
+ }
+
+}
diff --git a/dnet-core-components/src/test/java/eu/dnetlib/test/utils/EPRTestUtil.java b/dnet-information-service/src/test/java/eu/dnetlib/test/utils/EPRTestUtil.java
similarity index 100%
rename from dnet-core-components/src/test/java/eu/dnetlib/test/utils/EPRTestUtil.java
rename to dnet-information-service/src/test/java/eu/dnetlib/test/utils/EPRTestUtil.java
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/test/utils/MockBeanFactory.java b/dnet-information-service/src/test/java/eu/dnetlib/test/utils/MockBeanFactory.java
new file mode 100644
index 0000000..77e8f8c
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/test/utils/MockBeanFactory.java
@@ -0,0 +1,55 @@
+package eu.dnetlib.test.utils;
+
+
+import org.springframework.beans.factory.FactoryBean;
+
+import static org.mockito.Mockito.mock;
+
+/**
+ * Return a mockito mock for a given class.
+ * This class should be updated according to new Spring4 factory Bean
+ *
+ * @author marko
+ *
+ */
+@Deprecated
+public class MockBeanFactory implements FactoryBean {
+
+ /**
+ * class to mock.
+ */
+ private Class> clazz;
+
+ /**
+ * {@inheritDoc}
+ * @see FactoryBean#getObject()
+ */
+ public Object getObject() throws Exception {
+ return mock(clazz);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see FactoryBean#getObjectType()
+ */
+ public Class> getObjectType() {
+ return clazz;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see FactoryBean#isSingleton()
+ */
+ public boolean isSingleton() {
+ return true;
+ }
+
+ public Class> getClazz() {
+ return clazz;
+ }
+
+ public void setClazz(final Class> clazz) {
+ this.clazz = clazz;
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/DOMConverterTestTrigger.java b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/DOMConverterTestTrigger.java
new file mode 100644
index 0000000..2b87d4a
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/DOMConverterTestTrigger.java
@@ -0,0 +1,83 @@
+package eu.dnetlib.xml.database.exist;
+
+import org.exist.collections.triggers.SAXTrigger;
+import org.exist.collections.triggers.TriggerException;
+import org.exist.dom.persistent.DocumentImpl;
+import org.exist.storage.DBBroker;
+import org.exist.storage.txn.Txn;
+import org.exist.xmldb.XmldbURI;
+
+/**
+ * helper class for the ExistDOMConverterTest.
+ *
+ * An instance of this class is instantiated by eXist and all new registered xml documents
+ * should trigger the invocation of the triggerCreate method
+ *
+ * @author marko
+ *
+ */
+public class DOMConverterTestTrigger extends SAXTrigger {
+
+
+
+
+ @Override
+ public void beforeCreateDocument(final DBBroker dbBroker, final Txn txn, final XmldbURI xmldbURI) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void afterCreateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void beforeUpdateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void afterUpdateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void beforeUpdateDocumentMetadata(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void afterUpdateDocumentMetadata(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void beforeCopyDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void afterCopyDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void beforeMoveDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void afterMoveDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void beforeDeleteDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+
+ @Override
+ public void afterDeleteDocument(final DBBroker dbBroker, final Txn txn, final XmldbURI xmldbURI) throws TriggerException {
+ ExistDOMConverterTest.setTriggered(true);
+ }
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/ExistDOMConverterTest.java b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/ExistDOMConverterTest.java
new file mode 100644
index 0000000..2cebebc
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/ExistDOMConverterTest.java
@@ -0,0 +1,141 @@
+package eu.dnetlib.xml.database.exist;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Arrays;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+import org.xmldb.api.base.XMLDBException;
+
+/**
+ * test exist dom converter.
+ *
+ * @author marko
+ *
+ */
+public class ExistDOMConverterTest {
+
+ /**
+ * logger.
+ */
+ static final Log log = LogFactory.getLog(ExistDOMConverterTest.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+ /**
+ * test collection.
+ */
+ private static final String DB_TEST = "/db/collection";
+
+ /**
+ * check that the document is not truncated.
+ */
+ private static final int MIN_LENGTH = 80;
+
+ /**
+ * instance under test.
+ */
+ private transient ExistDOMConverter converter;
+
+ /**
+ * eXist database instance.
+ */
+ private transient ExistDatabase edb;
+
+ /**
+ * true when the eXist trigger is called.
+ */
+ private static boolean triggered;
+
+ /**
+ * setup common stuff.
+ */
+ @Before
+ public void setUp() {
+ converter = new ExistDOMConverter();
+
+ edb = new TemporaryExistDatabase();
+ edb.start();
+
+ triggered = false;
+ }
+
+ /**
+ * check that the ExistDOMConverter works well with plain DOMs.
+ *
+ * @throws ParserConfigurationException shouldn't happen
+ * @throws SAXException shouldn't happen
+ * @throws IOException shouldn't happen
+ */
+ @Test
+ public void testAsString() throws ParserConfigurationException, SAXException, IOException {
+ final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ final Document doc = builder.parse(getClass().getResourceAsStream("userProfileResourceSchema.xsd"));
+
+ assertNotNull("dom", doc);
+
+ assertTrue("length", converter.asString(doc).length() > MIN_LENGTH);
+ }
+
+ /**
+ * test without comments in preable.
+ *
+ * @throws XMLDBException shouldn't happen
+ * @throws IOException shouldn't happen
+ */
+ @Test
+ public void testFromExist() throws XMLDBException, IOException {
+ edb.setExistTrigger(DOMConverterTestTrigger.class, DB_TEST, Arrays.asList("store", "update", "delete"), null);
+
+ final StringWriter schema = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("userProfileResourceSchemaClean.xsd"), schema);
+ edb.create("test", DB_TEST, schema.toString());
+
+ final String res = edb.read("test", DB_TEST);
+ assertNotNull("check read", res);
+
+ assertTrue("check that trigger is executed", triggered);
+
+ }
+
+ /**
+ * test comments in preable.
+ *
+ * @throws XMLDBException shouldn't happen
+ * @throws IOException shouldn't happen
+ */
+ @Test
+ public void testFromExistCommented() throws XMLDBException, IOException {
+ edb.setExistTrigger(DOMConverterTestTrigger.class, DB_TEST, Arrays.asList( "store", "update", "delete"), null);
+
+ final StringWriter schema = new StringWriter();
+ IOUtils.copy(getClass().getResourceAsStream("userProfileResourceSchema.xsd"), schema);
+ edb.create("testCommented", DB_TEST, schema.toString());
+
+ final String res = edb.read("testCommented", DB_TEST);
+ assertNotNull("check read", res);
+
+ assertTrue("check that trigger is executed", triggered);
+ //assertFalse("check that trigger is executed", triggered);
+ }
+
+ public static boolean isTriggered() {
+ return triggered;
+ }
+
+ public static void setTriggered(final boolean triggered) {
+ ExistDOMConverterTest.triggered = triggered;
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/ExistDatabaseTest.java b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/ExistDatabaseTest.java
new file mode 100644
index 0000000..dc47a86
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/ExistDatabaseTest.java
@@ -0,0 +1,715 @@
+package eu.dnetlib.xml.database.exist;
+
+import java.io.IOException;
+import java.util.*;
+
+import eu.dnetlib.xml.database.XMLDatabase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.xmldb.api.base.XMLDBException;
+
+import static org.junit.Assert.*;
+
+/**
+ * Test the exist wrapper.
+ *
+ * @author marko
+ *
+ */
+public class ExistDatabaseTest { // NOPMD by marko on 11/24/08 5:01 PM
+ /**
+ * number of values in stress test profile.
+ */
+ private static final int STRESS_VALUES = 100;
+
+ /**
+ * number of times the values are repeated in the stress test.
+ */
+ private static final int STRESS_PROF_LEN = 100;
+
+ /**
+ * number of profile writes in stress test.
+ */
+ private static final int STRESS_TIMES = 2000000;
+
+ /**
+ * number of collections for stress test.
+ */
+ private static final int STRESS_COLLS = 40;
+
+ /**
+ * number of profiles in stress test.
+ */
+ private static final int STRESS_PROFILES = 1000;
+
+ /**
+ * parallel tuning.
+ */
+ private static final int VALUE_SCATTER = 7;
+
+ /**
+ * parallel tuning.
+ */
+ private static final int QUERY_SCATTER = 5;
+
+ /**
+ * test trigger name.
+ */
+ private static final String TEST_TRIGGER = "testTrigger";
+
+ /**
+ * number of collections for parallel test.
+ */
+ private static final int PAR_COLLS = 20;
+
+ /**
+ * iterations per thread.
+ */
+ private static final int PAR_ITERATIONS = 100;
+
+ /**
+ * parallel job executions.
+ */
+ private static final int PAR_TIMES = 100;
+
+ /**
+ * logger.
+ */
+ public static final Log log = LogFactory.getLog(ExistDatabaseTest.class); // NOPMD by marko on 11/24/08 5:01 PM
+
+ /**
+ * test xml string.
+ */
+ private static final String HELLO_XML = " ";
+
+ /**
+ * test xml content.
+ */
+ private static final String HELLO_XML_CONTENT = "content ";
+
+ /**
+ * test file name.
+ */
+ private static final String EXAMPLE = "example";
+
+ /**
+ * trigger test file name.
+ */
+ private static final String TRIGGER_TEST_FILE = "shouldTrigger";
+
+ /**
+ * root collection prefix.
+ */
+ private static final String DB_ROOT = "/db";
+
+ /**
+ * test collection name.
+ */
+ private static final String DB_TEST = "/db/testCollection";
+
+ /**
+ * test other collection name.
+ */
+ private static final String DB_OTHER = "/db/otherCollection";
+
+ /**
+ * test sub collection.
+ */
+ private static final String DB_SUB = DB_TEST + "/sub";
+
+ /**
+ * xml database under test.
+ */
+ private transient XMLDatabase database;
+
+ /**
+ * eXist database under test, viewed only in setUp and tearDown.
+ */
+ private transient ExistDatabase edb;
+
+ /**
+ * prepares the database.
+ *
+ * @throws Exception
+ * exist error
+ */
+ @Before
+ public void setUp() throws Exception {
+ edb = new TemporaryExistDatabase();
+ edb.start();
+ database = edb;
+ }
+
+ /**
+ * shuts down the database.
+ *
+ * @throws IOException
+ * happens
+ */
+ @After
+ public void tearDown() throws IOException {
+ if (edb != null)
+ edb.stop();
+ }
+
+ /**
+ * test create.
+ *
+ * @throws XMLDBException
+ * happens
+ */
+ @Test
+ public void create() throws XMLDBException {
+ database.create(EXAMPLE, DB_ROOT, HELLO_XML);
+ assertEquals("database resource created", true, true);
+ }
+
+ /**
+ * correct behavior is to throw exception on empty file name, because otherwise the file is invisible but the data
+ * is inserted in the xml db.
+ *
+ * @throws XMLDBException
+ * expected
+ */
+ @Test(expected = XMLDBException.class)
+ public void createEmptyName() throws XMLDBException {
+ database.create("", DB_ROOT, " ");
+
+ // code to repeat the bug, shouldn't be executed because of the expected exception
+ final Iterator res = database.xquery("collection('')/shouldnt_exist");
+
+ assertTrue("shouldn't exist, but it exists", res.hasNext());
+ log.info(database.list(DB_ROOT));
+ assertEquals("file should be listed, with empty file name", 1, database.list(DB_ROOT).size());
+ assertEquals("file should be listed, with empty file name", "", database.list(DB_ROOT).get(0));
+
+ assertEquals("the file can be retrieved", " ", database.read("", DB_ROOT));
+ }
+
+ /**
+ * test read.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void read() throws XMLDBException {
+ create();
+ final String res = database.read(EXAMPLE, DB_ROOT);
+ assertEquals("simple reading", HELLO_XML, res);
+ }
+
+ /**
+ * test read of non existing file.
+ *
+ * @throws XMLDBException
+ * shouldn't throw exception
+ */
+ @Test
+ public void readError() throws XMLDBException {
+ final String res = database.read("nonExisting", DB_ROOT);
+ assertEquals("expecting null on unexisting", null, res);
+ }
+
+ /**
+ * test remove.
+ *
+ * @throws XMLDBException
+ * shouldn't throw exception
+ */
+ @Test
+ public void remove() throws XMLDBException {
+ database.create(EXAMPLE, DB_ROOT, HELLO_XML);
+ String res = database.read(EXAMPLE, DB_ROOT);
+ assertEquals("reading", HELLO_XML, res);
+
+ database.remove(EXAMPLE, DB_ROOT);
+ res = database.read(EXAMPLE, DB_ROOT);
+ assertEquals("now it doesn't exist", null, res);
+ }
+
+ /**
+ * delete unexisting file.
+ *
+ * @throws XMLDBException
+ * could happen
+ */
+ @Test
+ public void doubleDelete() throws XMLDBException {
+ database.create(EXAMPLE, DB_ROOT, HELLO_XML);
+ String res = database.read(EXAMPLE, DB_ROOT);
+ assertEquals("reading", HELLO_XML, res);
+
+ database.remove(EXAMPLE, DB_ROOT);
+ res = database.read(EXAMPLE, DB_ROOT);
+ assertEquals("now it doesn't exist", null, res);
+
+ assertFalse("already exists", database.remove(EXAMPLE, DB_ROOT));
+ }
+
+ /**
+ * update an xml file.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void update() throws XMLDBException {
+ database.create(EXAMPLE, DB_ROOT, HELLO_XML);
+ String res = database.read(EXAMPLE, DB_ROOT);
+ assertEquals("reading", HELLO_XML, res);
+
+ database.update(EXAMPLE, DB_ROOT, " ");
+ res = database.read(EXAMPLE, DB_ROOT);
+ assertEquals("now it doesn't exist", " ", res);
+ }
+
+ /**
+ * update an unexisting file.
+ *
+ * @throws XMLDBException
+ * expected
+ */
+ @Test(expected = XMLDBException.class)
+ public void updateError() throws XMLDBException {
+ database.create(EXAMPLE, DB_ROOT, HELLO_XML);
+ database.remove(EXAMPLE, DB_ROOT);
+ final String res = database.read(EXAMPLE, DB_ROOT);
+ assertEquals("check non existing", null, res);
+
+ database.update(EXAMPLE, DB_ROOT, " "); // throws
+ }
+
+ /**
+ * test xquery.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test()
+ public void query() throws XMLDBException {
+ database.create(EXAMPLE, DB_ROOT, " ");
+ final Iterator res = database.xquery("collection('/db')//queryTest/one");
+ assertTrue("finds only one result", res.hasNext());
+
+ final Iterator res2 = database.xquery("collection('/db')//queryTest/two");
+ assertTrue("finds only one result",res2.hasNext());
+ assertEquals("check the correct result", " ", res2.next());
+ }
+
+ /**
+ * create a collection.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test()
+ public void createCollection() throws XMLDBException {
+ database.createCollection(DB_TEST);
+ database.create(EXAMPLE, DB_TEST, " ");
+
+ final String res = database.read(EXAMPLE, DB_TEST);
+ assertEquals("check another collection", " ", res);
+ }
+
+ /**
+ * check the existence of a collection.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test()
+ public void checkCollection() throws XMLDBException {
+ createCollection();
+
+ assertTrue("check root", database.collectionExists(DB_ROOT));
+ assertTrue("check test collection", database.collectionExists(DB_TEST));
+ assertFalse("check non existing", database.collectionExists("/db/testNonExistingCollection"));
+ }
+
+ /**
+ * shows that a spurious collection create is legal.
+ *
+ * @throws XMLDBException
+ * shouldn't throw
+ */
+ @Test()
+ public void createCollectionDuplicate() throws XMLDBException {
+ database.createCollection(DB_TEST);
+ database.createCollection(DB_TEST);
+ }
+
+ /**
+ * remove a collection.
+ *
+ * @throws XMLDBException
+ * shouldn't throw
+ */
+ @Test()
+ public void removeCollection() throws XMLDBException {
+ database.createCollection(DB_TEST);
+ assertTrue("check before remove", database.collectionExists(DB_TEST));
+ database.removeCollection(DB_TEST);
+ assertFalse("check after remove", database.collectionExists(DB_TEST));
+ }
+
+ /**
+ * check useless contract with spring.
+ */
+ @Test
+ public void testIsRunning() {
+ assertFalse("contract with spring", edb.isRunning());
+ }
+
+ /**
+ * Test a scenario where exist fails to create a database.
+ *
+ * @throws IOException
+ * happens
+ * @throws XMLDBException
+ * happens
+ */
+ @Test(expected = IllegalStateException.class)
+ public void checkWrongConfigFile() throws IOException, XMLDBException {
+ edb.stop();
+ edb = new ExistDatabase();
+ try {
+ edb.setConfigFile("/tmp/unexistingfile");
+ edb.start();
+ database = edb;
+
+ create();
+ } finally {
+ edb = null; // NOPMD - just for junit
+ }
+ }
+
+ /**
+ * get child collections.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testListChildCollections() throws XMLDBException {
+ database.createCollection(DB_TEST);
+ assertTrue("check that collection exists", database.collectionExists(DB_TEST));
+
+ final String[] expectedNames = new String[] { "child1", "child2", "child3" };
+ for (String name : expectedNames)
+ database.createCollection(DB_TEST + "/" + name);
+
+ final List res = database.listChildCollections(DB_TEST);
+ // the db doesn't return then in the same order
+ Collections.sort(res);
+ assertArrayEquals("check list", expectedNames, res.toArray());
+ }
+
+ /**
+ * check list resources.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testList() throws XMLDBException {
+ database.createCollection(DB_TEST);
+ assertTrue("collection should exist", database.collectionExists(DB_TEST));
+
+ final String[] expectedNames = new String[] { "name1", "name2", "name3" };
+ for (String name : expectedNames)
+ database.create(name, DB_TEST, HELLO_XML);
+
+ final List res = database.list(DB_TEST);
+ // the db doesn't return then in the same order
+ Collections.sort(res);
+ assertArrayEquals("check list", expectedNames, res.toArray());
+ }
+
+ /**
+ * test low-level set trigger.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testSetExistTrigger() throws XMLDBException {
+ final Map params = new HashMap();
+ params.put("listenerBean", "pippo");
+
+ database.createCollection(DB_TEST);
+ edb.setExistTrigger(TestExistTrigger.class, DB_TEST, Arrays.asList(new String[] { "store", "update", "delete" }), params);
+
+ // assertNotNull("check that the conf is stored", database.read(ExistDatabase.COLLECTION_XCONF, DB_ROOT + "/system/config" + DB_TEST));
+
+ database.create(TRIGGER_TEST_FILE, DB_TEST, HELLO_XML_CONTENT);
+ assertEquals("check the the write happened", HELLO_XML_CONTENT, database.read(TRIGGER_TEST_FILE, DB_TEST));
+
+ database.update(TRIGGER_TEST_FILE, DB_TEST, "new content ");
+
+ database.xquery("for $x in collection('')/hello where $x/text() = 'new content' return update value $x/text() with 'xupdate'");
+ assertEquals("check the the xupdate happened", "xupdate ", database.read(TRIGGER_TEST_FILE, DB_TEST));
+ }
+
+ /**
+ * Test high level addTrigger.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testRegisterTrigger() throws XMLDBException {
+ final TestTrigger trigger = new TestTrigger();
+ trigger.setName(TEST_TRIGGER);
+
+ database.createCollection(DB_TEST);
+ database.registerTrigger(trigger, DB_TEST);
+
+ assertFalse("check that the tester state is correct", trigger.isCreated());
+
+ database.create(TRIGGER_TEST_FILE, DB_TEST, HELLO_XML_CONTENT);
+ assertEquals("check the the write happened", HELLO_XML_CONTENT, database.read(TRIGGER_TEST_FILE, DB_TEST));
+ assertFalse("check that the trigger is not invoked for the update event", trigger.isUpdated());
+ assertFalse("check that the trigger is not invoked for the deletion event", trigger.isDeleted());
+ assertTrue("check that the trigger is invoked create", trigger.isCreated());
+ assertEquals("check file name for create", TRIGGER_TEST_FILE, trigger.getLastFile());
+ assertEquals("check collection name for create", DB_TEST, trigger.getLastCollection());
+
+ trigger.reset();
+ assertFalse("check that the tester state is correct", trigger.isUpdated());
+ database.update(TRIGGER_TEST_FILE, DB_TEST, "new content ");
+ assertFalse("check that the trigger is not invoked for the creation event", trigger.isCreated());
+ assertFalse("check that the trigger is not invoked for the deletion event", trigger.isDeleted());
+ assertTrue("check that the trigger is invoked for update", trigger.isUpdated());
+ assertEquals("check file name for update", TRIGGER_TEST_FILE, trigger.getLastFile());
+ assertEquals("check collection name for update", DB_TEST, trigger.getLastCollection());
+
+ trigger.reset();
+ database.xquery("for $x in collection('')/hello where $x/text() = 'new content' return update value $x/text() with 'xupdate'");
+ assertTrue("check that the trigger is invoked for xupdate", trigger.isUpdated());
+ assertEquals("check file name for xupdate", TRIGGER_TEST_FILE, trigger.getLastFile());
+ assertEquals("check collection name for xupdate", DB_TEST, trigger.getLastCollection());
+
+ trigger.reset();
+ assertFalse("check that the tester state is correct", trigger.isDeleted());
+ database.remove(TRIGGER_TEST_FILE, DB_TEST);
+ assertFalse("check that the trigger is not invoked for the creation event", trigger.isCreated());
+ assertFalse("check that the trigger is not invoked for the update event", trigger.isUpdated());
+ assertNull("check that the file is removed", database.read(TRIGGER_TEST_FILE, DB_TEST));
+ assertTrue("check that the trigger is invoked for delete", trigger.isDeleted());
+ assertEquals("check file name for delete", TRIGGER_TEST_FILE, trigger.getLastFile());
+ assertEquals("check collection name for delete", DB_TEST, trigger.getLastCollection());
+ }
+
+ /**
+ * a trigger configuration file should not be listed as a xml file resource.
+ *
+ * @throws XMLDBException
+ * shouldn't happen
+ */
+ @Test
+ public void testListWithTriggerConf() throws XMLDBException {
+ database.createCollection(DB_TEST);
+ assertTrue("collection should exist", database.collectionExists(DB_TEST));
+
+ final TestTrigger trigger = new TestTrigger();
+ trigger.setName(TEST_TRIGGER);
+
+ database.registerTrigger(trigger, DB_TEST);
+
+ final String[] expectedNames = new String[] { "name1", "name2", "name3" };
+ for (String name : expectedNames)
+ database.create(name, DB_TEST, HELLO_XML);
+
+ assertTrue("check that trigger was invoked", trigger.isCreated());
+
+ final List res = database.list(DB_TEST);
+ // the db doesn't return then in the same order
+ Collections.sort(res);
+ assertArrayEquals("check list", expectedNames, res.toArray());
+ }
+
+ /**
+ * test trigger with several collections.
+ *
+ * @throws XMLDBException
+ * shoudn't happen
+ */
+ @Test
+ public void testTriggerDifferentCollections() throws XMLDBException {
+ final TestTrigger trigger = new TestTrigger();
+ trigger.setName(TEST_TRIGGER);
+
+ database.createCollection(DB_TEST);
+ database.createCollection(DB_OTHER);
+ database.createCollection(DB_SUB);
+
+ database.registerTrigger(trigger, DB_TEST);
+ database.create(TRIGGER_TEST_FILE, DB_TEST, HELLO_XML);
+ assertTrue("trigger was registered for this collection", trigger.isCreated());
+
+ trigger.reset();
+ database.create(TRIGGER_TEST_FILE, DB_OTHER, HELLO_XML);
+ assertFalse("trigger was not registered for this collection", trigger.isCreated());
+
+ trigger.reset();
+ database.registerTrigger(trigger, DB_OTHER);
+ database.remove(TRIGGER_TEST_FILE, DB_OTHER);
+ assertTrue("trigger is now registered for this collection", trigger.isDeleted());
+
+ trigger.reset();
+ database.create(TRIGGER_TEST_FILE, DB_SUB, HELLO_XML);
+ assertTrue("trigger is automatically registered for the sub collection", trigger.isCreated());
+
+ }
+
+ /**
+ * fails because eXist wants that all collection paths begin with /db.
+ *
+ * @throws XMLDBException
+ * expected
+ */
+ @Test(expected = XMLDBException.class)
+ public void testGetCollection() throws XMLDBException {
+ edb.getCollection("/something");
+ assertNotNull("dummy", edb);
+ }
+
+ /**
+ * simple parallel job.
+ *
+ * @author marko
+ *
+ */
+ class SimpleParallelJob extends Thread { // NOPMD
+ /**
+ * some argument.
+ */
+ private final transient int name;
+ /**
+ * record eventual exceptions.
+ */
+ private transient Throwable throwable = null;
+
+ /**
+ * pass some argument to the job.
+ *
+ * @param name
+ * some argument
+ */
+ SimpleParallelJob(final int name) {
+ super();
+ this.name = name;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ try {
+ parallelJob(name);
+ } catch (XMLDBException e) {
+ log.fatal("parallel job failing", e);
+ throwable = e;
+ } catch (Throwable e) { // NOPMD
+ log.fatal("other exception", e);
+ throwable = e;
+ }
+ }
+
+ public Throwable getThrowable() {
+ return throwable;
+ }
+ }
+
+ /**
+ * stress test the eXist db.
+ *
+ * @throws Throwable
+ * could
+ */
+ @Test
+ public void testParallel() throws Throwable {
+ final TestTrigger trigger = new TestTrigger();
+ trigger.setName(TEST_TRIGGER);
+
+ database.registerTrigger(trigger, DB_ROOT);
+
+ final List threads = new ArrayList(); // NOPMD
+ for (int i = 0; i < PAR_TIMES; i++)
+ threads.add(new SimpleParallelJob(i)); // NOPMD
+ for (Thread thread : threads) { // NOPMD
+ thread.start();
+ }
+ for (Thread thread : threads) { // NOPMD
+ thread.join();
+ }
+
+ for (SimpleParallelJob thread : threads) { // NOPMD
+ if (thread.getThrowable() != null)
+ throw thread.getThrowable();
+ }
+
+ assertNotNull("dummy", threads);
+ }
+
+ /**
+ * Stress test for eXist WAL logs.
+ *
+ * @throws XMLDBException
+ * could happen
+ */
+ @Test
+ @Ignore
+ public void testManueleStress() throws XMLDBException {
+ final StringBuffer childTemplate = new StringBuffer(200); // NOPMD
+
+ for (int i = 0; i < STRESS_VALUES; i++) {
+ childTemplate.append("" + i + "-VAL ITER ");
+ }
+
+ final StringBuffer hugeTemplate = new StringBuffer(200);
+ hugeTemplate.append("");
+ for (int i = 0; i < STRESS_PROF_LEN; i++) {
+ final String child = childTemplate.toString().replace("VAL", Integer.toString(i));
+ hugeTemplate.append(child);
+ }
+ hugeTemplate.append(" ");
+
+ for (int i = 0; i < STRESS_TIMES; i++) {
+ final String huge = hugeTemplate.toString().replace("ITER", Integer.toString(i));
+ database.create("stressTest-" + (i % STRESS_PROFILES), DB_ROOT + "/" + (i % STRESS_COLLS), huge);
+ }
+
+ assertNotNull("dummy", hugeTemplate);
+ }
+
+ /**
+ * one parallel job execution.
+ *
+ * @param arg
+ * some argument
+ * @throws XMLDBException
+ * could happen.
+ */
+ protected void parallelJob(final int arg) throws XMLDBException {
+ final String name = Integer.toString(arg);
+ final String coll = DB_ROOT + "/" + Integer.toString(arg % PAR_COLLS);
+ database.create(name, coll, " ");
+
+ for (int i = 0; i < PAR_ITERATIONS; i++) {
+ database.update(name, coll, " ");
+ final Iterator res = database.xquery("collection('')//*[@value='" + i % QUERY_SCATTER + "']");
+ while (res.hasNext())
+ res.next();
+ }
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/PersistentExistDatabaseTest.java b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/PersistentExistDatabaseTest.java
new file mode 100644
index 0000000..a73c57a
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/PersistentExistDatabaseTest.java
@@ -0,0 +1,46 @@
+package eu.dnetlib.xml.database.exist;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PersistentExistDatabaseTest {
+
+ private PersistentExistDatabase db;
+
+ @Before
+ public void setUp() throws Exception {
+ db = new PersistentExistDatabase();
+ }
+
+ @Test
+ public void testFile() throws IOException {
+ File file = File.createTempFile("test", "conf");
+ FileWriter writer = new FileWriter(file);
+ try {
+ IOUtils.write("test enable-java-binding=\"no\" test", writer);
+ } finally {
+ writer.close();
+ }
+
+ db.enableJava(file, true);
+ }
+
+ @Test
+ public void testPatch() {
+ assertEquals("test123", db.patchConfigFileEnableJava("test123", true));
+ assertEquals("enable-java-binding=\"yes\"", db.patchConfigFileEnableJava("enable-java-binding=\"yes\"", true));
+ assertEquals("enable-java-binding=\"no\"", db.patchConfigFileEnableJava("enable-java-binding=\"yes\"", false));
+ assertEquals("enable-java-binding=\"yes\"", db.patchConfigFileEnableJava("enable-java-binding=\"no\"", true));
+ assertEquals("enable-java-binding=\"no\"", db.patchConfigFileEnableJava("enable-java-binding=\"no\"", false));
+
+ assertEquals("yyy enable-java-binding=\"yes\" xxx", db.patchConfigFileEnableJava("yyy enable-java-binding=\"no\" xxx", true));
+ }
+
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/TestExistTrigger.java b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/TestExistTrigger.java
new file mode 100644
index 0000000..9bee21a
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/TestExistTrigger.java
@@ -0,0 +1,126 @@
+package eu.dnetlib.xml.database.exist;
+
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.exist.collections.triggers.SAXTrigger;
+import org.exist.collections.triggers.TriggerException;
+import org.exist.dom.persistent.DocumentImpl;
+import org.exist.storage.DBBroker;
+import org.exist.storage.txn.Txn;
+import org.exist.xmldb.XmldbURI;
+
+/**
+ * simple test trigger.
+ *
+ * @author marko
+ *
+ */
+public class TestExistTrigger extends SAXTrigger {
+ /**
+ * logger.
+ */
+ private static final Log log = LogFactory.getLog(TestExistTrigger.class); // NOPMD by marko on 11/24/08 5:02 PM
+ /**
+ * expression.
+ */
+ private transient XPathExpression expr;
+
+ /**
+ * useless.
+ */
+ public TestExistTrigger() {
+ super();
+
+ try {
+ expr = XPathFactory.newInstance().newXPath().compile("//hello");
+ } catch (XPathExpressionException e) {
+ log.fatal("cannot parse xpath", e);
+ }
+ }
+
+
+
+ @Override
+ public void beforeCreateDocument(final DBBroker dbBroker, final Txn txn, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void afterCreateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ try {
+ log.debug("created new document: " + expr.evaluate(document));
+ } catch (XPathExpressionException e) {
+ log.fatal("xpatthing", e);
+ }
+ }
+
+ @Override
+ public void beforeUpdateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ try {
+ log.info("old value: " + expr.evaluate(document));
+
+ } catch (XPathExpressionException e) {
+ log.fatal("xpatthing", e);
+ }
+ }
+
+ @Override
+ public void afterUpdateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ try {
+ log.info("new value: " + expr.evaluate(document));
+ } catch (XPathExpressionException e) {
+ log.fatal("xpatthing", e);
+ }
+
+ }
+
+ @Override
+ public void beforeUpdateDocumentMetadata(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ }
+
+ @Override
+ public void afterUpdateDocumentMetadata(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+
+ }
+
+ @Override
+ public void beforeCopyDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void afterCopyDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void beforeMoveDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void afterMoveDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+
+ @Override
+ public void beforeDeleteDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
+ try {
+ log.debug("deleted document: " + expr.evaluate(document));
+ } catch (XPathExpressionException e) {
+ log.fatal("xpatthing", e);
+ }
+
+ }
+
+ @Override
+ public void afterDeleteDocument(final DBBroker dbBroker, final Txn txn, final XmldbURI xmldbURI) throws TriggerException {
+
+ }
+}
diff --git a/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/TestTrigger.java b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/TestTrigger.java
new file mode 100644
index 0000000..9da1b64
--- /dev/null
+++ b/dnet-information-service/src/test/java/eu/dnetlib/xml/database/exist/TestTrigger.java
@@ -0,0 +1,124 @@
+package eu.dnetlib.xml.database.exist;
+
+import org.w3c.dom.Document;
+
+import eu.dnetlib.xml.database.LoggingTrigger;
+
+/**
+ * test high level xml db trigger tester.
+ *
+ * @author marko
+ *
+ */
+public class TestTrigger extends LoggingTrigger {
+
+ /**
+ * true when the trigger is first called on 'create' event.
+ */
+ private boolean created = false; // NOPMD
+ /**
+ * true when the trigger is first called on 'update' event.
+ */
+ private boolean updated = false; // NOPMD
+ /**
+ * true when the trigger is first called on 'delete' event.
+ */
+ private boolean deleted = false; // NOPMD
+
+ /**
+ * last triggered file name.
+ */
+ private String lastFile;
+ /**
+ * last triggered collection name.
+ */
+ private String lastCollection;
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.xml.database.Trigger#created(java.lang.String, java.lang.String, org.w3c.dom.Document)
+ */
+ @Override
+ public void created(final String file, final String collection, final Document newDoc) {
+ super.created(file, collection, newDoc);
+
+ setLastFile(file);
+ setLastCollection(collection);
+ created = true;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.xml.database.Trigger#deleted(java.lang.String, java.lang.String, org.w3c.dom.Document)
+ */
+ @Override
+ public void deleted(final String file, final String collection, final Document oldDoc) {
+ super.deleted(file, collection, oldDoc);
+
+ setLastFile(file);
+ setLastCollection(collection);
+ deleted = true;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see eu.dnetlib.xml.database.Trigger#updated(java.lang.String, java.lang.String, org.w3c.dom.Document, org.w3c.dom.Document)
+ */
+ @Override
+ public void updated(final String file, final String collection, final Document oldDoc, final Document newDoc) {
+ super.updated(file, collection, oldDoc, newDoc);
+
+ setLastFile(file);
+ setLastCollection(collection);
+ updated = true;
+ }
+
+ /**
+ * reset crude sentinels.
+ */
+ public void reset() {
+ setCreated(false);
+ setUpdated(false);
+ setDeleted(false);
+ }
+
+ public boolean isCreated() {
+ return created;
+ }
+
+ public void setCreated(final boolean created) {
+ this.created = created;
+ }
+
+ public boolean isUpdated() {
+ return updated;
+ }
+
+ public void setUpdated(final boolean updated) {
+ this.updated = updated;
+ }
+
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(final boolean deleted) {
+ this.deleted = deleted;
+ }
+
+ String getLastFile() {
+ return lastFile;
+ }
+
+ void setLastFile(final String lastFile) {
+ this.lastFile = lastFile;
+ }
+
+ String getLastCollection() {
+ return lastCollection;
+ }
+
+ void setLastCollection(final String lastCollection) {
+ this.lastCollection = lastCollection;
+ }
+}
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/lookup/collProfile.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/lookup/collProfile.xml
new file mode 100644
index 0000000..c37eb99
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/lookup/collProfile.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ file.gif
+ Test Collection
+
+
+ History
+ 0
+ 1
+ 0
+
+ AAAAAAAAAAAAA
+ BBBBBBBBBBBBB
+ CCCCCCCCCCCCC
+
+
+ queryA
+ file.gif
+
+
+
+
+ query0000 AND queryA
+
+
+
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/RepositoryServiceResourceType.xsd b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/RepositoryServiceResourceType.xsd
new file mode 100644
index 0000000..d571329
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/RepositoryServiceResourceType.xsd
@@ -0,0 +1,2 @@
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/any-schema.xsd b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/any-schema.xsd
new file mode 100644
index 0000000..e27688b
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/any-schema.xsd
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/invalid-profile.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/invalid-profile.xml
new file mode 100644
index 0000000..fcee064
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/invalid-profile.xml
@@ -0,0 +1,2 @@
+
+0 0 edoc Humboldt University of Berlin, GERMANY, Document Server Humboldt Univ. Berlin: edoc Document and Publication Server http://edoc.hu-berlin.de/e_modules/banner4.jpg DE 13.37 52.5159 1 http://edoc.hu-berlin.de/ mailto:oai@rz.hu-berlin.de OAI http://edoc.hu-berlin.de/OAI-2.0 oai_dc oai_ems oai_pp oai_xmetadiss oai_epdcx Allgemeines, Wissenschaft Informatik Bibliografien Bibliotheks- und Informationswissenschaft Organisationen, Museumswissenschaft Geografie, Reisen Philosophie Psychologie Religion, Religionsphilosophie Theologie, Christentum Andere Religionen Sozialwissenschaften, Soziologie Statistik Politik Wirtschaft Recht ffentliche Verwaltung Soziale Probleme, Sozialarbeit Erziehung, Schul- und Bildungswesen Ethnologie Sprachwissenschaft, Linguistik Deutsch Franzoesisch, romanische Sprachen allgemein Italienisch, Rumaenisch, Raetoromanisch Latein Andere Sprachen Naturwissenschaften Mathematik Physik Chemie Geowissenschaften Biowissenschaften, Biologie Pflanzen (Botanik) Tiere (Zoologie) Technik Medizin Landwirtschaft, Veterinaermedizin Hauswirtschaft Management Kuenste, Bildende Kunst allgemein Landschaftsgestaltung, Raumplanung Architektur Plastik, Numismatik, Keramik, Metallkunst Malerei Grafische Verfahren, Drucke ffentliche Darbietungen, Film, Rundfunk Theater, Tanz Sport Literatur, Rhetorik, Literaturwissenschaft Deutsche Literatur Literatur in anderen germanischen Sprachen Franzoesische Literatur Italienische, rumaenische, raetoromanische Literatur Literatur in anderen Sprachen Geschichte Geografie, Reisen Biografie, Genealogie, Heraldik Alte Geschichte, Archaeologie Geschichte Europas Geschichte Deutschlands Geschichte Asiens Wissenschaft und Kultur allgemein Schrift, Buch, Bibliothek, Information und Dokumentation Philosophie Psychologie Christliche Religion Allg. und Vgl. Religionswiss., Nichtchristliche Religionen Soziologie, Gesellschaft Statistik Politik Wirtschaft Recht Erziehung, Bildung, Unterricht Volkskunde, Voelkerkunde Natur, Naturwissenschaften allgemein Mathematik Informatik, Datenverarbeitung Physik, Astronomie Chemie Geowissenschaften Biologie Medizin Technik allgemein Landwirtschaft, Garten Architektur Bildende Kunst Theater, Tanz, Film Sport, Spiele Allg. und Vgl. Sprach- und Literaturwissenschaft Deutsche Sprach- und Literaturwissenschaft Sprach- und Literaturwiss. der uebrigen germanischen Sprachen Romanische Sprach- und Literaturwissenschaft Klassische Sprach- und Literaturwissenschaft Slawische und baltische Sprach- und Literaturwissenschaft Sprach- und Literaturwissenschaft sonstiger Sprachen Archaeologie, Vorgeschichte Geographie, Heimat- und Laenderkunde, Reisen Geschichte und Historische Hilfswissenschaften Sozialgeschichte Wirtschaftsgeschichte Books, Monographs Conference Proceedings Diploma Theses Dissertations and Professional Dissertations Journal Article Lectures Papers Reports 5507 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/schema.xsd b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/schema.xsd
new file mode 100644
index 0000000..6a126c4
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/schema.xsd
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/valid-any-optional.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/valid-any-optional.xml
new file mode 100644
index 0000000..0dc7aad
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/valid-any-optional.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/valid-profile.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/valid-profile.xml
new file mode 100644
index 0000000..c2ff189
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/schema/valid-profile.xml
@@ -0,0 +1,2 @@
+
+0 0 edoc Humboldt University of Berlin, GERMANY, Document Server Humboldt Univ. Berlin: edoc Document and Publication Server http://edoc.hu-berlin.de/e_modules/banner4.jpg DE 13.37 52.5159 1 http://edoc.hu-berlin.de/ mailto:oai@rz.hu-berlin.de OAI http://edoc.hu-berlin.de/OAI-2.0 oai_dc oai_ems oai_pp oai_xmetadiss oai_epdcx Allgemeines, Wissenschaft Informatik Bibliografien Bibliotheks- und Informationswissenschaft Organisationen, Museumswissenschaft Geografie, Reisen Philosophie Psychologie Religion, Religionsphilosophie Theologie, Christentum Andere Religionen Sozialwissenschaften, Soziologie Statistik Politik Wirtschaft Recht ffentliche Verwaltung Soziale Probleme, Sozialarbeit Erziehung, Schul- und Bildungswesen Ethnologie Sprachwissenschaft, Linguistik Deutsch Franzoesisch, romanische Sprachen allgemein Italienisch, Rumaenisch, Raetoromanisch Latein Andere Sprachen Naturwissenschaften Mathematik Physik Chemie Geowissenschaften Biowissenschaften, Biologie Pflanzen (Botanik) Tiere (Zoologie) Technik Medizin Landwirtschaft, Veterinaermedizin Hauswirtschaft Management Kuenste, Bildende Kunst allgemein Landschaftsgestaltung, Raumplanung Architektur Plastik, Numismatik, Keramik, Metallkunst Malerei Grafische Verfahren, Drucke ffentliche Darbietungen, Film, Rundfunk Theater, Tanz Sport Literatur, Rhetorik, Literaturwissenschaft Deutsche Literatur Literatur in anderen germanischen Sprachen Franzoesische Literatur Italienische, rumaenische, raetoromanische Literatur Literatur in anderen Sprachen Geschichte Geografie, Reisen Biografie, Genealogie, Heraldik Alte Geschichte, Archaeologie Geschichte Europas Geschichte Deutschlands Geschichte Asiens Wissenschaft und Kultur allgemein Schrift, Buch, Bibliothek, Information und Dokumentation Philosophie Psychologie Christliche Religion Allg. und Vgl. Religionswiss., Nichtchristliche Religionen Soziologie, Gesellschaft Statistik Politik Wirtschaft Recht Erziehung, Bildung, Unterricht Volkskunde, Voelkerkunde Natur, Naturwissenschaften allgemein Mathematik Informatik, Datenverarbeitung Physik, Astronomie Chemie Geowissenschaften Biologie Medizin Technik allgemein Landwirtschaft, Garten Architektur Bildende Kunst Theater, Tanz, Film Sport, Spiele Allg. und Vgl. Sprach- und Literaturwissenschaft Deutsche Sprach- und Literaturwissenschaft Sprach- und Literaturwiss. der uebrigen germanischen Sprachen Romanische Sprach- und Literaturwissenschaft Klassische Sprach- und Literaturwissenschaft Slawische und baltische Sprach- und Literaturwissenschaft Sprach- und Literaturwissenschaft sonstiger Sprachen Archaeologie, Vorgeschichte Geographie, Heimat- und Laenderkunde, Reisen Geschichte und Historische Hilfswissenschaften Sozialgeschichte Wirtschaftsgeschichte Books, Monographs Conference Proceedings Diploma Theses Dissertations and Professional Dissertations Journal Article Lectures Papers Reports 5507 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/securityProfile.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/securityProfile.xml
new file mode 100644
index 0000000..e9417bb
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/securityProfile.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+ driver.security.identity.role#user
+ driver.security.identity.role
+
+
+ driver.security.identity.role#repositoryManager
+ driver.security.identity.role
+
+
+ test
+ password
+
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/serviceProfile.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/serviceProfile.xml
new file mode 100644
index 0000000..6090dbb
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/serviceProfile.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+
+
+
+ 0
+ 0
+
+
+
+ action-10afbe80-11f6-11de-8e98-00163e7589aa
+ action-10afbe80-11f6-11de-8e98-00163e7589aa
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/serviceProfileWithMessage.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/serviceProfileWithMessage.xml
new file mode 100644
index 0000000..d3f6b94
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/serviceProfileWithMessage.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+
+
+
+ 0
+ 0
+
+
+
+ action-10afbe80-11f6-11de-8e98-00163e7589aa
+ action-10afbe80-11f6-11de-8e98-00163e7589aa
+ CREATE ASSIGNED
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/test-profile.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/test-profile.xml
new file mode 100644
index 0000000..3c3f8b6
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/test-profile.xml
@@ -0,0 +1,154 @@
+
+
+
+
+ 0
+
+ 0
+ Opus
+ ArchiMeD - Elektronische Publikationen der Universität Mainz
+ Mainz Univ., ArchiMed
+ http://archimed.uni-mainz.de/opusubm/grafiken/kopf_schriftzug.gif
+ DE
+
+ 8.27
+ 50.0006
+ 1
+
+ http://archimed.uni-mainz.de/opusubm/archimed-home.html
+
+ mailto:seiler@hbz-nrw.de
+
+
+ OAI
+ http://ubm.opus.hbz-nrw.de/phpoai/oai2.php
+
+ oai_dc
+ epicur
+
+
+ Generalities, Science
+ Data processing Computer science
+ Bibliography
+ Library and information sciences
+ General encyclopedic works
+ General serials and their indexes
+ General organization and museology
+ News media, journalism, publishing
+ General collections
+ Manuscripts and rare books
+ Philosophy
+ Paranormal phenomena
+ Psychology
+ Religion
+ Bible
+ Christian theology
+ Other and comparative religions
+ Social sciences
+ General statistics
+ Political science
+ Economics
+ Law
+ Public administration
+ Military science
+ "Social services; association"
+ Education
+ Commerce, communications, transport
+ Customs, etiquette, folklore
+ Language, Linguistics
+ English
+ Germanic
+ Other Germanic languages
+ Romance languages French
+ Italian, Romanian, Rhaeto-Romantic
+ Spanish and Portugese languages
+ Italic Latin
+ Hellenic languages Classical Greek
+ Other languages
+ Natural sciences and mathematics
+ Mathematics
+ Astronomy and allied sciences
+ Physics
+ Chemistry and allied sciences
+ Earth sciences
+ Paleontology Paleozoology
+ Life sciences
+ Botanical sciences
+ Zoological sciences
+ Technology (Applied sciences)
+ Medical sciences Medicine
+ Engineering and allied operations
+ Agriculture
+ Home economics and family living
+ Management and auxiliary services
+ Chemical engineering
+ Manufacturing
+ Buildings
+ The arts
+ Civic and landscape art
+ Architecture
+ Plastic arts Sculpture
+ Drawing and decorative arts
+ Comics, Cartoons
+ Painting and paintings
+ Graphic arts Printmaking and prints
+ Photography and photographs
+ Music
+ Recreational and performing arts
+ Public performances
+ Stage presentations
+ Indoor games and amusements
+ Athletic and outdoor sports and games
+ Literature and rhetoric
+ American literature in English
+ English and Old English literatures
+ Literatures of Germanic languages
+ Other Germanic literatures
+ Literatures of Romance languages
+ Italian, Romanian, Rhaeto-Romanic literatures
+ Spanish and Portuguese literatures
+ Italic literatures Latin
+ Hellenic literatures Classical Greek
+ Literatures of other languages
+ Geography and history
+ Geography and travel
+ Geography and travel Germany
+ Biography, genealogy, insignia
+ History of ancient world
+ General history of Europe
+ General history of Europe Central Europe Germany
+ General history of Asia Far East
+ General history of Africa
+ General history of North America
+ General history of South America
+ General history of other areas
+ Text.Thesis.Doctoral
+ Text.Thesis.Habilitation
+ MastersThesis
+ DiplomaThesis
+ MagisterThesis
+ Msc
+
+
+
+
+
+ 1371
+
+
+
+
+
+ 0
+
+
+
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/userProfile.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/userProfile.xml
new file mode 100644
index 0000000..e9c5683
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/registry/userProfile.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BRIEF
+
+
+
+
+
+
+ value
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImplTest-context.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImplTest-context.xml
new file mode 100644
index 0000000..e4206e9
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/HibernateResourceStateSubscriptionDAOImplTest-context.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/hsql-context.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/hsql-context.xml
new file mode 100644
index 0000000..55e926c
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/is/sn/resourcestate/hib/hsql-context.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ eu.dnetlib.enabling.is.sn.resourcestate.ResourceStateSubscription
+
+
+
+
+ org.hibernate.dialect.HSQLDialect
+
+ true
+ create
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/tools/local-cxf.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/tools/local-cxf.xml
new file mode 100644
index 0000000..5b8040f
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/tools/local-cxf.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+ http://cxf.apache.org/transports/local
+ http://schemas.xmlsoap.org/soap/http
+ http://schemas.xmlsoap.org/wsdl/soap/http
+
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/enabling/tools/test-profile.xml b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/tools/test-profile.xml
new file mode 100644
index 0000000..c28fa68
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/enabling/tools/test-profile.xml
@@ -0,0 +1,154 @@
+
+
+
+
+ 0
+
+ 0
+ Opus
+ ArchiMeD - Elektronische Publikationen der Universität Mainz
+ Mainz Univ., ArchiMed
+ http://archimed.uni-mainz.de/opusubm/grafiken/kopf_schriftzug.gif
+ DE
+
+ 8.27
+ 50.0006
+ 1
+
+ http://archimed.uni-mainz.de/opusubm/archimed-home.html
+
+ mailto:seiler@hbz-nrw.de
+
+
+ OAI
+ http://ubm.opus.hbz-nrw.de/phpoai/oai2.php
+
+ oai_dc
+ epicur
+
+
+ Generalities, Science
+ Data processing Computer science
+ Bibliography
+ Library and information sciences
+ General encyclopedic works
+ General serials and their indexes
+ General organization and museology
+ News media, journalism, publishing
+ General collections
+ Manuscripts and rare books
+ Philosophy
+ Paranormal phenomena
+ Psychology
+ Religion
+ Bible
+ Christian theology
+ Other and comparative religions
+ Social sciences
+ General statistics
+ Political science
+ Economics
+ Law
+ Public administration
+ Military science
+ "Social services; association"
+ Education
+ Commerce, communications, transport
+ Customs, etiquette, folklore
+ Language, Linguistics
+ English
+ Germanic
+ Other Germanic languages
+ Romance languages French
+ Italian, Romanian, Rhaeto-Romantic
+ Spanish and Portugese languages
+ Italic Latin
+ Hellenic languages Classical Greek
+ Other languages
+ Natural sciences and mathematics
+ Mathematics
+ Astronomy and allied sciences
+ Physics
+ Chemistry and allied sciences
+ Earth sciences
+ Paleontology Paleozoology
+ Life sciences
+ Botanical sciences
+ Zoological sciences
+ Technology (Applied sciences)
+ Medical sciences Medicine
+ Engineering and allied operations
+ Agriculture
+ Home economics and family living
+ Management and auxiliary services
+ Chemical engineering
+ Manufacturing
+ Buildings
+ The arts
+ Civic and landscape art
+ Architecture
+ Plastic arts Sculpture
+ Drawing and decorative arts
+ Comics, Cartoons
+ Painting and paintings
+ Graphic arts Printmaking and prints
+ Photography and photographs
+ Music
+ Recreational and performing arts
+ Public performances
+ Stage presentations
+ Indoor games and amusements
+ Athletic and outdoor sports and games
+ Literature and rhetoric
+ American literature in English
+ English and Old English literatures
+ Literatures of Germanic languages
+ Other Germanic literatures
+ Literatures of Romance languages
+ Italian, Romanian, Rhaeto-Romanic literatures
+ Spanish and Portuguese literatures
+ Italic literatures Latin
+ Hellenic literatures Classical Greek
+ Literatures of other languages
+ Geography and history
+ Geography and travel
+ Geography and travel Germany
+ Biography, genealogy, insignia
+ History of ancient world
+ General history of Europe
+ General history of Europe Central Europe Germany
+ General history of Asia Far East
+ General history of Africa
+ General history of North America
+ General history of South America
+ General history of other areas
+ Text.Thesis.Doctoral
+ Text.Thesis.Habilitation
+ MastersThesis
+ DiplomaThesis
+ MagisterThesis
+ Msc
+
+
+
+
+
+ 1371
+
+
+
+
+
+ 0
+
+
+
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/applicationContext-integrationSupport.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/applicationContext-integrationSupport.xml
new file mode 100644
index 0000000..e48fc42
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/applicationContext-integrationSupport.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo1.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo1.xml
new file mode 100644
index 0000000..c2ff189
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo1.xml
@@ -0,0 +1,2 @@
+
+0 0 edoc Humboldt University of Berlin, GERMANY, Document Server Humboldt Univ. Berlin: edoc Document and Publication Server http://edoc.hu-berlin.de/e_modules/banner4.jpg DE 13.37 52.5159 1 http://edoc.hu-berlin.de/ mailto:oai@rz.hu-berlin.de OAI http://edoc.hu-berlin.de/OAI-2.0 oai_dc oai_ems oai_pp oai_xmetadiss oai_epdcx Allgemeines, Wissenschaft Informatik Bibliografien Bibliotheks- und Informationswissenschaft Organisationen, Museumswissenschaft Geografie, Reisen Philosophie Psychologie Religion, Religionsphilosophie Theologie, Christentum Andere Religionen Sozialwissenschaften, Soziologie Statistik Politik Wirtschaft Recht ffentliche Verwaltung Soziale Probleme, Sozialarbeit Erziehung, Schul- und Bildungswesen Ethnologie Sprachwissenschaft, Linguistik Deutsch Franzoesisch, romanische Sprachen allgemein Italienisch, Rumaenisch, Raetoromanisch Latein Andere Sprachen Naturwissenschaften Mathematik Physik Chemie Geowissenschaften Biowissenschaften, Biologie Pflanzen (Botanik) Tiere (Zoologie) Technik Medizin Landwirtschaft, Veterinaermedizin Hauswirtschaft Management Kuenste, Bildende Kunst allgemein Landschaftsgestaltung, Raumplanung Architektur Plastik, Numismatik, Keramik, Metallkunst Malerei Grafische Verfahren, Drucke ffentliche Darbietungen, Film, Rundfunk Theater, Tanz Sport Literatur, Rhetorik, Literaturwissenschaft Deutsche Literatur Literatur in anderen germanischen Sprachen Franzoesische Literatur Italienische, rumaenische, raetoromanische Literatur Literatur in anderen Sprachen Geschichte Geografie, Reisen Biografie, Genealogie, Heraldik Alte Geschichte, Archaeologie Geschichte Europas Geschichte Deutschlands Geschichte Asiens Wissenschaft und Kultur allgemein Schrift, Buch, Bibliothek, Information und Dokumentation Philosophie Psychologie Christliche Religion Allg. und Vgl. Religionswiss., Nichtchristliche Religionen Soziologie, Gesellschaft Statistik Politik Wirtschaft Recht Erziehung, Bildung, Unterricht Volkskunde, Voelkerkunde Natur, Naturwissenschaften allgemein Mathematik Informatik, Datenverarbeitung Physik, Astronomie Chemie Geowissenschaften Biologie Medizin Technik allgemein Landwirtschaft, Garten Architektur Bildende Kunst Theater, Tanz, Film Sport, Spiele Allg. und Vgl. Sprach- und Literaturwissenschaft Deutsche Sprach- und Literaturwissenschaft Sprach- und Literaturwiss. der uebrigen germanischen Sprachen Romanische Sprach- und Literaturwissenschaft Klassische Sprach- und Literaturwissenschaft Slawische und baltische Sprach- und Literaturwissenschaft Sprach- und Literaturwissenschaft sonstiger Sprachen Archaeologie, Vorgeschichte Geographie, Heimat- und Laenderkunde, Reisen Geschichte und Historische Hilfswissenschaften Sozialgeschichte Wirtschaftsgeschichte Books, Monographs Conference Proceedings Diploma Theses Dissertations and Professional Dissertations Journal Article Lectures Papers Reports 5507 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo10.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo10.xml
new file mode 100644
index 0000000..4b6fdd4
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo10.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Univ. Tromsoe: Munin Open Research Archive Univ. Tromsoe: Munin Open Research Archive http://www.ub.uit.no/munin/image/munin_banner-start_left.gif NO 18.95 69.660 1 http://www.ub.uit.no/munin/ Univ. i Tromsoe munin@ub.uit.no OAI http://www.ub.uit.no/munin-oai/request oai_dc 1427 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo100.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo100.xml
new file mode 100644
index 0000000..d598cd2
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo100.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints DORAS DORAS http://doras.dcu.ie/images/banner_right.jpg IE -6.225 53.386 0 http://doras.dcu.ie/ Dublin City University doras@dcu.ie OAI http://doras.dcu.ie/cgi/oai2 oai_dc 759 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo101.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo101.xml
new file mode 100644
index 0000000..0860841
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo101.xml
@@ -0,0 +1,2 @@
+
+0 0 Opus SciDok, der Wissenschafts-Server der Universitaet des Saarlandes SciDok: Der Wissenschafts-Server der Univ. des Saarlandes http://scidok.sulb.uni-saarland.de/Icons/sci.gif DE 6.9982 49.23 1 http://scidok.sulb.uni-saarland.de/ mailto:scidok@sulb.uni-saarland.de OAI http://scidok.sulb.uni-saarland.de/phpoai/oai2.php oai_dc epicur oai_pp xMetaDiss Generalities, Science Data processing Computer science Library and information sciences News media, journalism, publishing Psychology Social sciences General statistics Political science Economics Law Public administration Education Language, Linguistics Germanic Romance languages French Italian, Romanian, Rhaeto-Romantic Natural sciences and mathematics Mathematics Physics Chemistry and allied sciences Earth sciences Life sciences Zoological sciences Technology (Applied sciences) Medical sciences Medicine Engineering and allied operations Chemical engineering Manufacturing Athletic and outdoor sports and games Literatures of Germanic languages Italian, Romanian, Rhaeto-Romanic literatures Geography and history Geography and travel History of ancient world Article Book HonoursThesis InBook InProceedings Manual MastersThesis Misc Preprint ResearchPaper TechReport Text.Thesis.Doctoral Text.Thesis.Habilitation 1299 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo102.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo102.xml
new file mode 100644
index 0000000..8c9253a
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo102.xml
@@ -0,0 +1,2 @@
+
+0 0 Fedora ePIC ePIC http://epic.awi.de/Publications/Pics/epic.gif DE 8.5795492 53.5336852 1 http://epic.awi.de/epic/Main Alfred Wegener Institute for Polar and Marine Research (AWI), fedora-admin@awi.de OAI http://rep.awi.de:8080/oaiprovider/ oai_dc 438 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo103.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo103.xml
new file mode 100644
index 0000000..4a847a0
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo103.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace JUWEL (JUelicher Wissenschaftliche Elektronische Literatur) JUWEL http://juwel.fz-juelich.de:8080/dspace/image/kopf.jpg DE 6.4045 50.9004 1 http://juwel.fz-juelich.de:8080/dspace// Forschungszentrums Jülich w.hinz@fz-juelich.de OAI http://juwel.fz-juelich.de:8080/dspace-oai122fzj/request oai_dc 2879 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo104.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo104.xml
new file mode 100644
index 0000000..88e5352
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo104.xml
@@ -0,0 +1,2 @@
+
+0 0 Wageningen University and Researchcenter Publications Wageningen University and Researchcenter Publications NL 5.6609 51.964 1 servicedesk.library@wur.nl OAI http://library.wur.nl/oai oai_dc collexis wever dare_didl Publicly available objects Keur der wetenschap Distributed Africana Repositories Community Wiskunde Wiskunde (algemeen) Toegepaste wiskunde Wiskundige modellen Statistiek Statistiek (algemeen) Ontwerp van proeven Toegepaste statistiek Fysica Fysica (algemeen) Biofysica Biofysica (algemeen) Meteorologie Meteorologie (algemeen) Klimatologie Klimaatverandering Chemie (algemeen) Chemie Organische chemie Fysische chemie Kollod en oppervlaktechemie Biochemie Eiwitten en enzymen Biologie Celbiologie Evolutie en fylogenie Biosystematiek Moleculaire biologie Moleculaire biologie (algemeen) Moleculaire plantenbiologie Genetische modificatie Genetica Genetica (algemeen) Cytogenetica Moleculaire genetica Kwantitatieve- en populatiegenetica Biotechnologie Bioveiligheid, risico-evaluatie Bioinformatica Bioinformatica (algemeen) Genoominformatica Proteomics Microbiologie Microbiologie (algemeen) Virologie Bacteriologie Industrile microbiologie Landbouw Landbouw (algemeen) Landbouwsystemen Landgebruikssystemen Bedrijfssystemen Agro-ecosystemen Alternatieve Landbouw Ecologische landbouw Geneeskunde Humane fysiologie en anatomie Epidemiologie Communicatie Communicatie (algemeen) Communicatieprocessen Publiceren Bibliotheken Bibliotheken (algemeen) Sociologie Sociologie (algemeen) Rurale samenleving Agrarische sociologie Gezinssociologie Rampenstudies Rampenstudies (algemeen) Seksen en hun onderlinge verhoudingen Seksen en hun onderlinge verhoudingen (algemeen) Rurale vrouwen Recreatie, toerisme Recreatie, toerisme (algemeen) Onderwijs Onderwijs (algemeen) Didactiek Economie Economie (algemeen) Economische voorwaarden, ontwikkeling en structuur Economische beleid Milieu-economie Ontwikkelingsstudies Ontwikkelingsstudies (algemeen) Ontwikkelingseconomie Plattelandsontwikkeling Voedselvoorzieningsbeleid Voedselzekerheid Ontwikkelingssociologie Agrarische economie Agrarische economie (algemeen) Landbouwbeleid Agrarische bedrijfsvoering Agrarische bedrijfseconomie Huishoudkunde Huishoudkunde (algemeen) Management, bedrijfskunde, organisatiekunde Management studies Bedrijfskunde Kwaliteitszorg Beheer van productieketens Logistiek Operationeel onderzoek Bedrijfseconomie Marketing Marketing (algemeen) Marketing-onderzoek Consumentenstudies Consumentenstudies (algemeen) Consumentengedrag Economie m.b.t. consumenten Recht Recht (algemeen) Openbaar bestuur Openbaar bestuur (algemeen) Filosofie Filosofie (algemeen) Filosofische stelsels Ethiek, bio-ethiek Sociale filosofie Economische, sociale en cultuurgeschiedenis Rurale geschiedenis Innovatiestudies Innovatiestudies (algemeen) Techniek Techniek (algemeen) Werktuigbouwkunde en elektrotechniek Meet- en regeltechniek Energie Windenergie Milieutechnologie Afvalverwerking Afvalwaterbehandeling Informatie- en communicatietechnologie Informatie- en communicatietechnologie (algemeen) Landbouwtechniek Landbouwtechniek (algemeen) Landbouwbedrijfsgebouwen en landbouwinstallaties Mechanisatie Levensmiddelen- en bioproceskunde Levensmiddelen- en bioproceskunde (algemeen) Membraantechnologie (Bio)reactorkunde Procescontrolesystemen Levensmiddelentechnologie Levensmiddelentechnologie (algemeen) Levensmiddelenfysica Levensmiddelenchemie Levensmiddelenmicrobiologie Bewaring, verpakking en opslag van levensmiddelen Bewaring van levensmiddelen Kwaliteit van levensmiddelen, voedselveiligheid Productontwikkeling van levensmiddelen Nieuwe voedingsmiddelen Humane voeding Humane voeding (algemeen) Humane voeding en gezondheid Toxicologie Toxicologie (algemeen) Milieutoxicologie, ecotoxicologie Milieuwetenschappen Milieuwetenschappen (algemeen) Remote sensing en Geografische Informatiesystemen Remote sensing Geografische informatiesystemen Ruimtelijke ordening Ruimtelijke ordening (algemeen) Landgebruiksplanning Landschapsarchitectuur Landschapsarchitectuur (algemeen) Geologie Geologie (algemeen) Bodemkunde Bodemkunde (algemeen) Bodemchemie Bodemfysica Bodemclassificatie Landevaluatie Grondbewerking Bodemdegradatie en bodembescherming Erosie Bodemvruchtbaarheid Bodembiologie Landinrichting Landinrichting (algemeen) Waterbeheer Waterbeheer (algemeen) Hydrologie Grondwaterhydrologie Agrohydrologie Irrigatie Waterkwaliteit Milieubeheer Milieubeheer (algemeen) Milieusystemen, milieusysteemanalyse Milieubeleid Milieuverontreiniging Bodemverontreiniging Natuurbeheer Natuurbeheer (algemeen) Natuurbescherming Biodiversiteit Ecologie Ecologie (algemeen) Aquatische ecologie Bosbouw Bosbouw (algemeen) Bosecologie Bosteelt Bosbeheer Bosbeleid Botanie Botanische technieken Plantentaxonomie Plantencelbiologie Plantenontwikkeling Plantenfysiologie Fotosynthese Plantengroei Plantenecologie Vegetatieonderzoek Biologie van bacterin, schimmels en planten Prokaryoten Cyanobacterin Schimmels Gewaswetenschappen Gewaswetenschappen (algemeen) Tuinbouw Plantaardige productiesystemen Landbouwplantenteelt Onkruidkunde Onkruidkunde (algemeen) Plantenveredeling- en genetica Plantenveredeling en -genetica (algemeen) Plantenveredeling, selectiemethoden Resistentieveredeling Plantenziekten, -plagen en afwijkingen Plantenziekten, -plagen en -afwijkingen (algemeen) Gastheer parasiet relaties Symptomen van plantenziekten en -plagen Landbouwkundige bacteriologie Landbouwkundige bacteriologie (algemeen) Landbouwkundige virologie (algemeen) Plantenvirussen Virussen van ongewervelden Landbouwkundige mycologie Landbouwkundige mycologie (algemeen) Landbouwkundige nematologie Landbouwkundige nematologie (algemeen) Plantenparasitaire nematoden Landbouwkundige entomologie en acaralogie Landbouwkundige entomologie en acaralogie (algemeen) Landbouwkundige entomologie Ecologische entomologie Fysiologische entomologie Plant- en gewasbescherming Plant- en gewasbescherming (algemeen) Biologische bestrijding Zooelogie Zooelogie (algemeen) Dierlijke ontwikkeling en levenscyclus Dierfysiologie en -biochemie Voortplanting en vruchtbaarheid Fysiologie van de diervoeding Stressfysiologie en adaptatie Immunologie Diergedrag en ethologie Dierecologie Biologie van diertaxonomische groepen Insecta Pisces Diergeneeskunde Diergeneeskunde (algemeen) Dierpathologie Infectieziekten Veterinaire epidemiologie Dierhouderij Dierhouderij (algemeen) Huisvesting, management en verzorging van dieren Gezondheid en welzijn van dieren Fokkerij en genetica Fokkerij en genetica (algemeen) Fokmethoden en voortplanting Diervoeding en -voedering Diervoeding en -voedering (algemeen) Dierlijke productiesystemen Dierlijke productiesystemen (algemeen) Aquacultuur en visserij Aquacultuur en visserij (algemeen) Aquacultuur Visserij Landbouwhuisdieren en dieren in gevangenschap Landbouwhuisdieren en dieren in gevangenschap (algemeen) 15136 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo105.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo105.xml
new file mode 100644
index 0000000..a13714d
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo105.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS OPUS Publikationsserver OPUS publication server http://ub.uni-hohenheim.de/uploads/tf/header.gif DE 9.198733 48.71024 1 http://ub.uni-hohenheim.de/62810.html Universität Hohenheim opus@uni-hohenheim.de OAI http://opus.ub.uni-hohenheim.de/oai2/oai2.php oai_dc 272 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo106.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo106.xml
new file mode 100644
index 0000000..d2d2793
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo106.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software ePub WU ePub WU http://epub.wu-wien.ac.at/images/ePub_logo_klein.jpg AT 16.357 48.230 1 http://epub.wu-wien.ac.at/english/ VIENNA UNIVERSITY OF ECONOMICS AND BUSINESS ADMINISTRATION hahsler@ai.wu-wien.ac.at OAI http://epub.wu-wien.ac.at/dyn/OAI/oaicgi.pl oai_dc 812 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo107.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo107.xml
new file mode 100644
index 0000000..bfc20ec
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo107.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS Univ. Konstanz: Konstanzer Online-Publikations-System (KOPS) Univ. Konstanz: Konstanzer Online-Publikations-System (KOPS) http://www.uni-konstanz.de/images/logo.png DE 9.187 47.689 1 http://www.ub.uni-konstanz.de/kops/ Univ. Konstanz arno.scharmann@uni-konstanz.de OAI http://www.ub.uni-konstanz.de/kops/oai2/oai2.php oai_dc 6220 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo108.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo108.xml
new file mode 100644
index 0000000..ffa6a7e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo108.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints fedOA fedOA http://www.fedoa.unina.it/due.gif IT 14.341 40.811 1 http://www.fedoa.unina.it/ University of Naples Federico II nicastro@unina.it OAI http://www.fedoa.unina.it/perl/oai2 oai_dc 2046 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo109.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo109.xml
new file mode 100644
index 0000000..3bf2c1e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo109.xml
@@ -0,0 +1,2 @@
+
+0 0 Hochschulschriftenserver(HSSS) SLUB Dresden, GERMANY, Document Server Electronic Publication Archive of the Saxon State and University Library Dresden http://www.slub-dresden.de/slub_logo_small.gif DE 13.7407 51.0536 1 http://hsss.slub-dresden.de/ ir268155@inf.tu-dresden.de OAI http://hsss.slub-dresden.de/oai/OAI-2.0 xmetadissplus xmetadiss epicur oai_dc Deutsche Nationalbibliografie Sachgruppe Wissenschaft und Kultur allgemein Schrift, Buch, Bibliothek, Information und Dokumentation Philosophie Psychologie Christliche Religion Allg. und Vgl. Religionswiss., Nichtchristliche Religionen Soziologie, Gesellschaft Statistik Politik Wirtschaft Recht 2952 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo11.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo11.xml
new file mode 100644
index 0000000..59eba04
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo11.xml
@@ -0,0 +1,2 @@
+
+0 0 dLibra Poznan Supercomputing and Networking Center (PSNC): Digital Library Framework (dLibra) Poznan Supercomputing and Networking Center (PSNC): Digital Library Framework (dLibra) http://dlibra.psnc.pl/images/stronka-logo-pcss-2.jpg PL 16.925 52.406 1 http://dlibra.psnc.pl/ Poznan Supercomputing and Networking Center (PSNC) dlibra@man.poznan.pl OAI http://dlibra.psnc.pl/biblioteka/oai-pmh-repository.xml oai_dc 117 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo110.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo110.xml
new file mode 100644
index 0000000..d370363
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo110.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Elektronische Dissertationen der Ruhr-Univ. Bochum Elektronische Dissertationen der Ruhr-Univ. Bochum http://www.ub.ruhr-uni-bochum.de/zentral_files/rub_schrift.gif DE 7.258 51.447 1 http://www.ub.ruhr-uni-bochum.de/DigiBib/DissWeb/E_Diss.html Universitaet Bochum markus.schmidt-essen@web.de OAI http://oai.ub.rub.de/oai/oai2.php oai_dc 2400 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo111.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo111.xml
new file mode 100644
index 0000000..e74ee99
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo111.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Pharmacy Eprints Pharmacy Eprints http://eprints.pharmacy.ac.uk/images/site.gif UK -0.122 51.524 0 http://eprints.pharmacy.ac.uk/ School of Pharmacy, Univ. of London library@pharmacy.ac.uk OAI http://eprints.pharmacy.ac.uk/cgi/oai2 oai_dc 892 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo112.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo112.xml
new file mode 100644
index 0000000..b5477ff
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo112.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat Oberta de Catalunya: Tesis Doctorals en Xarxa (TDX) Univ. Oberta de Catalunya: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES 2.133508 41.414938 1 http://www.tdx.cesca.es/ Universitat Oberta de Catalunya tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UOC/NDLTD-OAI/oai.pl oai_dc 3 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo113.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo113.xml
new file mode 100644
index 0000000..49c27c9
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo113.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software eDoc Server Max Planck Institute for Plasma Physics eDoc Server Max Planck Institute for Plasma Physics http://www.ipp.mpg.de/ippcms/de/images/logos/ippweblogo.gif DE 11.670434 48.262956 1 http://edoc.mpg.de/search.epl Max-Planck-Institut für Plasmaphysik vdm@zim.mpg.de OAI http://edoc.mpg.de/ac_ft_oai.pl oai_dc 1016 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo114.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo114.xml
new file mode 100644
index 0000000..accc381
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo114.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung OAR, het Open Archief van VIOE-publicaties OAR, het Open Archief van VIOE-publicaties http://www.vioe.be/uploads/f47.gif BE 4.357 50.860 1 http://oar.vioe.be/ Vlaams Instituut voor het Onroerend Erfgoed bart.debunne@rwo.vlaanderen.be OAI http://oar.vioe.be/oai2.php oai_dc 166 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo115.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo115.xml
new file mode 100644
index 0000000..0acdcb6
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo115.xml
@@ -0,0 +1,3 @@
+
+0 0 PUMA National Research Council Faenza - ISTEC Repository National Research Council Faenza - ISTEC Repository http://www.istec.cnr.it/img/top01.gif IT 11.88333 44.28333 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/cnrpConf/cnr_istec-pub-list.sys.file_x Institute of Science and Technology for
+Ceramics Faenza - CNR Torino giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 30 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo116.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo116.xml
new file mode 100644
index 0000000..17bc484
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo116.xml
@@ -0,0 +1,2 @@
+
+0 0 MONARCH - Dokumenten- und Publikationsservice MONARCH - Dokumenten- und Publikationsservice DE 12.9214 50.836 1 archiv@hrz.tu-chemnitz.de OAI http://archiv.tu-chemnitz.de/cgi-bin/interfaces/oai/oai2.pl oai_dc xmetadiss Objects having a formal publication type; Objekte mit einem formalen Dokumenttyp Journal Articles; Zeitschriftenartikel Conference Proceedings; Tagungs- und Konferenzbeitraege Dissertations and Professional Dissertations; Dissertationen und Habilitationen Lectures; Vorlesungen Diploma Theses; Diplomarbeiten Books, Monographs; Buecher, Monographien Reports; Berichte 1716 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo117.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo117.xml
new file mode 100644
index 0000000..60bd91e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo117.xml
@@ -0,0 +1,2 @@
+
+0 0 Archimer, Archive Institutionnelle de l'Ifremer ArchiMer, Institutional Archive of Ifremer http://www.ifremer.fr/docelec/imgborders/logo.gif FR -4.4862 48.3903 1 http://www.ifremer.fr/docelec/ Institut français de recherche pour l'exploitation de la mer archimer-admin@ifremer.fr OAI http://www.ifremer.fr/docelec/oai/OAIHandler oai_dc 3985 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo118.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo118.xml
new file mode 100644
index 0000000..131b249
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo118.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Univ. Murcia: Tesis Doctorals en Xarxa (TDX) Univ: Murcia: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES -1.125843 37.988425 1 http://www.tdx.cesca.es/ Universidad de Murcia :tdr@cesca.es OAI http://www.tdr.cesca.es/TDR_UM/NDLTD-OAI/oai.pl oai_dc 151 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo119.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo119.xml
new file mode 100644
index 0000000..08c0b18
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo119.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints SOAS Eprints School of Oriental and African Studies Library: SOAS' Library Eprints Online Research Repository http://www.soas.ac.uk/libfiles/soaseprintstitle.gif UK -0.12 51.52 0 http://eprints.soas.ac.uk/ mailto:lib-eprints@soas.ac.uk OAI http://eprints.soas.ac.uk/perl/oai2 oai_dc 5457 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo12.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo12.xml
new file mode 100644
index 0000000..a79f499
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo12.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Bologna - ISOF Repository National Research Council Bologna - ISOF Repository http://www.isof.cnr.it/IMMAGINI/logoisofrifeng.jpg IT 11.30 44.53 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/cnrpConf/cnr_isof-pub-list.sys.file_x Institute for Organic Syntheses and Photoreactivity - CNR Bologna giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 11 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo120.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo120.xml
new file mode 100644
index 0000000..3f69848
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo120.xml
@@ -0,0 +1,3 @@
+
+0 0 PUMA National Research Council Bologna - ISAC Repository National Research Council Bologna - ISAC Repository http://www.isac.cnr.it/images/isac.gif IT 11.30 44.53 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/cnrpConf/cnr_isac-pub-list.sys.file_x Institute of atmospheric sciences and
+climate - CNR Bologna giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 1 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo121.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo121.xml
new file mode 100644
index 0000000..62e7245
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo121.xml
@@ -0,0 +1,2 @@
+
+0 0 Online-Publikationsservice der Universitaet Tuebingen Online-Publikationsservice der Universitaet Tuebingen DE 9.0490 48.5204 1 OAI http://w210.ub.uni-tuebingen.de/dbt/oai/oai2.php oai_dc 2995 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo122.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo122.xml
new file mode 100644
index 0000000..9f0df64
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo122.xml
@@ -0,0 +1,2 @@
+
+0 0 mediatum mediaTUM mediaTUM http://portal.mytum.de//header1n.gif DE 10.739838 48.714629 1 http://mediatum2.ub.tum.de/ Techn. Univ. München mediatum2@ub.tum.de OAI http://mediatum2.ub.tum.de/oai/oai oai_dc 3730 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo123.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo123.xml
new file mode 100644
index 0000000..f0c85f1
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo123.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpace at Cambridge Univ. of Cambridge: DSpace http://www.dspace.cam.ac.uk/image/title-left.jpg UK 0.1223 52.208 0 http://www.dspace.cam.ac.uk/ info@dspace.cam.ac.uk OAI http://www.dspace.cam.ac.uk/dspace-oai/request oai_dc 2nd Annual Lecture Series in Sustainable Development 2004 Anthropological Ancestors Audio collection Cambridge Working Papers in Economics CamRAD Rock-Art images China 2004 Clinical Skills Online D. H. Mellor Digital Himalaya Digital Orient Dutch Early Digital Chemical Objects English File formats and supporting software French German Greek History Kilise Tepe Kilise Tepe - dark archive Latin LLCC Dark Collection Miscellaneous Nepal Materials Northern Skies, Southern Stars Preprints Publications Published papers and preprints RFC collection (Requests For Comments) Royal Commonwealth Society Senate house graduation photography, 9 December 2006 The Fitzwilliam Museum Corporate Publications The Heinrich Schenker Correspondence Theses Video collection WWMM 172242 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo124.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo124.xml
new file mode 100644
index 0000000..f25ca64
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo124.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Univ. Girona: Tesis Doctorals en Xarxa (TDX) Univ. Girona: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES 2.827 41.985 1 http://www.tdx.cesca.es/ Universitat de Girona tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UdG/NDLTD-OAI/oai.pl oai_dc 329 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo125.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo125.xml
new file mode 100644
index 0000000..9a66e7e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo125.xml
@@ -0,0 +1,2 @@
+
+0 0 SciX ELPUB : Digital Library ELPUB : Digital Library http://elpub.scix.net/logo.gif SI 14.5 46.05 1 http://elpub.scix.net/cgi-bin/works/Home ELPUB b.martens@tuwien.ac.at OAI http://elpub.scix.net/cgi-bin/works/OAI oai_dc 534 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo126.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo126.xml
new file mode 100644
index 0000000..817c391
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo126.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Archivo Digital UPM Archivo Digital UPM http://oa.upm.es/images/upm_cabecera.gif ES -3.628697 40.388724 1 http://oa.upm.es/ Universidad Politécnica de Madrid archivo.digital@upm.es OAI http://servmadrono.cs.urjc.es:8010/arcFuturo/servlet/OAIDPupm oai_dc 970 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo127.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo127.xml
new file mode 100644
index 0000000..7bd9bcf
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo127.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpace at University Leiden DSpace at Leiden University NL 4.4946 52.1545 1 https://openaccess.leidenuniv.nl/ dspace-help@library.leidenuniv.nl OAI http://openaccess.leidenuniv.nl/dspace-oai/request dare_didl oai_dc Africanists at Leiden University African Studies Centre Archaeology Arts DAREnet Dissertations Dissertations Online E-depot Electronisch Depot Nederlandse Archeologie Institute of Environmental Sciences ISIM ISIM Annual Reports ISIM Dissertations ISIM Paper ISIM Review Keur der Wetenschap Law Mathematics and Natural Sciences Medicine / Leiden University Medical Center (LUMC) Open Access Leiden Other ISIM Publications Philosophy Popularising publications Professional publications Scholarly publications Social and Behavioural Sciences Special Lectures Online Theology Institutional Repository Leiden University Other types of publications 9030 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo128.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo128.xml
new file mode 100644
index 0000000..c63c135
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo128.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpace at Vrije Universiteit Amsterdam DSpace Digital Academic REpository (DARE) of the Vrije Universiteit Amsterdam http://dare.ubvu.vu.nl/image/dspace-blue.gif NL 4.88333 52.3667 1 http://dare.ubvu.vu.nl/index.jsp r.feenstra@ubvu.vu.nl OAI http://dspace.ubvu.vu.nl/oai/request dare_qdc dare_dc oai_dc 7454 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo129.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo129.xml
new file mode 100644
index 0000000..2e45182
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo129.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints University of Newcastle Library E-Print Archives Univ of Newcastle Library E-Print Pilot http://rogue.ncl.ac.uk/images/header_main_pic.jpg UK -1.6123 54.9773 0 http://rogue.ncl.ac.uk/ mark.gavillet@ncl.ac.uk OAI http://rogue.ncl.ac.uk/xml/index.php oai_dc 01 Cardiovascular Medicine 02 Cancer Studies 03 Infection and Immunology 04 Other Hospital Based Clinical Subjects 05 Other Laboratory Based Clinical Subjects 06 Epidermiology and Public Health 07 Health Services Research 08 Primary Care and Other Community Based Clinical Subjects 09 Psychiatry Neuroscience and Clinical Psychology 10 Dentistry 11 Nursing and Midwifery 12 Allied Health Professions and Studies 13 Pharmacy 14 Biological Sciences 15 Pre-clinical and Human Biological Sciences 16 Agriculture Veterinary and Food Science 17 Earth Systems and Environmental Sciences 18 Chemistry 19 Physics 20 Pure Mathematics 21 Applied Mathematics 22 Statistics and Operational Research 23 Computer Science 24 Electrical and Electronic Engineering 25 General Engineering and Mineral and Mining Engineering 26 Chemical Engineering 27 Civil Engineering 28 Mechanical Aeronautical and Manufacturing Engineering 29 Metallurgy and Materials 30 Architecture and the Built Environment 31 Town and Country Planning 32 Geography and Environmental Studies 33 Archaeology 34 Economics and Econometrics 35 Accounting and Finance 36 Business and Management Studies 37 Library and Information Management 38 Law 39 Politics and International Studies 40 Social Work Social Policy and Administration 41 Sociology 42 Anthropology 43 Development Studies 44 Psychology 45 Education 46 Sports-Related Studies 47 American Studies and Anglophone Area Studies 48 Middle Eastern and African Studies 49 Asian Studies 50 European Studies 51 Russian Slavonic and East European Languages 52 French 53 German Dutch and Scandinavian Languages 54 Italian 55 Iberian and Latin American Languages 56 Celtic Studies 57 English Language and Literature 58 Linguistics 59 Classics Ancient History Byzantine and Modern Greek Studies 60 Philosophy 61 Theology Divinity and Religious Studies 62 History 63 Art and Design 64 History of Art Architecture and Design 65 Drama Dance and Performing Arts 66 Communication Cultural and Media Studies 67 Music General Central Services Newcastle Law School School of Agriculture Food and Rural Development School of Architecture Planning and Landscape School of Arts and Cultures School of Biology School of Biomedical Sciences School of Chemical Engineering and Advanced Materials School of Civil Engineering and Geosciences School of Clinical and Laboratory Sciences School of Clinical Medical Sciences School of Computing Science School of Dental Sciences School of Education Communication and Language Sciences School of Electrical Electronic and Computer Engineering School of English Literature Language and Linguistics School of Geography Politics and Sociology School of Historical Studies School of Marine Science and Technology School of Mathematics and Statistics School of Mechanical and Systems Engineering School of Medical Education Development School of Modern Languages School of Natural Sciences School of Neurology Neurobiology and Psychiatry School of Population and Health Sciences School of Surgical and Reproductive Sciences The Language Centre University of Newcastle upon Tyne Business School University of Newcastle upon Tyne Medical School 5370 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo13.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo13.xml
new file mode 100644
index 0000000..64b07df
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo13.xml
@@ -0,0 +1,2 @@
+
+0 0 CDSware Aristotle University of Thessaloniki Aristotle University of Thessaloniki http://www.lib.auth.gr/images/site/gr/mentor7.png GR 22.972 40.625 2 http://cds.lib.auth.gr/ Aristotle University of Thessaloniki theod@skiathos.physics.auth.gr OAI http://cds.lib.auth.gr/cgi-bin/cds/oai2d oai_dc 1634 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo130.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo130.xml
new file mode 100644
index 0000000..096aab8
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo130.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Nottingham eTheses Nottingham eTheses http://www.nottingham.ac.uk/is/images/vis-logo.jpg UK -1.19466 52.934504 0 http://etheses.nottingham.ac.uk/ University of Nottingham etheses@nottingham.ac.uk OAI http://etheses.nottingham.ac.uk/perl/oai2 oai_dc 261 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo131.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo131.xml
new file mode 100644
index 0000000..353039b
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo131.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpace at Open Universiteit Nederland Open Univ. Nederland: DSpace http://dspace.ou.nl/dspace-oai/request NL 5.9833 50.9 1 http://dspace.ou.nl/ info-dspace@ou.nl OAI http://dspace.ou.nl/dspace-oai/request oai_dc 1. IDR: Publications and Preprints 1. LN4LD IMS-LD packages 1. Publications and Preprints 1. TENC: Publications and Preprints 2. Example IMS-LD packages 2. Presentations 2. TENC: Presentations 3. Internal: LD-packages 3. Specifications 3. TENC: Specifications 4. Software and Documentation 4. TENC: Software and Documentation 5. Papers, Reports, Thesis, Work Documents 5. TENC: Deliverables and Milestones 6. Internal: Documents 6. TENC: Work Documents 7. Internal: archive of originals 7. TENC: Internal: Documents 8. TENC: Internal: archive of originals Keur der Wetenschap 26 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo132.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo132.xml
new file mode 100644
index 0000000..ab015c1
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo132.xml
@@ -0,0 +1,2 @@
+
+DSpace 0 0 Repositorio Institucional da FCT-UNL FCTUNL Institutional Repository http://validator.driver.research-infrastructures.eu/validatorWeb/getRepositoryImage.do?&repositoryId=1-64066e8e-c306-4cc6-94f2-a1c492b40b9a_UGVuZGluZ1JlcG9zaXRvcnlSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU= POR -9.1598935 38.7339073 0.0 http://dspace.fct.unl.pt http://www.fct.unl.pt paulo.matos@fct.unl.pt OAI http://dspace.fct.unl.pt/oai/request oai_dc All sets 383 0.0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo133.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo133.xml
new file mode 100644
index 0000000..ea4b701
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo133.xml
@@ -0,0 +1,2 @@
+
+0 0 Doks Eindwerkensite Katholieke Hogeschool Kempen Doks @ KHK http://doks2.khk.be/eindwerk/assets/img/logo.gif BE 4.881706 51.136278 1 http://doks2.khk.be/eindwerk/do/folder/View?dispatch=info Katholieke Hogeschool Kempen doks@khk.be OAI http://doks2.khk.be/eindwerk/oai dc 4049 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo134.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo134.xml
new file mode 100644
index 0000000..ab1b612
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo134.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat Politecnica de Catalunya Universitat Politecnica de Catalunya http://www.tdx.cesca.es/images/tdx/logos_unis/logofull_UPC_transp.gif ES 2.18 41.41 1 http://www.tdx.cesca.es/UPC.html Universitat Politecnica de Catalunya tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UPC/NDLTD-OAI/oai.pl oai_dc 811 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo135.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo135.xml
new file mode 100644
index 0000000..7c04eee
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo135.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Publications of the Universiteit van Amsterdam Univ. van Amsterdam: Scripties Online http://dare.uva.nl/u/uvascript/graphics/header-top.jpg NL 4.890174 52.368765 1 http://dare.uva.nl/cgi/b/bib/bib-idx?c=uvascript dpcmedewerkers-uba@uva.nl OAI http://dare.uva.nl/cgi/arno/oai/uvapub dare_didl oai_dc arno imsmd_v1p2 Keur der Wetenschap Keur der Wetenschap Scholar Economics Scholar Economics Full text available Full text available 8412 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo136.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo136.xml
new file mode 100644
index 0000000..4c21c93
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo136.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Waterford Inst. of Technology: WIT Institutional Repository Waterford Inst. of Technology: WIT Institutional Repository http://waterfordnewmusicweek.com/newlib/images/liblogo.gif IE -7.15 52.241 0 http://eprints.wit.ie/ Waterford Institute of Technology (WIT) dkane@wit.ie OAI http://eprints.wit.ie/cgi/oai2 oai_dc 335 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo137.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo137.xml
new file mode 100644
index 0000000..ebca93f
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo137.xml
@@ -0,0 +1,2 @@
+
+0 0 Pica-Verbundkatalog OAI-Repository SUB Goettingen GOEDOC document server of Goettingen University (SUB Goettingen) http://vts.uni-ulm.de/standards/logo_vts.jpg DE 9.93 51.53 1 http://webdoc.sub.gwdg.de/ kinstler@gbv.de OAI http://www.gbv.de/goai/gbvrep.php oai_dc mabxml-1 Online-Dissertationen der SUB Goettingen 1755 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo138.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo138.xml
new file mode 100644
index 0000000..5b404b8
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo138.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Kobra - DSpace an der Universität Kassel Univ. of Kassel: KOBRA (Kasseler Online Bibliothek Repository and Archiv) http://dare.uva.nl/u/uvadis/graphics/header-print.jpg DE 9.502082 51.32064 1 http://kobra.bibliothek.uni-kassel.de/ dspace-master@bibliothek.uni-kassel.de OAI http://kobra.bibliothek.uni-kassel.de/dspace-oai oai_dc 2002 2004 2005 2006 2007 Arbeitspapiere DSpace Workshop Das Recht, gut regiert zu werden Die Brueder Murhard und ihre Zeit Diplomarbeiten Diplomarbeiten Diplomarbeiten Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen Dissertationen (aus den beteiligten Instituten) Dissertationen (aus den beteiligten Instituten) Dissertationen (aus den beteiligten Instituten) Dissertationen (aus den beteiligten Instituten) Erziehung-, Schul- und Bildungswesen Handschriftenabteilung In guter Gesellschaft ? - Unkonventionelle Lebensformen Institutsuebergreifende Veroeffentlichungen Institutsuebergreifende Veroeffentlichungen Institutsuebergreifende Veroeffentlichungen Jahresberichte Kasseler Informatikschriften (KIS) Kasseler Online-Schriften zur Didaktik der Stochastik Kuenstlerbuecher Landwirtschaft, Veterinaermedizin Magisterarbeiten Magisterarbeiten Medizin und Gesundheit OneWorld Perspectives Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Publikationen Sozialwissenschaften, Soziologie Testsammlung Treffpunkt Eulensaal Veroeffentlichungen Veroeffentlichungen Werkstattberichte Wissenensgesellschaft - Eliten oder die Weisheit der Vielen test2 1264 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo139.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo139.xml
new file mode 100644
index 0000000..7535825
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo139.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace BURJC-DIGITAL Universidad Rey Juan Carlos BURJC-DIGITAL Universidad Rey Juan Carlos http://eciencia.urjc.es/dspace/image/logo.gif ES -3.872745 40.334719 1 http://eciencia.urjc.es/dspace/ Universidad Rey Juan Carlos biblioteca.proyectoeciencia@urjc.es OAI http://servmadrono.cs.urjc.es:8010/arcFuturo/servlet/OAIDPurjc oai_dc 187 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo14.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo14.xml
new file mode 100644
index 0000000..56b497e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo14.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS Propylaeum-DOK Publikationsplattform Altertumswissenschaften Propylaeum-DOK - Digital Repository Classical Studies http://archiv.ub.uni-heidelberg.de/propylaeumdok/Icons/propylaeum_dok.gif DE 8.707999 49.409922 1 http://archiv.ub.uni-heidelberg.de/propylaeumdok/index.php?&la=en Universität Heidelberg Effinger@ub.uni-heidelberg.de OAI http://archiv.ub.uni-heidelberg.de/propylaeumdok/oai2/oai2.php oai_dc 156 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo140.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo140.xml
new file mode 100644
index 0000000..4cdb1fa
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo140.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace PADIS PADIS http://padis.uniroma1.it/immagini/benvenuti.gif IT 12.512 41.904 1 http://padis.uniroma1.it/ Universita di Roma padis@linuxhelp.uniroma1.it OAI http://padis.uniroma1.it/oai2d.py/ oai_dc 355 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo141.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo141.xml
new file mode 100644
index 0000000..86e48be
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo141.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints The Depot The Depot http://www.depot.edina.ac.uk/images/newlogo_solidbackground.gif UK -3.176015 55.921585 0 http://www.depot.edina.ac.uk/ JISC Ian.Stuart@ed.ac.uk OAI http://deposit.depot.edina.ac.uk/cgi/oai2 oai_dc 67 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo142.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo142.xml
new file mode 100644
index 0000000..df0e411
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo142.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace UDCDspace UDCDspace http://dspace.udc.es/image/LogoDSpace.jpg ES -8.39 43.371 1 http://dspace.udc.es/ Universidade da Coruña dspace-admin@udc.es OAI http://dspace.udc.es/dspace-oai/request oai_dc 458 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo143.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo143.xml
new file mode 100644
index 0000000..34dc067
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo143.xml
@@ -0,0 +1,2 @@
+
+0 0 DIVA Publikationer fran Karlstads Universitet Publikationer fran Karlstads Universitet http://www.intra.kau.se/bilder/kaugrafik/kaulogga.gif SE 13.580 59.406 1 http://www.diva-portal.org/kau/ Karlstads Univ. diva-support@ub.uu.se OAI http://www.diva-portal.org/oai/kau/OAI oai_dc 1610 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo144.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo144.xml
new file mode 100644
index 0000000..72a719e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo144.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI pub.fontys.nl Fontys Hogescholen: iPort http://www.fontysmediatheek.nl/images/uploads/fontyslogotrans.gif NL 5.08333 51.5667 1 http://www.fontyspublicaties.nl/ wilko.haast@uvt.nl OAI http://www.fontyspublicaties.nl/oai/pub.fontys.nl.cgi arno oai_dc dare_didl Only records that have full text available Only records that have full text available 1591 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo145.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo145.xml
new file mode 100644
index 0000000..6a3dd01
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo145.xml
@@ -0,0 +1,2 @@
+
+0 0 Opus PsyDok, Psychologie Open Access Server der Saarlaendischen Universitaets- und Landesbibliothek PsyDok: Volltextserver der Virtuellen Fachbibliothek Psychologie (Host: Saarland Univ.) http://psydok.sulb.uni-saarland.de/Icons/psy.gif DE 6.9982 49.23 1 http://psydok.sulb.uni-saarland.de/ mailto:psydok@sulb.uni-saarland.de OAI http://psydok.sulb.uni-saarland.de/phpoai/oai2.php oai_dc epicur oai_pp xMetaDiss Library and information sciences Psychology Social sciences General statistics Law Education Medical sciences Medicine The arts Athletic and outdoor sports and games Article Book InBook InProceedings Journal Lecture MastersThesis Misc Preprint Proceedings ResearchPaper Teaching Material TechReport Text.Thesis.Bachelor Text.Thesis.Doctoral Text.Thesis.Habilitation 1633 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo146.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo146.xml
new file mode 100644
index 0000000..28fd304
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo146.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Estudo Geral Estudo Geral https://estudogeral.sib.uc.pt:8443/dspace/image/uc/bannerTop.jpg PT -8.426095 40.207453 0 http://estudogeral.sib.uc.pt:8443/dspace/ University of Coimbra inf@sib.uc.pt OAI https://estudogeral.sib.uc.pt:8443/dspace-oai/request oai_dc 2970 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo147.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo147.xml
new file mode 100644
index 0000000..847af7d
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo147.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Surrey Scholarship Online Surrey Scholarship Online http://epubs.surrey.ac.uk/assets/md5images/f3fd44d7614028b1200fb79c9d4eb18b.gif UK -0.587 51.242 1 http://epubs.surrey.ac.uk/ University of Surrey support@dc.bepress.com OAI http://epubs.surrey.ac.uk/cgi/oai2.cgi oai_dc 852 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo148.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo148.xml
new file mode 100644
index 0000000..1d680a2
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo148.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace RUDAR - Roskilde University Digital Archive RUDAR - Roskilde University Digital Archive http://diggy.ruc.dk/image/rudar-logo.png DK 12.080 55.641 1 http://diggy.ruc.dk/ Roskilde Univ. http://diggy.ruc.dk/image/rudar-logo.png OAI http://diggy.ruc.dk:8080/dspace-oai/request oai_dc 3263 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo149.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo149.xml
new file mode 100644
index 0000000..c4a84ec
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo149.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpace at UGent Gent Univ.: ePrints http://admin.driver.research-infrastructures.eu/images/repositoryLogos/logo-boekentoren.png BE 3.7286 51.0556 1 https://archive.ugent.be/ libservice@ugent.be OAI http://archive.ugent.be/oai/ oai_dc Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) Faculty of Agricultural and Applied Biological Sciences (LA) 5028 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo15.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo15.xml
new file mode 100644
index 0000000..f482687
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo15.xml
@@ -0,0 +1,2 @@
+
+0 0 AUP publications AUP publications NL 4.893 52.37 1 dpcmedewerkers-uba@uva.nl OAI http://dare.uva.nl/cgi/arno/oai/aup dare_didl oai_dc arno imsmd_v1p2 Keur der Wetenschap Keur der Wetenschap Scholar Economics Scholar Economics Full text available Full text available 65 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo150.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo150.xml
new file mode 100644
index 0000000..40ee0de
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo150.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace TARA TARA http://www.tara.tcd.ie/image/tcd_top.gif IE -6.258 53.345 0 http://www.tara.tcd.ie/ Dublin University, Trinity College nbrennan@tcd.ie OAI http://www.tara.tcd.ie/dspace-oai/request oai_dc 7230 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo151.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo151.xml
new file mode 100644
index 0000000..8984444
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo151.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Pisa - ISTI Repository National Research Council Pisa - ISTI Repository http://www.isti.cnr.it/images/istiweb.gif IT 10.42 43.71 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/cnrConf/cnr-pub-list.sys_1.file Istituto di Scienza e Tecnologie dell'Informazione - CNR Pisa giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 1779 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo152.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo152.xml
new file mode 100644
index 0000000..35cf29a
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo152.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Document Server@UHasselt Document Server@UHasselt http://doclib.uhasselt.be/dspace/image/UHasselt.jpg BE 5.338 50.929 1 http://doclib.uhasselt.be/dspace/ Univ. Hasselt marc.goovaerts@uhasselt.be OAI http://uhdspace.uhasselt.be/dspace-oai/request oai_dc 1605 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo153.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo153.xml
new file mode 100644
index 0000000..2f33270
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo153.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Edinburgh Research Archive Univ. of Edinburgh: Edinburgh Research Archive http://www.era.lib.ed.ac.uk/image/is_logo_era.jpg UK -3.2 55.95 0 http://www.era.lib.ed.ac.uk/ University of Edinburgh era.admin@ed.ac.uk OAI http://www.era.lib.ed.ac.uk/dspace-oai/request oai_dc Acoustics and Fluid Dynamics (Theses and Dissertations) Atmospheric and Environmental Science Atmospheric and Environmental Science (Theses and Dissertations) Biomedical and Clinical Laboratory Sciences Biophysical Chemistry Biophysical Chemistry (Theses and Dissertations) BRE Research Publications BRE Theses and Dissertations Centre for Inflammation Research Centre for Inflammation Research Centre for Intelligent Systems and their Applications Centre for Intelligent Systems and their Applications (Theses and Dissertations) Centre of African Studies Centre of African Studies (Theses and Dissertations) Chemical Biology Chemical Biology (Theses and Dissertations) Condensed Matter Condensed Matter (Theses and Dissertations) CRFR Publications CSTR PhD Theses CSTR publications Department of Artificial Intelligence Digital Communications (Theses and Dissertations) Digital Curation Centre Digital Library Division Directorate of Undergraduate Learning and Teaching (Theses and Dissertations) Divinity PhD theses Division of Clinical Neurosciences Division of Neuroscience Division of Psychiatry Earth Science Earth Sciences (Theses and Dissertations) EDINA Energy Systems Energy Systems (Theses and Dissertations) European Languages and Cultures FireGrid Cluster Geography Geography (Theses and Dissertations) Geometry and Topology Historical Theses History and Classics PhD Theses History of Art PhD theses Informatics (British University in Dubai theses) Infrastructure and Environment (Theses and Dissertations) Inorganic Chemistry Inorganic Chemistry (Theses and Dissertations) Institute for Adaptive and Neural Computation Institute for Adaptive and Neural Computation (Theses and Dissertations) Institute for Astronomy (Theses and Dissertations) Institute for Communicating and Collaborative Systems Institute for Communicating and Collaborative Systems (Theses and Dissertations) Institute for Computing Systems Architecture Institute for Computing Systems Architecture (Theses and Dissertations) Institute for Immunology and Infection Research (3IR) Institute for Immunology and Infection Research (Theses and Dissertations) Institute for Stem Cell Research (ISCR) Institute for Stem Cell Research (Theses and Dissertations) Institute of Cell Biology (ICB) Institute of Cell Biology (Theses and Dissertations) Institute of Evolutionary Biology Institute of Evolutionary Biology (Theses and Dissertations) Institute of Geography Online Papers Series Institute of Molecular Plant Sciences Institute of Perception, Action and Behaviour Institute of Perception, Action and Behaviour (Theses and Dissertations) Institute of Structural and Molecular Biology Integrated Micro and Nano Systems (Theses and Dissertations) Laboratory for Foundations of Computer Science Laboratory for Foundations of Computer Science (Theses and Dissertations) Library (General) Linguistics and English Language PhD theses Management School and Economics PhD Theses Materials Materials and Processes (Theses and Dissertations) Materials (Theses and Dissertations) Medical Genetics Section Molecular and Clinical Medicine Molecular and Optical Science (Theses and Dissertations) MSc by Research in Geographical Information Science MSc by Research in Geographical Information Science and Society MSc Geographical Information Science Nursing Studies (Theses and Dissertations) Organic Synthesis Organic Synthesis (Theses and Dissertations) Particle Physics Experiments (Theses and Dissertations) Philosophy PhD theses Philosophy research publications Physical Chemistry/Chemical Physics Physical Chemistry/Chemical Physics (Theses and Dissertations) Politics Politics (Theses and Dissertations) Psychology PhD theses Psychology research publications Report on Cardington Tests Royal (Dick) School of Veterinary Studies PhD Theses School of Clinical Sciences and Community Health PhD Theses Scottish History Social Anthropology (Theses and dissertations) Sociology Sociology (Theses and Dissertations) StORe project Structural Chemistry Structural Chemistry (Theses and Dissertations) TESOL (Theses and Dissertations) The Centre for the Study of Christian Origins Theoretical and Applied Linguistics (Theses and Dissertations) Theses and Dissertations Undergraduate Psychology Honours Final Year Dissertations Veterinary Biomedical Sciences Veterinary Clinical Studies 2028 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo154.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo154.xml
new file mode 100644
index 0000000..8f51a1e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo154.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universidad de Cantabria: Tesis Doctorals en Xarxa (TDX) Univ. of Cantabria: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES -3.793493 43.472402 1 http://www.tdx.cesca.es/ Universidad de Cantabria tdx@cesca.es OAI http://www.tdr.cesca.es/TDR_UC/NDLTD-OAI/oai.pl oai_dc 58 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo155.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo155.xml
new file mode 100644
index 0000000..adafc20
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo155.xml
@@ -0,0 +1,2 @@
+
+0 0 KNAW Royal Netherlands Acad. Of Arts and Sciences: Netherlands Inst. For Scientfic Inf. Sciences http://www.niwi.knaw.nl/algemeen/logo.gif NL 4.897742 52.369622 1 http://www.niwi.knaw.nl/english/index.html Royal Netherlands Acad. Of Arts and Sciences: Netherlands Inst. For Scientfic Inf. Sciences arjan.hogenaar@bureau.knaw.nl OAI http://www.repository.knaw.nl/repository/knaw/oai oai_dc dare_didl dare keur 1492 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo156.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo156.xml
new file mode 100644
index 0000000..94ce902
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo156.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat Jaume I: Tesis Doctorals en Xarxa (TDX) Universitat Jaume I: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES -0.064777 39.992815 1 http://www.tdx.cesca.es/ Universitat Jaume I tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UJI/NDLTD-OAI/oai.pl oai_dc 160 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo157.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo157.xml
new file mode 100644
index 0000000..ea8a6e4
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo157.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Pisa - IFC Repository National Research Council Pisa - IFC Repository http://leonardo.isti.cnr.it/metaopac/sfondi/ifc.jpg IT 10.42 43.71 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/cnrConf/ifc-pub-list.sys.file Istituto di Fisiologia Clinica - CNR Pisa giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 147 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo158.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo158.xml
new file mode 100644
index 0000000..acc4c56
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo158.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Pisa - IIT Repository National Research Council Pisa - IIT Repository http://www.iit.cnr.it/english/images/top_banner.gif IT 10.42 43.71 1 http://puma.isti.cnr.it Institute for Informatics and Telematics - CNR Pisa giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 194 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo159.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo159.xml
new file mode 100644
index 0000000..39d8737
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo159.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Linköping University Electronic Press Linköping University Electronic Press http://www.liu.se/mall06/grafik/logotyp_liggande.gif SE 15.57297 58.400392 1 http://www.ep.liu.se/index.en.html Linköping University diva-support@ub.uu.se OAI http://www.diva-portal.org/oai/liu/OAI oai_dc 5354 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo16.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo16.xml
new file mode 100644
index 0000000..be18a1b
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo16.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI University of Twente Publications Univ. of Twente: Repository (i-TOR) http://doc.utwente.nl/images/utlogo_en.gif NL 6.9 52.2167 1 http://doc.utwente.nl/en/ a.g.jippes@utwente.nl OAI http://doc.utwente.nl/cgi/oai2 oai_dc dare_didl mets context_object Full-text = Restricted Full-text = Public Full-text = None Group = KEUR Group = CSTM 7181 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo160.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo160.xml
new file mode 100644
index 0000000..472ce81
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo160.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Dissertations of the Universiteit van Amsterdam Univ. van Amsterdam: Dissertations Online http://dare.uva.nl/u/uvadis/graphics/header-print.jpg NL 4.890174 52.368765 1 http://dare.uva.nl/cgi/b/bib/bib-idx?c=uvadis Universiteit van Amsterdam dpcmedewerkers-uba@uva.nl OAI http://dare.uva.nl/cgi/arno/oai/uvadis dare_didl oai_dc arno imsmd_v1p2 Keur der Wetenschap Keur der Wetenschap Scholar Economics Scholar Economics Full text available Full text available 2344 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo161.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo161.xml
new file mode 100644
index 0000000..513a190
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo161.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints HAL - Hyper Article on Line CCSD (Centre pour la Communication Scientifique Directe): HAL - Hyper Article on Line http://hal.archives-ouvertes.fr/images/hal.gif FR 4.883 45.767 1 http://hal.archives-ouvertes.fr/ hal@ccsd.cnrs.fr OAI http://hal.ccsd.cnrs.fr/oai/oai.php oai_hal oai_hal Biology and Medicine Biochemistry and Molecular Biology Biological Sciences Biomecanics Biomedical Ingeniering Biostatistics Cellular Biology Immunology Medication Sciences Neurosciences Organisms biology Plant biology Reproduction biology Others Areas Physico-chemical sciences and pharmaceutical technologie Physiology Population Biology and Ecology Chemical Sciences Catalysis Materials Science Others areas Communication and Information Sciences Bibliometry, scientometry Cinema, art, esthetics Conflicts, information strategy, intelligence Economy, cultural industry Education, e-learning, training Electronic publishing Geopolitics History of information/communication Hypertext, hypermedia Information retrieval Information system engineering Information/communication law Knowledge management Local authorities Mass media Museology Organisation and communication Others Areas Public Sphere Scientific communication and information Sociology of information and communication Theory of information/communication Computer Science HCI, Images Processing, Data Management, Knowledge Systems Modelling and Scientific Computing Networks and Systems Others Areas Software Engineering and Symbolic Computing Engineering Sciences Civil Engineering Geotechnique Materials and Structures Control Energy Industrial engineering Materials, Mechanics Microelectronics Others Areas Process Engineering Robotics Signal Humanities and Social Sciences Human sciences Biological Anthropology History Social anthropology Languages, knowledge and creation Literature Musicology Philosophy Sciences of the language Others Areas Psychology Social sciences Economics Geography and installation Law Management Political Sciences Sociology Mathematics Other area Physics Acoustics Astroparticle and Cosmology Astrophysics Condensed matter Electronic Systems Magnetism Quantum fluids Supraconductivity Thin Layers Hydrodynamics and Complex Fluids Materials under irradiation Nanophysics Non-Linear Physics Nuclear Physics Others Areas Particle Physics Pluridisciplinary Physics-Biology Physics-Economy Physics-Environment Quantum Optics, Atomic and Molecular Physics Collisional Physics Lasers and materials Molecules Statistical Physics Disordered and/or Out of Equilibrium Systems Phase Transitions Soft Matter Surfaces and Interfaces Theoretical and Mathematical Physics Sciences of education Sciences of the Universe Astrophysics Earth Sciences Geology Geochemistry Geochronology Geodynamic of continental lithosphere Geomaterials Geomorphology Geophysics Mineral ressources Minerals systems Organic geochemistry Organic matter Paleomagnetism Sedimentology Silicated liquids Stratigraphy Tectonic Hydrology Hydraulics Hydrogeology Modelisation Analog Modeling Numerical Modelling Superficial Formation Agriculture Alteration Pedology Ocean - Atmosphere Atmosphere Chemistry Climate Dynamics Coastal Environment Medium Scale Atmosphere and Ocean Ocean Biogeochemical Processes and Fluxes Others Areas Test Techniques of Informatics and Microelectronics for Computer Architecture Theses de l'Universite Joseph Fourier Theses du Laboratoire Kastler Brossel Theses du Laboratoire Pierre Aigrain Theses du Groupe Optique Atomique du LCFIO Theses du Laboratoire d'analyse et d'architecture des systemes Theses du Laboratoire de mathematiques Jean Leray Theses de l'IRMAR Ecole Doctorale Sciences et Technologies - Orleans Theses de l'Universite d'Orleans Theses de l'Universite Pierre et Marie Curie Observatoire Midi-Pyrenees Institut Neel - Theses Grenoble Images Parole Signal Automatique 143958 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo162.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo162.xml
new file mode 100644
index 0000000..f5fa384
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo162.xml
@@ -0,0 +1,2 @@
+
+DSpace 0 0 Ιδρυματικό Αποθετήριο του Εθνικού Ιδρύματος Ερευνών (Ήλιος) Institutional Repository of National Hellenic Research Foundation (Helios) http://validator.driver.research-infrastructures.eu/validatorWeb/getRepositoryImage.do?&repositoryId=2-3c6b8a98-5cc5-468e-9cb7-619530c9b1da_UGVuZGluZ1JlcG9zaXRvcnlSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU= GR 23.74538 37.973144 2.0 http://helios-eie.ekt.gr/EIE/ National Hellenic Research Foundation stavrakis@ekt.gr OAI http://pandektis.ekt.gr/oai-driver/request oai_dc driver 88 0.0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo163.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo163.xml
new file mode 100644
index 0000000..255c618
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo163.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpace at Tartu University Library DSpace at Tartu University Library http://dspace.utlib.ee/dspace/image/tul4.gif EE 26.714828 58.370884 1 http://dspace.utlib.ee/dspace/ Tartu University dspace-help@utlib.ee OAI http://dspace.utlib.ee/dspace-oai/request oai_dc 7653 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo164.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo164.xml
new file mode 100644
index 0000000..3af63d1
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo164.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace ORBi (University of Liège) ORBi (University of Liege) http://orbi.ulg.ac.be/img/nav/digitheque.png BE 5.575316 50.640879 1 http://orbi.ulg.ac.be/ University of Liege orbi@misc.ulg.ac.be OAI http://orbi.ulg.ac.be/oai/request oai_dc 1682 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo165.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo165.xml
new file mode 100644
index 0000000..04736ff
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo165.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Universiteit voor Humanistiek University for Humanistics http://www.uvh.nl/img/logo_UVH.gif NL 5.1234261 52.0943224 1 http://www.uvh.nl/default.asp Universiteit voor Humanistiek support-igitur@library.uu.nl OAI http://dspace.library.uu.nl:8080/dspace-oai/request oai_dc 23 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo166.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo166.xml
new file mode 100644
index 0000000..e48f453
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo166.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Archivio Eprints Universita di Firenze Archivio Eprints Universita di Firenze http://eprints.unifi.it/images/logo_alto_ep.jpg IT 11.259 43.778 1 http://e-prints.unifi.it/ Universita di Firenze eprints@unifi.it OAI http://e-prints.unifi.it/perl/oai2 oai_dc 200 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo167.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo167.xml
new file mode 100644
index 0000000..81130e0
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo167.xml
@@ -0,0 +1,2 @@
+
+0 0 Opus BieSOn - Bielefelder Server fuer Online-Publikationen (University of Bielefeld, GERMANY) Bielefeld Univ.: BieSOn - Bielefeld Server for Online Publications http://bieson.ub.uni-bielefeld.de/Icons/bieson_logo.gif DE 8.5332 52.022 1 http://bieson.ub.uni-bielefeld.de/ bieson.ub@uni-bielefeld.de OAI http://bieson.ub.uni-bielefeld.de/phpoai/oai2.php oai_dc epicur Generalities, knowledge, the book Data processing, computer science, computer systems Bibliographies Library and information sciences Encyclopedias and books of facts Magazines, journals and serials Associations, organizations, and museum science News media, journalism and publishing General collections Manuscripts and rare books Philosophy Parapsychology and occultism Psychology Religion, Philosophy and theory of religion Bible Christianity and Christian theology Comparative religion and other religions Social sciences, sociology and anthropology Statistics Political science Economics Law Public administration Military science Social problems and social services Education Commerce, communications, transportation Customs, etiquette, folklore Language, linguistics English and Old English languages German language Other Germanic languages French and related languages Italian, Romanian and related languages Spanish and Portuguese languages Latin and Italic languages Classical and modern Greek languages Other languages Science Mathematics Astronomy and allied sciences Physics Chemistry and allied sciences Earth sciences and geology Fossils and prehistoric life Life sciences, biology Plants (Botany) Animals (Zoology) Technology (Applied sciences) Medicine and health Engineering Agriculture and related technologies (including veterinary medicine) Home and family management Management and public relations Chemical engineering Manufacturing Building and construction Arts Landscaping and area planning Architecture Sculpture, numismatics, ceramics, and metalwork Drawing and decorative arts Cartoons, caricatures Painting Graphic arts, prints Photography and computer art Music Recreational and performing arts Public performances Stage presentations Indoor games and amusements Athletic and outdoor sports and games Literature, rhetoric, and criticism American literature in English English and Old English literatures German literature Other Germanic literatures French and related literatures Italian, Romanian and related literatures Spanish and Portuguese literatures Latin and Italic literatures Classical and modern Greek literatures Literatures of other languages History Geography and travel Geography of and travel in Germany Biography, genealogy, and insignia History of ancient world (to ca. 499), archaeology History of Europe History of Germany History of Asia History of Africa History of North America History of South America History of other areas Article Book Masters-Thesis.Diplom Text.Thesis.Doctoral Text.Thesis.Habilitation In-Proceedings Journal-Issue Masters-Thesis.Magister Organisation-Info Preprint Preprint-Collection Proceedings Continuing-Publication Tech-Report Research-Paper Paper Course-Material Public-Lecture Other 1038 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo168.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo168.xml
new file mode 100644
index 0000000..88b18e0
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo168.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Scientific production, Tilburg University Univ. van Tilburg: Scientific Production http://images.uvt.nl/images/2006/images/uvt_logo.gif NL 5.0833 51.5667 1 http://dbiref.uvt.nl/ wilko.haast@uvt.nl OAI http://arno.uvt.nl/oai/wo.uvt.nl.cgi arno netspar nereus oai_dc dare_didl Authors selected for 'Economists Online' Authors selected for 'Economists Online' Faculty = 'FRW' and full text available Author or one of the authors is selected for 'Keur der Wetenschap' Author or one of the authors is selected for 'Keur der Wetenschap' Only records that have full text available Only records that have full text available 8874 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo169.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo169.xml
new file mode 100644
index 0000000..93eb256
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo169.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat de València: Tesis Doctorals en Xarxa (TDX) Univ. of Valencia: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES -0.364511 39.479201 1 http://www.tdx.cesca.es/ Universitat de València tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UV/NDLTD-OAI/oai.pl oai_dc 566 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo17.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo17.xml
new file mode 100644
index 0000000..fc99407
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo17.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat Ramon Llull: Tesis Doctorals en Xarxa (TDX) Univ. Ramon Llull: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES 2.131272 41.411307 1 http://www.tdx.cesca.es/ Universitat Ramon Llull tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_URL/NDLTD-OAI/oai.pl MARC 88 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo170.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo170.xml
new file mode 100644
index 0000000..2b59bc3
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo170.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary software Open Marien Archief (OMA) Open Marine Archive http://www.vliz.be/images/r2k1.gif BE 2.931 51.232 1 http://www.vliz.be/EN/Marine%20Library Flanders Marine Institute roeland.tjampens@vliz.be OAI http://www.vliz.be/oma/imis.php oai_dc 3566 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo171.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo171.xml
new file mode 100644
index 0000000..7c4762e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo171.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace AperTo AperTo http://aperto.unito.it/image/logo_unito.jpg IT 7.689 45.069 1 http://aperto.unito.it/ Universita degli studi di Torino enrico.francese@unito.it OAI http://dspace-unito.cilea.it/dspace-oai/request oai_dc 243 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo172.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo172.xml
new file mode 100644
index 0000000..0a40372
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo172.xml
@@ -0,0 +1,2 @@
+
+0 0 Fedora e-spacio UNED e-spacio UNED http://e-spacio.uned.es/fez/images/escudo.gif/ ES -3.73446 40.44664 1 http://e-spacio.uned.es/fez/ UNED alopezm@pas.uned.es OAI http://servmadrono.cs.urjc.es:8010/arcFuturo/servlet/OAIDPuned oai_dc 14150 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo173.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo173.xml
new file mode 100644
index 0000000..a4e176f
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo173.xml
@@ -0,0 +1,2 @@
+
+DSpace 0 0 Repositório Aberto da Universidade do Porto University of Porto Open Repository http://validator.driver.research-infrastructures.eu/validatorWeb/getRepositoryImage.do?&repositoryId=2-53df6e6b-f019-436d-ba0f-82931f2da43c_UGVuZGluZ1JlcG9zaXRvcnlSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU= POR -8.637979 41.152461 0.0 http://repositorio.up.pt Universidade do Porto rramos@reit.up.pt OAI http://repositorio.up.pt/aberto/oai/request oai_dc All sets 955 0.0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo174.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo174.xml
new file mode 100644
index 0000000..0d35186
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo174.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints EPrints Complutense EPrints Complutense http://www.ucm.es/eprints/images/bucm/eprints_En.jpg ES -3.7276746 40.4459826 1 http://www.ucm.es/eprints/ Universidad Complutense Madrid buc-edicion@buc.ucm.es OAI http://servmadrono.cs.urjc.es:8010/arcFuturo/servlet/OAIDPucm oai_dc 5383 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo175.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo175.xml
new file mode 100644
index 0000000..2aa824c
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo175.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS Heidelberger Dokumentenserver (HeiDok) University of Heidelberg, GERMANY, HeiDok http://archiv.ub.uni-heidelberg.de/nav1/grafik/layout/uni_hd_siegel.gif DE 8.700 49.417 1 http://archiv.ub.uni-heidelberg.de/ Univ. Heidelberg Maylein@ub.uni-heidelberg.de OAI http://archiv.ub.uni-heidelberg.de/volltextserver/oai2/oai2.php oai_dc dc:000 7839 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo176.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo176.xml
new file mode 100644
index 0000000..1c3dc61
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo176.xml
@@ -0,0 +1,2 @@
+
+0 0 Whiterose Research Online Univ. of Leeds, York and Sheffield: White Rose Consortium ePrints Repository http://eprints.whiterose.ac.uk/images/wr_acolour.jpg UK -1.5465 53.7944 0 http://eprints.whiterose.ac.uk/ mailto:eprints@whiterose.ac.uk OAI http://sherpa.leeds.ac.uk/perl/oai2 oai_dc dp Status = In Press Status = Submitted Status = Published Status = Unpublished Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division South (Sheffield) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Earth and Environment (Leeds): Institute of Geological Sciences (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Terrestrial Carbon Dynamics (Sheffield) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): School of Music (Leeds): Leeds University Centre for the Study of the World's Popular Musics Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of English (Sheffield): Department of English Literature (Sheffield): National Centre for English Cultural Tradition (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Musculoskeletal Disease (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Pathology (Leeds): Pathology (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division North (Sheffield): Department of Surgical Sciences (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Institute for Advanced Study in Art (Leeds): Centre for Jewish Studies (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre of Catchment Science (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Advanced Research In Identification Science (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: The Centre for Research into Freemasonry (Sheffield) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Politics (Sheffield): Political Economy Research Centre (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Psychological Sciences (Leeds): Psychological Therapies Research Centre (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of History (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Dentistry (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Humanities (Leeds) Academic Unit = The University of York: Economics and Related Studies (York) Academic Unit = The University of York: Centre for Women's Studies (York) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Process, Environmental and Materials Engineering (Leeds): Institute for Materials Research (Leeds) Academic Unit = The University of Sheffield: Faculty of Engineering (Sheffield): Department of Chemical and Process Engineering (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Sheffield University Management School: Leisure Management Unit (Sheffield) Academic Unit = The University of York: Archaeology (York) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of Modern Languages (Sheffield): Department of Germanic Studies (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Mathematics and Statistics (Sheffield): Probability and Statistics (Sheffield): Applied Probability Trust (Sheffield) Academic Unit = The University of York: History of Art (York) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of Modern Languages (Sheffield): Department of French (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Robert Hill Institute (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Leeds University Centre for Russian, Eurasian and Central European Studies Academic Unit = The University of York: Social Work Research and Development Unit (York) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Institute of Language, Speech and Hearing (Sheffield) Academic Unit = The University of Leeds: Leeds University Business School: International Institute of Banking and Financial Services (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Institute of Molecular Biophysics (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division North (Sheffield): Clinical Science Centre (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Nuffield Management and Leadership (Leeds) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Bayesian Statistics and Health Economics (Sheffield) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): School of Education (Sheffield): Education- Postgraduate Unit (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Trent Institute for Health Services Research (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Mathematics and Statistics (Sheffield): Probability and Statistics (Sheffield): Statistics Services Unit (Sheffield) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): Fine Art, History of Art & Cultural Studies (Leeds) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Education (Leeds): Centre for Studies in Science and Mathematics Education (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Medical Care Research Unit (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Dentistry (Sheffield): Department of Oral Pathology (Sheffield) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): Institute for Earth, Energy and Environment (Leeds) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Mathematics and Statistics (Sheffield): Probability and Statistics (Sheffield) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Civil Engineering (Leeds) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Biological Sciences (Sheffield): Department of Biomedical Science (Sheffield): Centre for Developmental Genetics (Sheffield) Academic Unit = The University of Leeds: Faculty of Environment (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Political Economy Research Centre (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds): School of Mathematics (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for the Study of Childhood and Youth (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Translation Studies (Leeds) Academic Unit = The University of York: Centre for Eighteenth-Century Studies (York) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for the Study of the Bible in the Modern World (Sheffield) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): School of Design (Leeds): Centre for Colour Design and Technology (Leeds) Academic Unit = The University of York: School of Politics, Economics and Philosophy (York) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Sociology and Social Policy (Leeds) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Department of Computer Science (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Dentistry (Sheffield): Department of Oral Health and Development (Sheffield) Academic Unit = The University of York: Health Sciences (York) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Oncology (Leeds): Haematological Malignancy Diagnostic Service (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: The Krebs Institute for Biomolecular Research (Sheffield) Academic Unit = The University of Leeds: Academic Services (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Politics (Sheffield) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Geography (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Informatics Collaboratory for the Social Sciences (ICoSS) (Sheffield) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): School of Education (Sheffield): Institute for Lifelong Learning (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Psychological Sciences (Leeds): Health Psychology (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Academic Unit of Primary Care (Leeds) Academic Unit = The University of York: Hull York Medical School (York) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): School of Education (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Biological Sciences (Sheffield): Department of Molecular Biology and Biotechnology (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Research in Family, Kinship and Childhood (Leeds) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): School of Music (Leeds): Leeds University Centre for English Music (LUCEM) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Canadian Studies (Leeds) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Mathematics and Statistics (Sheffield) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Sociological Studies (Sheffield): Social Science Research Training Office (Sheffield) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Psychology (Sheffield) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Earth and Environment (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Institute for Underground Science (Sheffield) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of English (Sheffield): Department of English Literature (Sheffield) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): Performance and Cultural Industries (Leeds): Research Centre for Dance (Leeds) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): Performance and Cultural Industries (Leeds) Academic Unit = The University of York Academic Unit = The University of Leeds: Faculty of Environment (Leeds): Earth and Biosphere Institute (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield Institute for Biotechnological Law and Ethics Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Health Policy and Management (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Psychological Sciences (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Experimental Haematology (Leeds) Academic Unit = The University of York: Mathematics (York) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Institute for Microstructural and Mechanical Process Engineering (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Healthcare (Leeds): Clinical Physiology (Cardiology) (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Medicine (Leeds): Academic Unit of Learning and Teaching (Leeds) Academic Unit = The University of Leeds: Leeds University Business School: Institute For Corporate Learning (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Health Information Management Research (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Medicine (Leeds): AU Learning and Teaching (Leeds) Academic Unit = The University of York: Centre for Criminal Justice Economics and Psychology (York) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Psychological Sciences (Leeds): Leeds Family Therapy and Research Centre Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Clinical Trials Research Unit (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Biodiversity and Conservation (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Medicine (Leeds): Paediatrics, Obstetrics and Gynaecology (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Division of Genomic Medicine (Sheffield): Section of Functional Genomics (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Operational Research (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Academic UK Public Health (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Humanities Research Institute (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: South East European Research Centre (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Yorkshire Centre for Health Informatics (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Informatics Collaboratory for the Social Sciences (ICoSS) (Sheffield) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): Institute of Transport Studies (Leeds) Academic Unit = The University of York: York Health Economics Consortium (York) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Politics & International Studies (POLIS) (Leeds): Centre for Development Studies (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Astbury Centre for Structural Molecular Biology (Leeds) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Education (Leeds): Higher Education Policy Unit (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield Centre for Arctic Ecology Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Institute for Advanced Study in Art (Leeds): Centre for Cultural Studies (Leeds) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds): School of Physics and Astronomy (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Information Studies (Sheffield) Academic Unit = The University of York: York Electronics Centre (York) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Mechanical Engineering (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Sheffield Centre for Health and Related Research Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Medicine (Leeds): Medical Education Unit (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Sheffield University Management School: Division of Accounting and Finance (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Mother and Infant Research Unit (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Humanities (Leeds): School of Philosophy (Leeds) Academic Unit = The University of York: Social Policy Research Unit (York) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Keyworth Institute (Leeds) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Law (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield Centre for Advanced Magnetic Materials and Devices Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Luxembourg Studies (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield Centre for International Drylands Research Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Combustion and Energy Studies (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Chinese Business & Development (Leeds) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Department of Geography (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division North (Sheffield): Sheffield Kidney Institute Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Oncology (Leeds): National Cancer Research Network / UKCRM / INVOLVE (Leeds) Academic Unit = The University of Sheffield: Faculty of Engineering (Sheffield): Department of Civil and Structural Engineering (Sheffield) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): Department of Biblical Studies (Sheffield) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Academic Unit of Paediatrics, Obstetrics and Gynaecology (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Hang Seng Centre for Cognitive Studies (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Cement and Concrete (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Information Resources (SCHARR) (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Nuffield Health and Social Care (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Wetlands Research Centre (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Biomaterials and Tissue Engineering (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Signal Processing in NeuroImaging and Systems Neuroscience (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: ESCUS The European Social and Cultural Studies Centre (Sheffield) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Process, Environmental and Materials Engineering (Leeds): Continuing Professional Development Unit (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Nursing and Midwifery (Sheffield): Department of Community, Ageing, Rehabilitation, Education & Research (Sheffield) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Earth and Environment (Leeds): Sustainability Research Institute (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Stem Cell Biology (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Division of Genomic Medicine (Sheffield): Division of Molecular and Genetic Medicine (Sheffield) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): School of Design (Leeds): Contemporary Art Practice (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Interdisciplinary Centre for Scientific Research in Music (ICSRiM) (Leeds) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): Leeds Social Sciences Institute Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of Modern Languages (Sheffield): Modern Languages Teaching Centre (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Mediterranean Studies (Leeds) Academic Unit = The University of Sheffield: Faculty of Engineering (Sheffield): Department of Computer Science (Sheffield) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds): School of Mathematics (Leeds): Applied Mathematics (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Photobiology and Photodynamic Therapy (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Sheffield University Management School: Division of Strategy, Systems & Management (Sheffield) Academic Unit = The University of York: Politics (York) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): East Asian Studies (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Leeds Biomaterials Network Centre Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Disability Studies (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Medical Imaging Research (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Experimental Therapeutics (Leeds) Academic Unit = The University of Sheffield: Faculty of Engineering (Sheffield): Department of Electronic and Electrical Engineering (Sheffield) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Politics & International Studies (POLIS) (Leeds): Centre for Democratization Studies (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Department of Information Studies (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division North (Sheffield): Department of Medicine (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Rolls-Royce University Technology Centre in advanced Electrical Machine and Drives (Sheffield) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Earth and Environment (Leeds): Earth Sciences (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Division of Genomic Medicine (Sheffield): Section of Oncology and Pathology (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Medicine, Surgery, and Anaesthesia (Leeds) Academic Unit = The University of Leeds: Faculty of Biological Sciences (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Academic Unit of Health Economics (Leeds) Academic Unit = The University of York: History (York) Academic Unit = The University of Leeds: Academic Services (Leeds): Library (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Rolls-Royce University Technology Centre in Materials Damping Technologies (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Faraday Packaging Partnership (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: The Urban and Regional Policy Research Institute (Sheffield) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds): The Procter Department of Food Science (Leeds) Academic Unit = The University of York: Electronics (York) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Continuing Education (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Geographic Information and Spatial Analysis (Sheffield) Academic Unit = The University of York: Centre for Reviews and Dissemination (York) Academic Unit = The University of Sheffield: Administrative Services (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Institute for Advanced Study in Art (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Geography (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Mental Health Section (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Nursing and Midwifery (Sheffield): Department of Midwifery and Childrens Nursing (Sheffield) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of Modern Languages (Sheffield): Department of Russian and Slavonic Studies (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Virtual Working Systems (Leeds) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Electronic & Electrical Engineering (Leeds): Institute of Microwaves and Photonics (Leeds) Academic Unit = The University of York: Biology (York) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds): School of Mathematics (Leeds): Pure Mathematics (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Institute for Advanced Study in Art (Leeds): Centre for Studies in Architecture and Material Culture (Leeds) Academic Unit = The University of Leeds: Academic Services (Leeds): Information Systems Services (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Computational Fluid Dynamics (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: EPSRC National Centre for III-V Technologies (Sheffield) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): Institute of Communication Studies (Leeds): Louis le Prince Centre for Cinema Photography and Television (Leeds) Academic Unit = The University of York: Science and Technology Studies Unit (SATSU) (York) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Bioinformatics and Computational Biology (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Academy for Steel Construction (Sheffield) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Process, Environmental and Materials Engineering (Leeds): Energy and Resources Research Institute (Leeds) Academic Unit = The University of Sheffield: Faculty of Architectural Studies (Sheffield) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Law (Leeds): Centre for Criminal Justice Studies (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): Russian & Slavonic Studies (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Division of Genomic Medicine (Sheffield): Section of Genetics and Informatics (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Healthcare (Leeds): Nursing (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Gender Studies in Europe (Sheffield) Academic Unit = The University of Sheffield: Administrative Services (Sheffield): Library (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Institute for the Study of Political Parties (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield Centre for Earth Observation Science Academic Unit = The University of Leeds: Leeds University Business School: Centre for International Business University of Leeds (CIBUL) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of English (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Medicine (Leeds) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Law (Leeds): Centre for the Study of Law and Policy in Europe (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division South (Sheffield): Medical Sciences (Sheffield) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Centre for Training Policy Research (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division North (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Antimicrobial Research (Leeds) Academic Unit = The University of York: English and Related Literature (York) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Policy Studies in Education (Leeds) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Education (Leeds): Centre for Citizenship and Human Rights Education (Leeds) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds): School of Mathematics (Leeds): Statistics (Leeds) Academic Unit = The University of York: Centre for Health Economics (York) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Biological Sciences (Sheffield): Department of Animal and Plant Sciences (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Oncology (Leeds) Academic Unit = The University of York: Stockholm Environment Institute at York (York) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Education (Leeds) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Department of Psychology (Sheffield) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Healthcare (Leeds): Academic Pharmacy Practice (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Computer Analysis of Language and Speech (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Heritage Research (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Leeds Institute of Genetics, Health and Therapeutics (LIGHT) Academic Unit = The University of Sheffield: Faculty of Engineering (Sheffield): Department of Mechanical Engineering (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Bakhtin Centre (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Mathematics and Statistics (Sheffield): Department of Pure Maths (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Oncology (Leeds): Oncolocy/Cancer Research UK Clinical Centre Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield Polymer Centre Academic Unit = The University of Sheffield: Faculty of Architectural Studies (Sheffield): Department of Town and Regional Planning (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Mathematics and Statistics (Sheffield): Applied Maths (Sheffield) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): School of Music (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Healthcare (Leeds): Imaging Science (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Aegean Archaeology (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield Institute for Studies on Ageing Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Nursing and Midwifery (Sheffield): Department of Acute and Critical Care Nursing (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): Linguistics & Phonetics (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Genetics (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Nonlinear Studies (Leeds) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Electronic & Electrical Engineering (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Academic Unit of Psychiatry and Behavioural Sciences (Leeds) Academic Unit = The University of Leeds: Leeds University Business School: Centre for Industrial Policy and Performance (Leeds) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of Modern Languages (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Psychological Sciences (Leeds): Biological Psychology (Leeds) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Environmental and Geological Sciences Unit (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Ethnicity and Racism Studies (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Mental Health Section (Sheffield): Forensic Psychiatry (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Medicine (Leeds): Procurement Office (Leeds) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Politics & International Studies (POLIS) (Leeds): Centre for International Studies (Leeds) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): Leeds Centre for Polar Science Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): Institute of Communication Studies (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Division of Genomic Medicine (Sheffield): Department of Psychiatry (Sheffield) Academic Unit = The University of York: Centre for Housing Policy (York) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): Department of History (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Healthcare (Leeds) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): French (Leeds) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Earth and Environment (Leeds): Environment (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of History (Leeds): Centre for Military History (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Institute for Research on Contemporary China (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Glass Research (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Advanced Manufacturing Research Centre (Sheffield) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Process, Environmental and Materials Engineering (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): School of East Asian Studies (Sheffield) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): Department of Music (Sheffield) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Process, Environmental and Materials Engineering (Leeds): Leeds University BNFL Research Alliance Academic Unit = The University of Leeds: Faculty of Biological Sciences (Leeds): Institute of Integrative and Comparative Biology (Leeds) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): Institute of Communication Studies (Leeds): Research Centre For Future Communications (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Sheffield University Management School: Management Development Unit (Sheffield) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Sheffield University Management School Academic Unit = The University of Leeds Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division South (Sheffield): Reproductive and Developmental Medicine (Sheffield) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Electronic & Electrical Engineering (Leeds): Institute of Integrated Information Systems (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Nineteenth Century Studies (Sheffield) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Process, Environmental and Materials Engineering (Leeds): Institute of Particle Science and Engineering (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division South (Sheffield): Department of Medical Physics and Clinical Engineering (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Healthcare (Leeds): Applied Health Sciences (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Interdisciplinary Gender Studies (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Leeds University Centre for African Studies (LUCAS) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Rolls-Royce University Technology Centre for Control and Systems Engineering (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): Spanish & Portuguese (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Leisure Industries Research Centre (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Business and Professional Ethics (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Institute of General Practice & Primary Care (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield) Academic Unit = The University of York: Chemistry (York) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds): Department of Colour and Polymer Chemistry (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): Italian (Leeds) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): Institute of Communication Studies (Leeds): Centre for European Political Communications (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Sheffield University Management School: Division of HRM and Organisational Behaviour (Sheffield) Academic Unit = The University of Sheffield: Faculty of Engineering (Sheffield) Academic Unit = The University of York: Post-war Reconstruction and Development Unit (York) Academic Unit = The University of Sheffield: Faculty of Law (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Healthcare (Leeds): Midwifery (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Leeds Stem Cell Network Academic Unit = The University of York: Psychology (York) Academic Unit = The University of York: Environment (York) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Politics & International Studies (POLIS) (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Division of Genomic Medicine (Sheffield): Academic Neurology Unit (Sheffield) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of English (Sheffield): Department of English Language and Linguistics (Sheffield) Academic Unit = The University of York: Physics (York) Academic Unit = The University of York: Language and Linguistic Science (York) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Economics (Sheffield) Academic Unit = The University of Leeds: Faculty of Biological Sciences (Leeds): Institute of Membrane and Systems Biology (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Leeds Institute of Genetics, Health and Therapeutics (LIGHT): Cardiovascular Research Institute at Leeds (CRISTAL) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Biological Sciences (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Medical Care Research Unit (Sheffield) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Law (Leeds): Centre for Business Law and Practice (Leeds) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Earth and Environment (Leeds): Institute of Geophysics and Tectonics (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Academic Unit of Medical Education (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield Centre for the History of Medicine Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Support Service (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): Institute for Medieval Studies (Leeds) Academic Unit = The University of Leeds: Leeds University Business School: Credit Management Research Centre (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Self-Organising Molecular Systems (Leeds) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Mathematics and Statistics (Sheffield): Applied Maths (Sheffield): Sheffield Centre for Earth Observation Science Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Institute for Advanced Study in Art (Leeds): AHRB Centre for Cultural Analysis Theory & History (Leeds) Academic Unit = The University of Leeds: Faculty of Education, Social Sciences and Law (Leeds): School of Politics & International Studies (POLIS) (Leeds): Centre for British Government (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Humanities (Leeds): Inter-Disciplinary Ethics Applied (IDEA CETL) (Leeds) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): Department of Philosophy (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Nursing and Midwifery (Sheffield): Department of Mental Health and Learning Disabilities (Sheffield) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Journalism Studies (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of History (Leeds): Centre for Business History (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Plant Sciences (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Dentistry (Sheffield): Department of Adult Dental Care (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): School of Biological Sciences (Sheffield): Department of Biomedical Science (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Lifelong Learning Institute (Leeds) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Computing (Leeds) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds): School of Chemistry (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Sociological Studies (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Department of Archaeology (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Sheffield Health Economics Group Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Molecular Gastroenterology (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Pathology (Leeds) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): Department of Archaeology (Sheffield) Academic Unit = The University of York: Centre for Leadership and Management (York) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Institute for Folklore Studies in Britain and Canada (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Medicine (Leeds): Academic Unit of Epidemiology and Health Services Research (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sorby Centre for Electron Microscopy and microanalysis (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Division of Genomic Medicine (Sheffield) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): School of Mechanical Engineering (Leeds): Institute of Medical and Biological Engineering (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Institute for Molecular Physiology (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Nursing and Midwifery (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: The Ibberson Centre (Sheffield) Academic Unit = The University of York: Sociology (York) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): School of Design (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: University of Leeds Advanced Driving Simulator Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of English (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Immobilisation Science Laboratory (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Department of Public Health (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Humanities (Leeds): Classics (Leeds) Academic Unit = The University of Sheffield Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Leeds Institute of Genetics, Health and Therapeutics (LIGHT): Academic Unit of Medical Physics (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Leeds Institute of Genetics, Health and Therapeutics (LIGHT): Academic Unit of Cardiovascular Medicine (Leeds) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Earth and Environment (Leeds): Environmental Geochemistry Group (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Molecular Medicine, Epidemiology and Cancer Research (IMMECR) (Leeds): Section of Epidemiology and Biostatistics (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division North (Sheffield): Sheffield Institute for Studies on Ageing Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Institute of Medical and Biological Engineering (Leeds) Academic Unit = The University of York: Computer Science (York) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): French (Leeds): Centre for Francophone Studies (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Research in Primary Care (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Institute of Work Psychology (Sheffield) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Centre for Decision Research (Leeds) Academic Unit = The University of Sheffield: Faculty of Social Sciences (Sheffield): Department of Human Communication Sciences (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: National Centre for English Cultural Tradition (Sheffield) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Health and Related Research (Sheffield): Mental Health Section (Sheffield): Centre for Psychotherapeutic Studies (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Leeds Institute of Genetics, Health and Therapeutics (LIGHT): Centre for Epidemiology & Biostatistics (Leeds): Reproduction and Early Development Research (RED) Group (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Humanities (Leeds): School of Theology & Religious Studies (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Interdisciplinary Research Centre in Polymer Science and Technology (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Health Sciences and Public Health Research (Leeds): Nuffield International Development (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Humanities (Leeds): Philosophical and Religious Studies Subject Centre (Leeds) Academic Unit = The University of York: Music (York) Academic Unit = The University of Leeds: Leeds University Business School: Centre for Industrial Relations and Human Resource Management (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Sheffield University Waste Incineration Centre Academic Unit = The University of Leeds: Faculty of Biological Sciences (Leeds): Institute for Molecular and Cellular Biology (Leeds) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Leeds Institute of Genetics, Health and Therapeutics (LIGHT): Academic Unit of Molecular Vascular Medicine (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): German (Leeds) Academic Unit = The University of Sheffield: Faculty of Law (Sheffield): Department of Law (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Institute of Psychological Sciences (Leeds): Cognitive Psychology (Leeds) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Skin Research Centre (Leeds) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of History (Leeds) Academic Unit = The University of Leeds: Faculty of Environment (Leeds): School of Earth and Environment (Leeds): Institute for Atmospheric Science (Leeds) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Dentistry (Sheffield): Department of Dental Services (Sheffield) Academic Unit = The University of Leeds: Leeds University Business School Academic Unit = The University of Sheffield: Faculty of Engineering (Sheffield): Department of Automatic Control and Systems Engineering (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): School of Healthcare (Leeds): Audiology (Leeds) Academic Unit = The University of York: Philosophy (York) Academic Unit = The University of Leeds: University of Leeds Research Centres and Institutes: Jean Monnet European Centre of Excellence (Leeds) Academic Unit = The University of Sheffield: Faculty of Architectural Studies (Sheffield): School of Architecture (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Department of Earth Sciences (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Humanities (Leeds): School of Philosophy (Leeds): Division of the History and Philosophy of Science (Leeds) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Rolls-Royce University Technology Centre for Partnership for Design (Sheffield) Academic Unit = The University of Sheffield: Faculty of Engineering (Sheffield): Department of Engineering Materials (Sheffield) Academic Unit = The University of York: Centre for Medieval Studies (York) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: The Centre for Criminological Research (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Department of Physics and Astronomy (Sheffield) Academic Unit = The University of Leeds: Faculty of Maths and Physical Sciences (Leeds) Academic Unit = The University of Sheffield: Faculty of Architectural Studies (Sheffield): Department of Landscape (Sheffield) Academic Unit = The University of York: Social Policy and Social Work (York) Academic Unit = The University of Sheffield: Faculty of Medicine (Sheffield): School of Medicine (Sheffield): Clinical Sciences Division South (Sheffield): Department of Surgical and Anaesthetic Science (Sheffield) Academic Unit = The University of Sheffield: Faculty of Pure Science (Sheffield): Department of Chemistry (Sheffield) Academic Unit = The University of Leeds: Faculty of Medicine, Dentistry, Psychology & Health (Leeds): Leeds Institute of Genetics, Health and Therapeutics (LIGHT): Centre for Epidemiology & Biostatistics (Leeds) Academic Unit = The University of York: Management Studies (York) Academic Unit = The University of Leeds: Faculty of Engineering (Leeds): Nanofactory Interdisciplinary Institute (Leeds) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): School of Modern Languages (Sheffield): Department of Hispanic Studies (Sheffield) Academic Unit = The University of Sheffield: University of Sheffield Research Centres and Institutes: Centre for Developmental Genetics (Sheffield) Academic Unit = The University of Leeds: Faculty of Arts (Leeds): School of Modern Languages and Cultures (Leeds): Arabic & Middle Eastern Studies (Leeds) Academic Unit = The University of Sheffield: Faculty of Arts (Sheffield): Humanities Research Institute (Sheffield) Academic Unit = The University of York: Educational Studies (York) Academic Unit = The University of Leeds: Faculty of Performance, Visual Arts and Communications (Leeds): School of Design (Leeds): Centre for Technical Textiles (Leeds) 3427 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo177.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo177.xml
new file mode 100644
index 0000000..c19def5
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo177.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Genova - IBF Repository National Research Council Genova - IBF Repository http://leonardo.isti.cnr.it/metaopac/sfondi/ibf.gif IT 8.900492 44.408715 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/ibfge_geConf/cnr_ibfge-pub-list.sys.file_x Istituto di Biofisica - CNR Genova giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 3 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo178.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo178.xml
new file mode 100644
index 0000000..f7af35b
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo178.xml
@@ -0,0 +1,2 @@
+
+0 0 DIVA Publikationer från Högskolan i Jönköping Publications from Jönköping University http://www.hj.se/img/2007/gfx/hj_head_logo_eng.png SE 14.16295 57.7796 1 http://www.hj.se/doc/5900 Jönköping University diva-support@ub.uu.se OAI http://www.diva-portal.org/oai/hj/OAI oai_dc 1228 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo179.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo179.xml
new file mode 100644
index 0000000..c2e2b9d
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo179.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software Thèses de l'Ecole nationale des chartes Thèses de l'Ecole nationale des chartes http://theses.enc.sorbonne.fr/images/theses_r1_c1.jpg FR 2.342 48.848 1 http://theses.enc.sorbonne.fr/ Ecole nationale des chartes webenc@enc.sorbonne.fr OAI http://oai.enc.sorbonne.fr/oai2.php oai_dc 306 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo18.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo18.xml
new file mode 100644
index 0000000..18b75c1
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo18.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace International Institute for the Study of Islam in the Modern World International Institute for the Study of Islam in the Modern World http://www.isim.nl/images/logo.gif NL 4.485253 52.1579573 1 http://www.narcis.info/repositories/repository/isim/Language/en/ International Institute for the Study of Islam in the Modern World dspace-help@library.leidenuniv.nl OAI http://openaccess.leidenuniv.nl/dspace-oai/request oai_dc 83 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo180.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo180.xml
new file mode 100644
index 0000000..ed48b1b
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo180.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI TU Delft repository Delft Univ. of Technology: Delft Dissertations http://www.library.tudelft.nl/consumption/groups/btudwebsite/documents/image/header1_logo_en_0.gif NL 4.3663 51.9945 1 http://www.library.tudelft.nl/dissertations/ info@library.tudelft.nl OAI http://repository.tudelft.nl/oai dare_didl oai_dc qdc DARE harvesting TU Delft selected scientists 11083 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo19.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo19.xml
new file mode 100644
index 0000000..bccbe4f
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo19.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Genova - IMATI Repository National Research Council Genova - IMATI Repository http://imati.area.ge.cnr.it/ima/images/home_it.gif IT 8.900492 44.408715 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/imatige_geConf/cnr_imatige-pub-list.sys.file_x Istituto di Matematica Applicata e Tecnologie Informatiche - CNR Genova giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 123 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo2.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo2.xml
new file mode 100644
index 0000000..ee4c9d7
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo2.xml
@@ -0,0 +1,2 @@
+
+0 0 Opus Publikationsserver der Universitaet Potsdam Publikationsserver der Universität Potsdam http://opus.kobv.de/ubp/Icons/unilogo.gif DE 13.012 52.40 1 http://opus.kobv.de/ubp/ Univ. Potsdam schobert@uni-potsdam.de OAI http://opus.kobv.de/ubp/oai2/oai2.php oai_dc 2476 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo20.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo20.xml
new file mode 100644
index 0000000..47a517a
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo20.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Spir@l - Imperial College Digital Repository Spir@l - Imperial College Digital Repository http://spiral.imperial.ac.uk/image/logo.gif UK -0.172 51.488 0 http://spiral.imperial.ac.uk/ Imperial College spiral@imperial.ac.uk OAI http://spiral.imperial.ac.uk/spiral-pub-oai/request oai_dc 1256 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo21.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo21.xml
new file mode 100644
index 0000000..251bde6
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo21.xml
@@ -0,0 +1,2 @@
+
+0 0 DigitalCommons ARROW@DIT ARROW@DIT http://arrow.dit.ie/assets/md5images/d4c03b1a4a29a793a35d4017c4d63ccb.gif IE -6.280381 53.35139666 0 http://arrow.dit.ie/ Dublin Institute of Technology yvonne.desmond@dit.ie OAI http://arrow.dit.ie/cgi/oai2.cgi oai_dc 401 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo22.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo22.xml
new file mode 100644
index 0000000..5f1d35a
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo22.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung TKK Teknillisen korkeakoulun elektroniset vaeitoeskirjat TKK electronic academic dissertations http://lib.tkk.fi/Diss/tkklogo15.gif FI 25.0 60.25 1 http://lib.tkk.fi/Diss/ Helsinki University of Technology rita.voigt@tkk.fi OAI http://edoc.tkk.fi/oai/oai2.php oai_dc 1232 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo23.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo23.xml
new file mode 100644
index 0000000..d91dee3
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo23.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace University Digital Archive of the University of Groningen, The Netherlands. Univ. of Groningen: DARE http://dspace.ou.nl/dspace-oai/request NL 6.5666 53.2167 1 https://dspace.ub.rug.nl report.db@ub.rug.nl OAI http://ir.ub.rug.nl/oai/ oai_dc Dissertations Proceedings repository Electronic publications Faculty of Arts SOM electronic reports Electronic documents of the Faculty of Law Cream of Science of Groningen Energy and Environmental Sciences N.V. Nederlandse Gasunie Stratingh Institute Publications ICS DNPP: Documentation center for Dutch Political Parties Faculty Economics, Management & Organization and Spatial Sciences Inaugural lectures Science Shops GGDC: Groningen Growth & Development Centre Zernike Institute for Advanced Materials Theologie CCSO: Centre for Economic Research CDS: Centre for Development Studies COELO: Centrum voor Onderzoek van de Economie van de Lagere Overheden URSI: Urban and Regional Studies Institute PRC: Population Research Centre Library RUG GBB: Groningen Biomolecular Sciences and Biotechnology Institute Astronomy University of Groningen Adamsappel GMW: Behavioural and Social Sciences De Digitale zadenatlas van Nederland / The Digital Seed Atlas of the Netherlands DNPP: Partij- en verkiezingsaffiches Pictogram 6218 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo24.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo24.xml
new file mode 100644
index 0000000..3ee4408
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo24.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Goldsmiths Research Online Goldsmiths Research Online http://eprints.goldsmiths.ac.uk/images/sitelogo.gif UK -0.034 51.475 0 http://eprints.goldsmiths.ac.uk/ Goldsmiths, University London lib-eprints@gold.ac.uk OAI http://eprints.goldsmiths.ac.uk/cgi/oai2 oai_dc 475 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo25.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo25.xml
new file mode 100644
index 0000000..8666cb6
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo25.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS BiPrints BiPrints http://www.ub.uni-bielefeld.de/graphics/ubneu/BiPrints_gruen.gif DE 8.494706153869629 52.037656647947244 1 http://repositories.ub.uni-bielefeld.de/biprints/index.php?la=en Bielefeld University tobias.tappe@uni-bielefeld.de OAI http://repositories.ub.uni-bielefeld.de/escholarship/oai2/oai2.php oai_dc 859 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo26.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo26.xml
new file mode 100644
index 0000000..5d7ef40
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo26.xml
@@ -0,0 +1,2 @@
+
+0 0 MyCore Dokumenten- und Publikationsservice University of Paderborn Publications Online http://ubdok.uni-paderborn.de/i/pb/logo.gif DE 8.773983 51.710311 1 http://ubdok.uni-paderborn.de/ Universität Paderborn r.sprotte@ub.uni-paderborn.de OAI http://ubdok.uni-paderborn.de/servlets/OAIDataProvider oai_dc 446 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo27.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo27.xml
new file mode 100644
index 0000000..a6aafb5
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo27.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS Universitaet Stuttgart Publication Server of the University of Stuttgart http://elib.uni-stuttgart.de/img/institutmitlogo.jpg DE 9.18333 48.7667 1 http://elib.uni-stuttgart.de/opus/ reportadm@informatik.uni-stuttgart.de OAI http://elib.uni-stuttgart.de/opus/oai2/oai2.php oai_dc Computer Science: Technical Report Computer Science: Doctoral Thesis, Postdoctoral Qualification Computer Science: Master Thesis, Diploma Thesis Computer Science: Student Thesis Computer Science: Practical Course, Presentation, Seminar Paper, Lecture Script Computer Science: Article in Journal Computer Science: Article in Proceedings Computer Science: Article in Book or Article in Collection of Papers Computer Science: Book, Proceedings, Collection of Papers Computer Science: Miscellaneous (Media, etc.) 3580 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo28.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo28.xml
new file mode 100644
index 0000000..b32cf33
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo28.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Electronic Research Archive Electronic Research Archive http://www.bth.se/bth/images/eng/forskningbild.jpg SE 15.586 56.160 1 http://www.bth.se/fou/ Blekinge Institute of Technology peter.linde@bth.se OAI http://www3.bth.se/servlet/Forskinfo oai_dc 955 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo29.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo29.xml
new file mode 100644
index 0000000..40c81fe
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo29.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpaceUnipr - University of Parma DspaceUnipr - University of Parma http://dspace-unipr.cilea.it/image/unipr.jpg IT 10.33 44.80 1 http://dspace-unipr.cilea.it/ University of Parma fabrizia.bevilacqua@unipr.it OAI http://dspace-unipr.cilea.it/dspace-oai/request oai_dc 481 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo3.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo3.xml
new file mode 100644
index 0000000..275e5b3
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo3.xml
@@ -0,0 +1,3 @@
+
+0 0 Proprietary Software Les Bibliothèques Virtuelles Humanistes (BVH) Les Bibliothèques Virtuelles Humanistes (BVH) http://www.bvh.univ-tours.fr/Img/titre.jpg FR 0.680 47.395 1 http://www.bvh.univ-tours.fr/ Centre d’Études Supérieures de la Renaissance
+Université François-Rabelais, Tours sebastien.busson@univ-tours.fr OAI http://www.bvh.univ-tours.fr/oai2/repositoryOAI.asp oai_dc 225 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo30.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo30.xml
new file mode 100644
index 0000000..17e2f18
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo30.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Publikationer från Stockholms universitet Publications from Stockholm University http://www.diva-portal.org/image/jpg/su_DiVA_sidhuvud.jpg SE 18.058204 59.363326 1 http://www.diva-portal.org/su/index.xsql?lang=en Stockholm University diva-support@ub.uu.se OAI http://www.diva-portal.org/oai/su/OAI oai_dc 2706 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo31.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo31.xml
new file mode 100644
index 0000000..e828403
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo31.xml
@@ -0,0 +1,2 @@
+
+0 0 edoc GFZ Publications GFZ Publications http://edoc.gfz-potsdam.de/gfz/images/eda.gif DE 13.058 52.378 1 http://edoc.gfz-potsdam.de/gfz/ GeoForschungsZentrum Potsdam (GFZ), webmaster@gfz-potsdam.de OAI http://bib-app.gfz-potsdam.de/oai.php oai_dc 787 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo32.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo32.xml
new file mode 100644
index 0000000..b3f1b79
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo32.xml
@@ -0,0 +1,2 @@
+
+CDSware 0 0 Infoscience Infoscience EPFL http://www.epfl.ch/tools/label.php?s=22&BG=99cccc&FG=ffffff&label=INFOSCIENCE CH 6.565963 46.520371 0.0 http://infoscience.epfl.ch/ EPFL - Ecole Polytechnique Fédérale de Lausanne infoscience@epfl.ch OAI http://infoscience.epfl.ch/oai2d/ oai_dc All sets 11047 0.0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo33.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo33.xml
new file mode 100644
index 0000000..9d7c246
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo33.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung miami miami http://miami.uni-muenster.de/pics/logo_gr.gif DE 7.616 51.963 1 http://miami.uni-muenster.de/ Universität Münster gressho@uni-muenster.de OAI http://miami.uni-muenster.de/servlets/OAIDataProvider oai_dc 3598 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo34.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo34.xml
new file mode 100644
index 0000000..53b6d98
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo34.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Elektronisches Volltextarchiv EVA Elektronisches Volltextarchiv EVA http://www.ubka.uni-karlsruhe.de/grafiken/icons/unibiblogo_420.gif DE 8.414 49.011 1 http://www.ubka.uni-karlsruhe.de/eva/ Universitaet Karlsruhe tuszkowski@ubka.uni-karlsruhe.de OAI http://www.ubka.uni-karlsruhe.de/oai/eva/oai2.php oai_dc 3790 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo35.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo35.xml
new file mode 100644
index 0000000..b447492
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo35.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints memSIC : Memoires en Sciences de l'Information et de la Communication memSIC : Memoires en Sciences de l'Information et de la Communication (CNRS) http://memsic.ccsd.cnrs.fr/images/b_memsic.gif FR 4.8833 45.7667 1 http://memsic.ccsd.cnrs.fr/ mailto:adminMEM@ccsd.cnrs.fr OAI http://memsic.ccsd.cnrs.fr/perl/oai2 ccsd_inist ccsd_tel oai_dc Bibliometry, scientometry Cinema, art, esthetics Conflicts, information strategy, intelligence Economy, cultural industry Education, e-learning, training Electronic publishing Geopolitics History of information/communication Hypertext, hypermedia Information retrieval Information system engineering Information/communication law Knowledge management Local authorities Mass media Museology Organisation and communication Others Public Sphere Scientific communication and information Sociology of information and communication Theory of information/communication 155 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo36.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo36.xml
new file mode 100644
index 0000000..017f55d
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo36.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Horizon / Pleins textes Horizon / Pleins textes http://www.ird.fr/images/bandeau_r1_c2.gif FR 2.35 48.85 1 http://www.documentation.ird.fr/ Institut de Recherche pour le Developpement (IRD) archambe@paris.ird.fr OAI http://www.documentation.ird.fr/fdi/oai.php oai_dc 33713 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo37.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo37.xml
new file mode 100644
index 0000000..5e81ef9
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo37.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Birkbeck ePrints Birkbeck, Univ. of London: Eprints Archive http://eprints.bbk.ac.uk/images/bbklogo.gif UK 0.002899 51.500197 0 http://eprints.bbk.ac.uk/ mailto:lib-eprints@bbk.ac.uk OAI http://eprints.bbk.ac.uk/perl/oai2 oai_dc Status = In Press Status = Submitted Status = Published Status = Unpublished School = Birkbeck Schools and Research Centres: Faculty of Arts: School of History, Classics and Archeology: The Robert Boyle Project School = Birkbeck Schools and Research Centres: Faculty of Arts: School of Law School = Birkbeck Schools and Research Centres: Faculty of Science: School of Psychology School = Birkbeck Schools and Research Centres: Faculty of Arts: School of English and Humanities: Centre for Nineteenth-Century Studies School = Birkbeck Schools and Research Centres: Faculty of Social Sciences: School of Computer Science and Information Systems School = Birkbeck Schools and Research Centres: Faculty of Social Sciences School = Birkbeck Schools and Research Centres School = Central Administration Departments: Master's Office School = Birkbeck Schools and Research Centres: Faculty of Arts: School of Philosophy School = Birkbeck Schools and Research Centres: Faculty of Social Sciences: School of Economics, Mathematics and Statistics School = Birkbeck Schools and Research Centres: Faculty of Social Sciences: School of Geography School = Birkbeck Schools and Research Centres: Faculty of Arts: School of English and Humanities School = Birkbeck Schools and Research Centres: Faculty of Continuing Education School = Birkbeck Schools and Research Centres: Faculty of Arts: School of Politics and Sociology School = Birkbeck Schools and Research Centres: Faculty of Arts: School of History of Art, Film and Visual Media School = Birkbeck Schools and Research Centres: Faculty of Science: School of Crystallography: Institute of Structural Molecular Biology School = Birkbeck Schools and Research Centres: Faculty of Science School = Birkbeck Schools and Research Centres: Faculty of Arts School = Birkbeck Schools and Research Centres: Faculty of Science: School of Crystallography School = Central Administration Departments School = Birkbeck Schools and Research Centres: Faculty of Arts: School of Languages, Linguistics and Culture School = Birkbeck Schools and Research Centres: Faculty of Science: School of Earth Sciences School = Central Administration Departments: Library School = Birkbeck Schools and Research Centres: Faculty of Social Sciences: School of Management and Organizational Psychology School = Birkbeck Schools and Research Centres: Faculty of Science: School of Biological and Chemical Sciences School = Birkbeck Schools and Research Centres: Faculty of Arts: School of History, Classics and Archeology 525 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo38.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo38.xml
new file mode 100644
index 0000000..fe11ae3
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo38.xml
@@ -0,0 +1,2 @@
+
+0 0 Digitool Biblos-e Archivo Universidad Autonoma de Madrid Biblos-e Archivo Universidad Autonoma de Madrid http://digitool-uam.greendata.es/exlibris/dtl/u3_1/dtle/www_r_spa/icon/header_left.gif ES -3.69680 40.545554 1 http://digitool-uam.greendata.es/ Universidad Autonoma de Madrid exlibris@exlibris.co.il OAI http://servmadrono.cs.urjc.es:8010/arcFuturo/servlet/OAIDPuam oai_dc 882 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo39.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo39.xml
new file mode 100644
index 0000000..4845eea
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo39.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace e_buah Biblioteca digital de la Universidad de Alcala e_buah Biblioteca digital de la Universidad de Alcala http://dspace.uah.es/dspace/image/e_buah1.jpg ES -3.363293 40.482807 1 http://dspace.uah.es/dspace/ Universidad de Alcala ebuah@uah.es OAI http://servmadrono.cs.urjc.es:8010/arcFuturo/servlet/OAIDPuah oai_dc 1148 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo4.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo4.xml
new file mode 100644
index 0000000..ffb324c
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo4.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Univ. do Minho: RepositoriUM Univ. do Minho: RepositóriUM http://repositorium.sdum.uminho.pt/image/LogoRI2.gif PT -8.14 41.635 0 http://repositorium.sdum.uminho.pt/ Universidade do Minho repositorium@sdum.uminho.pt OAI http://repositorium.sdum.uminho.pt/oai/oai oai_dc 7415 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo40.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo40.xml
new file mode 100644
index 0000000..6885d4a
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo40.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software Fraunhofer-ePrints Fraunhofer-ePrints http://publica.fraunhofer.de/starweb/images/fhg_logo.gif DE 11.531118 48.131002 1 http://publica.fraunhofer.de/starweb/ep08/en/index.htm Fraunhofer-Gesellschaft har@irb.fhg.de OAI http://publica.fraunhofer.de/eprints.har oai_dc 3547 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo41.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo41.xml
new file mode 100644
index 0000000..986eb98
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo41.xml
@@ -0,0 +1,2 @@
+
+DBClear 0 0 Social Science Open Access Repository Social Science Open Access Repository http://validator.driver.research-infrastructures.eu/validatorWeb/getRepositoryImage.do?&repositoryId=5-f6f51a2c-88a3-4b37-9f1a-7a3899d10817_UGVuZGluZ1JlcG9zaXRvcnlSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU= DE 8.4630196 49.4856023 1.0 http://www.ssoar.info http://www.gesis.org philipp.schaer@gesis.org OAI http://www.ssoar.info/ssoar/OAIHandler oai_dc All sets 0 0.0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo42.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo42.xml
new file mode 100644
index 0000000..70eddbe
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo42.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universidade da Coruña: Tesis Doctorals en Xarxa (TDX) Univ. da Coruña: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES -8.39271 43.371644 1 http://www.tdx.cesca.es/ Universidade da Coruña: tdx@cesca.es OAI http://www.tdr.cesca.es/TDR_UDC/NDLTD-OAI/oai.pl oai_dc 23 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo43.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo43.xml
new file mode 100644
index 0000000..1b492d8
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo43.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universidad de Oviedo: Tesis Doctorals en Xarxa (TDX) Univ. of Oviedo: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES -5.846183 43.362066 1 http://www.tdx.cesca.es/ Universidad de Oviedo tdx@cesca.es OAI http://www.tdr.cesca.es/TDR_UM/NDLTD-OAI/oai.pl oai_dc 148 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo44.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo44.xml
new file mode 100644
index 0000000..c78bf59
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo44.xml
@@ -0,0 +1,2 @@
+
+0 0 ask23 repository (lkw, hfbk hamburg, germany) Hfbk Hamburg: Labor Kunst und Wissenschaft: archivsystem ask23 http://admin.driver.research-infrastructures.eu/images/repositoryLogos/back_papier1_logo.gif DE 9.992 53.55 1 http://ask23.hfbk-hamburg.de technik@ask23.de OAI http://purl.oclc.org/NET/ugent/lib/srepod/oai.ask23.de/static/ask23-oai.xml oai_dc 91 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo45.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo45.xml
new file mode 100644
index 0000000..457310f
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo45.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpace at Radboud Univ. Nijmegen Radboud Univ. Nijmegen: Digital Repository http://dspace.ou.nl/dspace-oai/request NL 5.85 51.8333 1 http://dare.ubn.kun.nl:8080/ systeembeheer@ubn.ru.nl OAI http://dare.ubn.kun.nl:8080/dspace-oai/request oai_dc Bogaers-Haalebos DONOR-bestandsinventarisatie (2e release april 2006) Elektronische publicaties Radboud Universiteit FNWI Keur der Wetenschap Keur extra Metis Medische bibliotheek RU 1995-1997 test 7279 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo46.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo46.xml
new file mode 100644
index 0000000..3269961
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo46.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS University of Mannheim, GERMANY, MADOC MADOC: Mannheim Electronic DOCument Server of Univ. Mannheim http://www.bib.uni-mannheim.de/fileadmin/relaunch/img/logoUB.gif DE 8.4667 49.48 1 http://madoc.bib.uni-mannheim.de mailto:madoc@bib.uni-mannheim.de OAI http://madoc.bib.uni-mannheim.de/madoc/oai2/oai2.php oai_dc epicur Generalities, Science Data processing Computer science Bibliography Library and information sciences General encyclopedic works General serials and their indexes General organization and museology News media, journalism, publishing General collections Manuscripts and rare books Philosophy Paranormal phenomena Psychology Religion Bible Christian theology Other and comparative religions Social sciences General statistics Political science Economics Law Public administration Military science "Social services; association" Education Commerce, communications, transport Customs, etiquette, folklore Language, Linguistics English Germanic Other Germanic languages Romance languages French Italian, Romanian, Rhaeto-Romantic Spanish and Portugese languages Italic Latin Hellenic languages Classical Greek Other languages Natural sciences and mathematics Mathematics Astronomy and allied sciences Physics Chemistry and allied sciences Earth sciences Paleontology Paleozoology Life sciences Botanical sciences Zoological sciences Technology (Applied sciences) Medical sciences Medicine Engineering and allied operations Agriculture Home economics and family living Management and auxiliary services Chemical engineering Manufacturing Buildings The arts Civic and landscape art Architecture Plastic arts Sculpture Drawing and decorative arts Comics, Cartoons Painting and paintings Graphic arts Printmaking and prints Photography and photographs Music Recreational and performing arts Public performances Stage presentations Indoor games and amusements Athletic and outdoor sports and games Literature and rhetoric American literature in English English and Old English literatures Literatures of Germanic languages Other Germanic literatures Literatures of Romance languages Italian, Romanian, Rhaeto-Romanic literatures Spanish and Portuguese literatures Italic literatures Latin Hellenic literatures Classical Greek Literatures of other languages Geography and history Geography and travel Geography and travel Germany Biography, genealogy, insignia History of ancient world General history of Europe General history of Europe Central Europe Germany General history of Asia Far East General history of Africa General history of North America General history of South America General history of other areas Article Book MastersThesis Text.Thesis.Doctoral HonoursThesis Journal ResearchPaper TechReport Preprint Text.Thesis.Habilitation 2036 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo47.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo47.xml
new file mode 100644
index 0000000..efba133
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo47.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Theses database, Tilburg University Univ. van Tilburg: iPort http://images.uvt.nl/images/2006/images/uvt_logo.gif NL 5.08333 51.5667 1 http://dbiref.uvt.nl/ wilko.haast@uvt.nl OAI http://arno.uvt.nl/oai/scr.uvt.nl.cgi arno netspar nereus oai_dc dare_didl Authors selected for 'Economists Online' Authors selected for 'Economists Online' Faculty = 'FRW' and full text available Author or one of the authors is selected for 'Keur der Wetenschap' Author or one of the authors is selected for 'Keur der Wetenschap' Only records that have full text available Only records that have full text available 4466 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo48.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo48.xml
new file mode 100644
index 0000000..7d2f843
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo48.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Bristol Repository of Scholarly Eprints (ROSE) Univ. of Bristol: Bristol Repository of Scholarly Eprints (ROSE) http://deneb.lib.bris.ac.uk/dspace/image/bannerRose.jpg UK -2.5914 51.4536 0 http://deneb.lib.bris.ac.uk/dspace/ rose-help@bristol.ac.uk OAI http://rose.bris.ac.uk/dspace-oai/request oai_dc Artificial Intelligence Group Bristol Centre for Applied Nonlinear Mathematics Dr Evan Jones Dr Hugh Pemberton Dr James Thompson Palaeobiology and Biodiversity Research Group (PBRG) Professor Robert Bickers Wireless Communications Xenopus tadpole neurobiology 1981 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo49.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo49.xml
new file mode 100644
index 0000000..a06289a
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo49.xml
@@ -0,0 +1,3 @@
+
+0 0 PUMA National Research Council Bologna - IBIMET Repository National Research Council Bologna - IBIMET Repository http://www.ibimet.cnr.it/logo.jpg IT 11.30 44.53 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/cnrpConf/cnr_ibimetbo-pub-list.sys.file_x Institute for
+macromolecular studies - CNR Bologna giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 7 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo5.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo5.xml
new file mode 100644
index 0000000..4935c8e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo5.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Padua@research Padua@research http://paduaresearch.cab.unipd.it/images/pd.gif IT 11.876 45.409 1 http://paduaresearch.cab.unipd.it/ Universita degli studi di Padova yuri.carrer@unipd.it OAI http://paduaresearch.cab.unipd.it/perl/oai2 oai_dc 413 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo50.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo50.xml
new file mode 100644
index 0000000..8e635e8
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo50.xml
@@ -0,0 +1,2 @@
+
+0 0 ePrints National Research Council, Bologna Research Area Library Eprints Service National Research Council, Bologna Research Area Library Eprints Service http://biblio-eprints.bo.cnr.it/images/logoCNR.gif IT 11.34 44.49 1 http://biblio-eprints.bo.cnr.it/ Biblioteca d'Area - CNR Area della Ricerca di Bologna a.tugnoli@area.bo.cnr.it OAI http://biblio-eprints.bo.cnr.it/perl/oai2 oai_dc 0 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo51.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo51.xml
new file mode 100644
index 0000000..f4f77fb
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo51.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Univ. Maastricht Univ. Maastricht: Electronic Documents http://edata.ub.unimaas.nl/images/alg_hoeklogo.gif NL 5.686668 50.8471 1 http://edata.ub.unimaas.nl/www-digiarchum/ j.odekerken@ub.unimaas.nl OAI http://arno.unimaas.nl/oai/dare.cgi dare_didl oai_dc nereus arno KB e-depot KB e-depot Economists online Economists online Keur der wetenschap Keur der wetenschap Maastricht University. Faculty of Law Maastricht University. Faculty of Law Maastricht University. Faculty of Law, full text available Maastricht University. Faculty of Law, full text available Full text available Full text available 9405 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo52.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo52.xml
new file mode 100644
index 0000000..b8fbbc7
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo52.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software DALEA - Högskolan Dalarnas elektroniska arkiv DALEA - Dalarna University Electronic Archive http://dalea.du.se/images/hda_blomma.gif SE 15.436 60.485 1 http://dalea.du.se/ Högskolan Dalarna dalea@du.se OAI http://dalea.du.se/oai/ oai_dc 663 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo53.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo53.xml
new file mode 100644
index 0000000..d407929
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo53.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software ETH E-Collection ETH E-Collection http://e-collection.ethbib.ethz.ch/images/home_ecollection2.gif CH 8.654 47.384 1 http://e-collection.ethbib.ethz.ch/ ETH Zürich heinz.vogt@library.ethz.ch OAI http://oai.ethz.ch/oai.asp oai_dc 8969 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo54.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo54.xml
new file mode 100644
index 0000000..0849b23
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo54.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat de Vic: Tesis Doctorals en Xarxa (TDX) Univ. of Vic:: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES 2.248301 41.933395 1 http://www.tdx.cesca.es/ Universitat de Vic tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UVIC/NDLTD-OAI/oai.pl oai_dc 2 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo55.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo55.xml
new file mode 100644
index 0000000..5202c21
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo55.xml
@@ -0,0 +1,2 @@
+
+0 0 EPrints British Library Research Archive British Library Research Archive (Sherpa) http://sherpa.bl.uk/images/logo100.gif UK -0.1167 51.5 0 http://sherpa.bl.uk/ mailto:support.sherpa@bl.uk OAI http://sherpa.bl.uk/perl/oai2 oai_dc Status = In Press Status = Submitted Status = Published Status = Unpublished Subject = J Political Science: J General legislative and executive papers Subject = S Agriculture: SD Forestry Subject = C Auxiliary Sciences of History: C Auxiliary sciences of history (General) Subject = G Geography. Anthropology. Recreation: GB Physical geography Subject = D History General and Old World: DH Netherlands (The Low Countries) Subject = P Language and Literature: PG Slavic, Baltic, Albanian languages and literature Subject = E History America: E11 America (General) Subject = U Military Science Subject = L Education: LC Special aspects of education Subject = U Military Science: U Military Science (General) Subject = R Medicine: RZ Other systems of medicine Subject = P Language and Literature: PN Literature (General): PN1990 Broadcasting Subject = Q Science: QR Microbiology: QR180 Immunology Subject = D History General and Old World: DA Great Britain Subject = R Medicine: RC Internal medicine: RC1200 Sports Medicine Subject = P Language and Literature: PS American literature Subject = D History General and Old World: D History (General): D204 Modern History Subject = Q Science: QR Microbiology: QR355 Virology Subject = N Fine Arts: ND Painting Subject = P Language and Literature: PC Romance languages Subject = L Education: LT Textbooks Subject = C Auxiliary Sciences of History: CD Diplomatics. Archives. Seals Subject = G Geography. Anthropology. Recreation: GF Human ecology. Anthropogeography Subject = L Education: LB Theory and practice of education: LB2300 Higher Education Subject = R Medicine: RA Public aspects of medicine: RA1001 Forensic Medicine. Medical jurisprudence. Legal medicine Subject = D History General and Old World: D History (General): D731 World War II Subject = C Auxiliary Sciences of History: CD Diplomatics. Archives. Seals: CD921 Archives Subject = T Technology: TX Home economics Subject = H Social Sciences: HT Communities. Classes. Races Subject = H Social Sciences: HB Economic Theory Subject = Q Science: QL Zoology Subject = N Fine Arts Subject = A General Works: AC Collections. Series. Collected works Subject = B Philosophy. Psychology. Religion: BL Religion Subject = G Geography. Anthropology. Recreation: GT Manners and customs Subject = K Law: KZ Law of Nations Subject = C Auxiliary Sciences of History: CS Genealogy Subject = B Philosophy. Psychology. Religion: BR Christianity Subject = D History General and Old World: D History (General): D501 World War I Subject = C Auxiliary Sciences of History: CR Heraldry Subject = T Technology: TH Building construction Subject = R Medicine: RJ Pediatrics: RJ101 Child Health. Child health services Subject = J Political Science: JX International law Subject = F History United States, Canada, Latin America: F001 United States local history Subject = Q Science: QD Chemistry Subject = J Political Science Subject = D History General and Old World: DU Oceania (South Seas) Subject = R Medicine: RA Public aspects of medicine Subject = T Technology: TK Electrical engineering. Electronics Nuclear engineering Subject = N Fine Arts: NX Arts in general Subject = H Social Sciences: HF Commerce Subject = G Geography. Anthropology. Recreation Subject = J Political Science: JN Political institutions (Europe) Subject = P Language and Literature: P Philology. Linguistics Subject = C Auxiliary Sciences of History Subject = Z Bibliography. Library Science. Information Resources: Z665 Library Science. Information Science Subject = L Education: LA History of education Subject = T Technology: TT Handicrafts Arts and crafts Subject = H Social Sciences: HV Social pathology. Social and public welfare Subject = D History General and Old World: DA Great Britain: DAW Central Europe Subject = Q Science: QA Mathematics: QA76 Computer software Subject = B Philosophy. Psychology. Religion: BT Doctrinal Theology Subject = H Social Sciences: HQ The family. Marriage. Woman Subject = J Political Science: JA Political science (General) Subject = Z Bibliography. Library Science. Information Resources Subject = Q Science: QH Natural history Subject = J Political Science: JQ Political institutions Asia Subject = R Medicine: R Medicine (General) Subject = P Language and Literature: PT Germanic literature Subject = D History General and Old World: D History (General): D880 Developing Countries Subject = B Philosophy. Psychology. Religion: BS The Bible Subject = S Agriculture: SH Aquaculture. Fisheries. Angling Subject = B Philosophy. Psychology. Religion: BF Psychology Subject = T Technology: TJ Mechanical engineering and machinery Subject = L Education: LB Theory and practice of education Subject = D History General and Old World: DP Spain Subject = D History General and Old World: DF Greece Subject = Q Science: QK Botany Subject = P Language and Literature: PZ Childrens literature Subject = T Technology: TA Engineering (General). Civil engineering (General) Subject = T Technology: TR Photography Subject = R Medicine: RC Internal medicine: RC0254 Neoplasms. Tumors. Oncology (including Cancer) Subject = L Education: LC Special aspects of education: LC5201 Education extension. Adult education. Continuing education Subject = N Fine Arts: NA Architecture Subject = T Technology: TE Highway engineering. Roads and pavements Subject = N Fine Arts: NC Drawing Design Illustration Subject = M Music and Books on Music: M Music Subject = A General Works Subject = Z Bibliography. Library Science. Information Resources: Z004 Books. Writing. Paleography Subject = T Technology: TF Railroad engineering and operation Subject = R Medicine Subject = P Language and Literature: PH Finno-Ugrian, Basque languages and literatures Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources Subject = E History America Subject = J Political Science: JZ International relations Subject = G Geography. Anthropology. Recreation: GR Folklore Subject = T Technology: TS Manufactures Subject = D History General and Old World: DE The Mediterranean Region. The Greco-Roman World Subject = P Language and Literature: PB Modern European Languages Subject = R Medicine: RV Botanic, Thomsonian, and eclectic medicine Subject = Q Science: QA Mathematics: QA75 Electronic computers. Computer science Subject = H Social Sciences: HF Commerce: HF5601 Accounting Subject = H Social Sciences: HC Economic History and Conditions Subject = R Medicine: RA Public aspects of medicine: RA0421 Public health. Hygiene. Preventive Medicine Subject = J Political Science: JK Political institutions (United States) Subject = B Philosophy. Psychology. Religion: BM Judaism Subject = K Law: KF United States Federal Law Subject = B Philosophy. Psychology. Religion: B Philosophy (General) Subject = L Education: LG Individual institutions (Asia. Africa) Subject = P Language and Literature: PM Hyperborean, Indian, and Artificial languages Subject = C Auxiliary Sciences of History: CT Biography Subject = R Medicine: RE Ophthalmology Subject = Q Science: QB Astronomy Subject = F History United States, Canada, Latin America: F1001 Canada (General) Subject = D History General and Old World: D History (General) Subject = R Medicine: RL Dermatology Subject = B Philosophy. Psychology. Religion Subject = S Agriculture: S Agriculture (General) Subject = F History United States, Canada, Latin America Subject = D History General and Old World: DT Africa Subject = D History General and Old World: D History (General): D890 Eastern Hemisphere Subject = K Law: K Law (General) Subject = H Social Sciences: HJ Public Finance Subject = D History General and Old World: DJ Netherlands (Holland) Subject = R Medicine: RB Pathology Subject = Q Science Subject = L Education: L Education (General) Subject = Q Science: QC Physics Subject = A General Works: AS Academies and learned societies (General) Subject = R Medicine: RF Otorhinolaryngology Subject = G Geography. Anthropology. Recreation: G Geography (General) Subject = H Social Sciences: HG Finance Subject = H Social Sciences: HX Socialism. Communism. Anarchism Subject = N Fine Arts: NB Sculpture Subject = T Technology: TC Hydraulic engineering. Ocean engineering Subject = A General Works: AI Indexes (General) Subject = D History General and Old World Subject = C Auxiliary Sciences of History: CJ Numismatics Subject = M Music and Books on Music: MT Musical instruction and study Subject = R Medicine: RX Homeopathy Subject = P Language and Literature: PN Literature (General): PN0080 Criticism Subject = P Language and Literature: PN Literature (General): PN1993 Motion Pictures Subject = P Language and Literature: PN Literature (General): PN0441 Literary History Subject = D History General and Old World: DC France Subject = K Law: KD England and Wales Subject = D History General and Old World: DK Russia. Soviet Union. Former Soviet Republics Subject = Q Science: QE Geology Subject = R Medicine: RC Internal medicine Subject = Q Science: QR Microbiology Subject = J Political Science: JN Political institutions (Europe): JN101 Great Britain Subject = H Social Sciences: HD Industries. Land use. Labor Subject = B Philosophy. Psychology. Religion: BV Practical Theology: BV1460 Religious Education Subject = A General Works: AZ History of Scholarship The Humanities Subject = Q Science: QM Human anatomy Subject = L Education: LB Theory and practice of education: LB1603 Secondary Education. High schools Subject = D History General and Old World: DJ Netherlands (Holland): DJK Eastern Europe Subject = D History General and Old World: D History (General): D839 Post-war History, 1945 on Subject = R Medicine: RK Dentistry Subject = P Language and Literature: PN Literature (General) Subject = B Philosophy. Psychology. Religion: BQ Buddhism Subject = P Language and Literature: PN Literature (General): PN2000 Dramatic representation. The Theater Subject = D History General and Old World: DS Asia Subject = C Auxiliary Sciences of History: CN Inscriptions. Epigraphy. Subject = B Philosophy. Psychology. Religion: BC Logic Subject = G Geography. Anthropology. Recreation: GV Recreation Leisure Subject = H Social Sciences: HD Industries. Land use. Labor: HD28 Management. Industrial Management Subject = K Law Subject = J Political Science: JL Political institutions (America except United States) Subject = V Naval Science: VM Naval architecture. Shipbuilding. Marine engineering Subject = J Political Science: JF Political institutions (General) Subject = D History General and Old World: DD Germany Subject = M Music and Books on Music: ML Literature of music Subject = H Social Sciences: HM Sociology Subject = C Auxiliary Sciences of History: CB History of civilization Subject = L Education: LB Theory and practice of education: LB1501 Primary Education Subject = L Education: LF Individual institutions (Europe) Subject = B Philosophy. Psychology. Religion: BH Aesthetics Subject = P Language and Literature: PL Languages and literatures of Eastern Asia, Africa, Oceania Subject = C Auxiliary Sciences of History: CC Archaeology Subject = K Law: KD England and Wales: KDC Scotland Subject = T Technology: T Technology (General): T201 Patents. Trademarks Subject = Q Science: QA Mathematics Subject = N Fine Arts: N Visual arts (General) For photography, see TR Subject = R Medicine: RS Pharmacy and materia medica Subject = R Medicine: RC Internal medicine: RC0321 Neuroscience. Biological psychiatry. Neuropsychiatry Subject = Q Science: QH Natural history: QH426 Genetics Subject = Q Science: QH Natural history: QH301 Biology Subject = B Philosophy. Psychology. Religion: BJ Ethics Subject = L Education: LE Individual institutions (America except United States) Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources: ZA4450 Databases Subject = P Language and Literature: PQ Romance literatures Subject = P Language and Literature: PI Oriental languages and literatures Subject = B Philosophy. Psychology. Religion: BP Islam. Bahaism. Theosophy, etc Subject = T Technology: TN Mining engineering. Metallurgy Subject = J Political Science: JV Colonies and colonization. Emigration and immigration. International migration Subject = L Education: LB Theory and practice of education: LB2361 Curriculum Subject = D History General and Old World: DR Balkan Peninsula Subject = H Social Sciences: HS Societies secret benevolent etc Subject = B Philosophy. Psychology. Religion: BV Practical Theology Subject = P Language and Literature: PJ Semitic Subject = Q Science: Q Science (General) Subject = D History General and Old World: D History (General): D051 Ancient History Subject = J Political Science: JC Political theory Subject = R Medicine: RM Therapeutics. Pharmacology Subject = P Language and Literature: PK Indo-Iranian Subject = R Medicine: RG Gynecology and obstetrics Subject = P Language and Literature: PF West Germanic Subject = B Philosophy. Psychology. Religion: BD Speculative Philosophy Subject = H Social Sciences Subject = H Social Sciences: HA Statistics Subject = T Technology: TD Environmental technology. Sanitary engineering Subject = P Language and Literature Subject = D History General and Old World: DL Northern Europe. Scandinavia Subject = L Education Subject = Q Science: QP Physiology Subject = A General Works: AM Museums (General). Collectors and collecting (General) Subject = R Medicine: RJ Pediatrics Subject = G Geography. Anthropology. Recreation: GC Oceanography Subject = N Fine Arts: NK Decorative arts Applied arts Decoration and ornament Subject = Z Bibliography. Library Science. Information Resources: Z719 Libraries (General) Subject = V Naval Science Subject = P Language and Literature: PB Modern European Languages: PB1501 Gaelic (Scottish Gaelic, Erse) Subject = H Social Sciences: HE Transportation and Communications Subject = T Technology: TG Bridge engineering Subject = T Technology Subject = H Social Sciences: H Social Sciences (General) Subject = P Language and Literature: PE English Subject = S Agriculture: SB Plant culture Subject = D History General and Old World: D History (General): D901 Europe (General) Subject = V Naval Science: V Naval Science (General) Subject = P Language and Literature: PD Germanic languages Subject = H Social Sciences: HN Social history and conditions. Social problems. Social reform Subject = R Medicine: RT Nursing Subject = D History General and Old World: D History (General): D111 Medieval History Subject = D History General and Old World: DB Austria Subject = N Fine Arts: NE Print media Subject = S Agriculture: SF Animal culture Subject = G Geography. Anthropology. Recreation: GE Environmental Sciences Subject = T Technology: TL Motor vehicles. Aeronautics. Astronautics Subject = C Auxiliary Sciences of History: CE Technical chronology. Calendar Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources: ZA4050 Electronic information resources Subject = B Philosophy. Psychology. Religion: BX Christian Denominations Subject = S Agriculture Subject = F History United States, Canada, Latin America: F1201 Latin America (General) Subject = G Geography. Anthropology. Recreation: GA Mathematical geography. Cartography Subject = D History General and Old World: DG Italy Subject = T Technology: TP Chemical technology Subject = S Agriculture: SK Hunting sports Subject = P Language and Literature: PA Classical philology Subject = R Medicine: RD Surgery Subject = L Education: LD Individual institutions (United States) Subject = J Political Science: JN Political institutions (Europe): JN1187 Scotland Subject = E History America: E151 United States (General) Subject = G Geography. Anthropology. Recreation: GN Anthropology Subject = M Music and Books on Music Subject = H Social Sciences: HD Industries. Land use. Labor: HD61 Risk Management Subject = P Language and Literature: PR English literature Subject = J Political Science: JS Local government Municipal government Subject = T Technology: T Technology (General) 58 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo56.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo56.xml
new file mode 100644
index 0000000..97884ca
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo56.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung DESY Publication Database DESY Publication Database http://pubdb.desy.de/desy-header/head_left.gif DE 9.883 53.572 1 http://pubdb.desy.de/ DESY library@desy.de OAI http://pubdb.desy.de/oai2 oai_dc 3354 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo57.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo57.xml
new file mode 100644
index 0000000..1bb34bc
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo57.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS ART-Dok Publikationsplattform Kunstgeschichte Art-DOK - Digital Repository Art History http://archiv.ub.uni-heidelberg.de/artdok/Icons/art-dok_dt.gif DE 8.707999 49.409922 1 http://archiv.ub.uni-heidelberg.de/artdok/ Universität Heidelberg Effinger@ub.uni-heidelberg.de OAI http://archiv.ub.uni-heidelberg.de/artdok/oai2/oai2.php oai_dc 599 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo58.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo58.xml
new file mode 100644
index 0000000..e5b6a79
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo58.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software UNESCO-IHE Institute for Water Education UNESCO-IHE Institute for Water Education http://www.unesco-ihe.org/design/ihe/images/logo.gif NL 4.3562185 52.0090527 1 http://www.narcis.info/repositories/repository/UNESCO/Language/en/ UNESCO-IHE Institute for Water Educatio a.j.bosman@tudelft.nl OAI http://repository.tudelft.nl/ihe/oai oai_dc 21 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo59.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo59.xml
new file mode 100644
index 0000000..7d87f3c
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo59.xml
@@ -0,0 +1,2 @@
+
+DSpace 0 0 Cranfield CERES Cranfield CERES UK 0.631265 52.07001 0.0 http://dspace.lib.cranfield.ac.uk/ Cranfield University paul.needham11@btinternet.com OAI http://dspace.lib.cranfield.ac.uk/dspace-oai/request oai_dc uketd_dc All sets 2767 0.0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo6.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo6.xml
new file mode 100644
index 0000000..4a03cdb
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo6.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Durham Research Online Durham Research Online http://www.dur.ac.uk/images/template/logounidurham-new.gif UK -1.5667 54.7667 0 http://dro.dur.ac.uk sebastian.palucha@durham.ac.uk OAI http://dro.dur.ac.uk/perl/oai2 oai_dc Status = Unpublished Status = Published Status = In Press Subject = D History General and Old World: DA Great Britain: DAW Central Europe Subject = Q Science: QP Physiology Subject = R Medicine: RC Internal medicine: RC0254 Neoplasms. Tumors. Oncology (including Cancer) Subject = Q Science: QR Microbiology Subject = M Music and Books on Music: MT Musical instruction and study Subject = J Political Science: JA Political science (General) Subject = R Medicine: R Medicine (General) Subject = N Fine Arts: N Visual arts (General) For photography, see TR Subject = J Political Science: JC Political theory Subject = C Auxiliary Sciences of History: CB History of civilization Subject = G Geography. Anthropology. Recreation: G Geography (General) Subject = C Auxiliary Sciences of History: CC Archaeology Subject = C Auxiliary Sciences of History: CD Diplomatics. Archives. Seals Subject = J Political Science: JF Political institutions (General) Subject = C Auxiliary Sciences of History: CE Technical chronology. Calendar Subject = T Technology: T Technology (General): T201 Patents. Trademarks Subject = D History General and Old World: D History (General): D051 Ancient History Subject = A General Works Subject = J Political Science: JK Political institutions (United States) Subject = C Auxiliary Sciences of History: CJ Numismatics Subject = B Philosophy. Psychology. Religion Subject = J Political Science: JL Political institutions (America except United States) Subject = C Auxiliary Sciences of History Subject = D History General and Old World Subject = Z Bibliography. Library Science. Information Resources: Z719 Libraries (General) Subject = J Political Science: JN Political institutions (Europe) Subject = E History America Subject = F History United States, Canada, Latin America Subject = R Medicine: RC Internal medicine: RC0321 Neuroscience. Biological psychiatry. Neuropsychiatry Subject = G Geography. Anthropology. Recreation Subject = C Auxiliary Sciences of History: CN Inscriptions. Epigraphy. Subject = L Education: LB Theory and practice of education: LB2361 Curriculum Subject = H Social Sciences Subject = B Philosophy. Psychology. Religion: BV Practical Theology: BV1460 Religious Education Subject = P Language and Literature: PN Literature (General): PN0080 Criticism Subject = J Political Science Subject = K Law Subject = L Education Subject = J Political Science: JQ Political institutions Asia Subject = R Medicine: RA Public aspects of medicine Subject = M Music and Books on Music Subject = R Medicine: RB Pathology Subject = N Fine Arts: NA Architecture Subject = N Fine Arts Subject = J Political Science: JS Local government Municipal government Subject = C Auxiliary Sciences of History: CR Heraldry Subject = V Naval Science: V Naval Science (General) Subject = R Medicine: RC Internal medicine Subject = N Fine Arts: NB Sculpture Subject = G Geography. Anthropology. Recreation: GA Mathematical geography. Cartography Subject = C Auxiliary Sciences of History: CS Genealogy Subject = R Medicine: RD Surgery Subject = N Fine Arts: NC Drawing Design Illustration Subject = G Geography. Anthropology. Recreation: GB Physical geography Subject = C Auxiliary Sciences of History: CT Biography Subject = R Medicine: RE Ophthalmology Subject = N Fine Arts: ND Painting Subject = K Law: K Law (General) Subject = J Political Science: JV Colonies and colonization. Emigration and immigration. International migration Subject = G Geography. Anthropology. Recreation: GC Oceanography Subject = R Medicine: RF Otorhinolaryngology Subject = N Fine Arts: NE Print media Subject = D History General and Old World: D History (General) Subject = R Medicine: RG Gynecology and obstetrics Subject = J Political Science: JX International law Subject = G Geography. Anthropology. Recreation: GE Environmental Sciences Subject = G Geography. Anthropology. Recreation: GF Human ecology. Anthropogeography Subject = D History General and Old World: D History (General): D731 World War II Subject = J Political Science: JN Political institutions (Europe): JN1187 Scotland Subject = P Language and Literature Subject = Q Science Subject = J Political Science: JZ International relations Subject = R Medicine: RJ Pediatrics Subject = R Medicine Subject = S Agriculture Subject = R Medicine: RK Dentistry Subject = T Technology Subject = R Medicine: RL Dermatology Subject = U Military Science Subject = N Fine Arts: NK Decorative arts Applied arts Decoration and ornament Subject = V Naval Science Subject = R Medicine: RM Therapeutics. Pharmacology Subject = R Medicine: RA Public aspects of medicine: RA1001 Forensic Medicine. Medical jurisprudence. Legal medicine Subject = G Geography. Anthropology. Recreation: GN Anthropology Subject = Z Bibliography. Library Science. Information Resources Subject = R Medicine: RS Pharmacy and materia medica Subject = R Medicine: RT Nursing Subject = G Geography. Anthropology. Recreation: GR Folklore Subject = S Agriculture: S Agriculture (General) Subject = R Medicine: RV Botanic, Thomsonian, and eclectic medicine Subject = G Geography. Anthropology. Recreation: GT Manners and customs Subject = D History General and Old World: DA Great Britain Subject = D History General and Old World: DB Austria Subject = R Medicine: RX Homeopathy Subject = K Law: KD England and Wales Subject = H Social Sciences: H Social Sciences (General) Subject = G Geography. Anthropology. Recreation: GV Recreation Leisure Subject = D History General and Old World: DC France Subject = N Fine Arts: NX Arts in general Subject = D History General and Old World: DD Germany Subject = Q Science: QH Natural history: QH301 Biology Subject = K Law: KF United States Federal Law Subject = F History United States, Canada, Latin America: F1201 Latin America (General) Subject = D History General and Old World: DE The Mediterranean Region. The Greco-Roman World Subject = D History General and Old World: DF Greece Subject = D History General and Old World: DG Italy Subject = P Language and Literature: PN Literature (General): PN2000 Dramatic representation. The Theater Subject = D History General and Old World: DH Netherlands (The Low Countries) Subject = R Medicine: RZ Other systems of medicine Subject = R Medicine: RJ Pediatrics: RJ101 Child Health. Child health services Subject = H Social Sciences: HD Industries. Land use. Labor: HD28 Management. Industrial Management Subject = D History General and Old World: DJ Netherlands (Holland) Subject = V Naval Science: VM Naval architecture. Shipbuilding. Marine engineering Subject = D History General and Old World: DK Russia. Soviet Union. Former Soviet Republics Subject = D History General and Old World: DL Northern Europe. Scandinavia Subject = Q Science: QH Natural history: QH426 Genetics Subject = D History General and Old World: D History (General): D880 Developing Countries Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources Subject = D History General and Old World: DP Spain Subject = L Education: LC Special aspects of education: LC5201 Education extension. Adult education. Continuing education Subject = S Agriculture: SB Plant culture Subject = R Medicine: RA Public aspects of medicine: RA0421 Public health. Hygiene. Preventive Medicine Subject = D History General and Old World: DR Balkan Peninsula Subject = H Social Sciences: HA Statistics Subject = D History General and Old World: DS Asia Subject = S Agriculture: SD Forestry Subject = P Language and Literature: P Philology. Linguistics Subject = H Social Sciences: HB Economic Theory Subject = D History General and Old World: DT Africa Subject = L Education: L Education (General) Subject = H Social Sciences: HC Economic History and Conditions Subject = D History General and Old World: DU Oceania (South Seas) Subject = S Agriculture: SF Animal culture Subject = H Social Sciences: HD Industries. Land use. Labor Subject = A General Works: AC Collections. Series. Collected works Subject = H Social Sciences: HE Transportation and Communications Subject = S Agriculture: SH Aquaculture. Fisheries. Angling Subject = H Social Sciences: HF Commerce Subject = H Social Sciences: HG Finance Subject = A General Works: AI Indexes (General) Subject = D History General and Old World: D History (General): D501 World War I Subject = D History General and Old World: D History (General): D839 Post-war History, 1945 on Subject = K Law: KZ Law of Nations Subject = S Agriculture: SK Hunting sports Subject = Q Science: QR Microbiology: QR180 Immunology Subject = H Social Sciences: HJ Public Finance Subject = A General Works: AM Museums (General). Collectors and collecting (General) Subject = H Social Sciences: HM Sociology Subject = H Social Sciences: HN Social history and conditions. Social problems. Social reform Subject = D History General and Old World: D History (General): D901 Europe (General) Subject = D History General and Old World: DJ Netherlands (Holland): DJK Eastern Europe Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources: ZA4050 Electronic information resources Subject = H Social Sciences: HQ The family. Marriage. Woman Subject = P Language and Literature: PA Classical philology Subject = P Language and Literature: PN Literature (General): PN1990 Broadcasting Subject = P Language and Literature: PB Modern European Languages Subject = H Social Sciences: HS Societies secret benevolent etc Subject = J Political Science: JN Political institutions (Europe): JN101 Great Britain Subject = L Education: LA History of education Subject = T Technology: T Technology (General) Subject = P Language and Literature: PC Romance languages Subject = A General Works: AS Academies and learned societies (General) Subject = H Social Sciences: HT Communities. Classes. Races Subject = L Education: LB Theory and practice of education Subject = P Language and Literature: PD Germanic languages Subject = L Education: LC Special aspects of education Subject = P Language and Literature: PN Literature (General): PN1993 Motion Pictures Subject = P Language and Literature: PE English Subject = L Education: LD Individual institutions (United States) Subject = H Social Sciences: HV Social pathology. Social and public welfare Subject = P Language and Literature: PF West Germanic Subject = L Education: LE Individual institutions (America except United States) Subject = B Philosophy. Psychology. Religion: B Philosophy (General) Subject = P Language and Literature: PG Slavic, Baltic, Albanian languages and literature Subject = L Education: LF Individual institutions (Europe) Subject = H Social Sciences: HX Socialism. Communism. Anarchism Subject = P Language and Literature: PH Finno-Ugrian, Basque languages and literatures Subject = L Education: LG Individual institutions (Asia. Africa) Subject = P Language and Literature: PI Oriental languages and literatures Subject = P Language and Literature: PJ Semitic Subject = A General Works: AZ History of Scholarship The Humanities Subject = P Language and Literature: PK Indo-Iranian Subject = P Language and Literature: PL Languages and literatures of Eastern Asia, Africa, Oceania Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources: ZA4450 Databases Subject = P Language and Literature: PN Literature (General): PN0441 Literary History Subject = P Language and Literature: PM Hyperborean, Indian, and Artificial languages Subject = P Language and Literature: PN Literature (General) Subject = L Education: LB Theory and practice of education: LB1501 Primary Education Subject = H Social Sciences: HF Commerce: HF5601 Accounting Subject = D History General and Old World: D History (General): D204 Modern History Subject = P Language and Literature: PB Modern European Languages: PB1501 Gaelic (Scottish Gaelic, Erse) Subject = R Medicine: RC Internal medicine: RC1200 Sports Medicine Subject = P Language and Literature: PQ Romance literatures Subject = P Language and Literature: PR English literature Subject = T Technology: TA Engineering (General). Civil engineering (General) Subject = P Language and Literature: PS American literature Subject = P Language and Literature: PT Germanic literature Subject = T Technology: TC Hydraulic engineering. Ocean engineering Subject = L Education: LT Textbooks Subject = T Technology: TD Environmental technology. Sanitary engineering Subject = Q Science: Q Science (General) Subject = T Technology: TE Highway engineering. Roads and pavements Subject = M Music and Books on Music: M Music Subject = E History America: E151 United States (General) Subject = Z Bibliography. Library Science. Information Resources: Z665 Library Science. Information Science Subject = T Technology: TF Railroad engineering and operation Subject = B Philosophy. Psychology. Religion: BC Logic Subject = T Technology: TG Bridge engineering Subject = B Philosophy. Psychology. Religion: BD Speculative Philosophy Subject = T Technology: TH Building construction Subject = B Philosophy. Psychology. Religion: BF Psychology Subject = B Philosophy. Psychology. Religion: BH Aesthetics Subject = D History General and Old World: D History (General): D890 Eastern Hemisphere Subject = P Language and Literature: PZ Childrens literature Subject = F History United States, Canada, Latin America: F1001 Canada (General) Subject = L Education: LB Theory and practice of education: LB2300 Higher Education Subject = T Technology: TJ Mechanical engineering and machinery Subject = T Technology: TK Electrical engineering. Electronics Nuclear engineering Subject = D History General and Old World: D History (General): D111 Medieval History Subject = Z Bibliography. Library Science. Information Resources: Z004 Books. Writing. Paleography Subject = T Technology: TL Motor vehicles. Aeronautics. Astronautics Subject = B Philosophy. Psychology. Religion: BJ Ethics Subject = T Technology: TN Mining engineering. Metallurgy Subject = B Philosophy. Psychology. Religion: BL Religion Subject = B Philosophy. Psychology. Religion: BM Judaism Subject = E History America: E11 America (General) Subject = T Technology: TP Chemical technology Subject = F History United States, Canada, Latin America: F001 United States local history Subject = T Technology: TR Photography Subject = T Technology: TS Manufactures Subject = B Philosophy. Psychology. Religion: BP Islam. Bahaism. Theosophy, etc Subject = K Law: KD England and Wales: KDC Scotland Subject = T Technology: TT Handicrafts Arts and crafts Subject = Q Science: QA Mathematics Subject = B Philosophy. Psychology. Religion: BQ Buddhism Subject = Q Science: QB Astronomy Subject = B Philosophy. Psychology. Religion: BR Christianity Subject = U Military Science: U Military Science (General) Subject = Q Science: QC Physics Subject = B Philosophy. Psychology. Religion: BS The Bible Subject = Q Science: QD Chemistry Subject = B Philosophy. Psychology. Religion: BT Doctrinal Theology Subject = H Social Sciences: HD Industries. Land use. Labor: HD61 Risk Management Subject = T Technology: TX Home economics Subject = Q Science: QE Geology Subject = J Political Science: J General legislative and executive papers Subject = B Philosophy. Psychology. Religion: BV Practical Theology Subject = C Auxiliary Sciences of History: C Auxiliary sciences of history (General) Subject = Q Science: QH Natural history Subject = B Philosophy. Psychology. Religion: BX Christian Denominations Subject = Q Science: QR Microbiology: QR355 Virology Subject = Q Science: QK Botany Subject = C Auxiliary Sciences of History: CD Diplomatics. Archives. Seals: CD921 Archives Subject = Q Science: QL Zoology Subject = Q Science: QM Human anatomy Subject = Q Science: QA Mathematics: QA75 Electronic computers. Computer science Subject = M Music and Books on Music: ML Literature of music Subject = Q Science: QA Mathematics: QA76 Computer software Subject = L Education: LB Theory and practice of education: LB1603 Secondary Education. High schools 4983 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo60.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo60.xml
new file mode 100644
index 0000000..dd4f9d8
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo60.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Genova - ISEM Repository National Research Council Genova - ISEM Repository http://leonardo.isti.cnr.it/metaopac/sfondi/isem.gif IT 8.926821 44.414616 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/isemge_geConf/cnr_isemge-pub-list.sys.file_x Istituto di Storia dell'Europa Mediterranea giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 6 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo61.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo61.xml
new file mode 100644
index 0000000..a176e4b
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo61.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints LSE Research Online LSE Research Online http://www.lse.ac.uk/images/header/library.jpg UK -0.1167 51.5 0 http://eprints.lse.ac.uk/ s.mcleish@lse.ac.uk OAI http://eprints.lse.ac.uk/perl/oai2 oai_dc Data Library Trial 1 Kate (BSS) Projects Team Documents Collection Projects Team Private Documents Test1 6764 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo62.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo62.xml
new file mode 100644
index 0000000..2fb1394
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo62.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Bologna - IMM Repository National Research Council Bologna - IMM Repository http://www.imm.cnr.it/artwork/header_green_3_left.jpg IT 11.30 44.53 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/cnrpConf/cnr_immbo-pub-list.sys.file_x Institute for Microelectronics and Microsystems - CNR Bologna giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 2 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo63.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo63.xml
new file mode 100644
index 0000000..88a472c
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo63.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat Rovira i Virgili: Tesis Doctorals en Xarxa (TDX) Univ. Rovira i Virgil: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES 1.260145 41.119736 1 http://www.tdx.cesca.es/ Universitat Rovira i Virgili tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_URV/NDLTD-OAI/oai.pl oai_dc 378 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo64.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo64.xml
new file mode 100644
index 0000000..22678cf
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo64.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Taranto - IAMC Repository National Research Council Taranto - IAMC Repository http://leonardo.isti.cnr.it/metaopac/sfondi/logoCNR.jpg IT 17.236384 40.474479 1 http://leonardo.isti.cnr.it/metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/iamcta_taConf/cnr_iamcta-pub-list.sys.file_x Istituto per l'Ambiente Marino Costiero - CNR Taranto giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 1 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo65.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo65.xml
new file mode 100644
index 0000000..d4dddfe
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo65.xml
@@ -0,0 +1,2 @@
+
+0 0 Fedora DIPP NRW DIPP NRW http://www.dipp.nrw.de/favicon.gif DE 6.936 50.935 1 http://www.dipp.nrw.de/ Hochschulbibliothekszentrum Köln dipp-tech@hbz-nrw.de OAI http://www.dipp.nrw.de/repository/oai oai_dc 847 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo66.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo66.xml
new file mode 100644
index 0000000..7cdfdff
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo66.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Royal Holloway Research Online Univ. of London, Royal Holloway: Research Online http://www.rhul.ac.uk/information-services/library/images/rheprints.gif UK -0.5469 51.43 0 http://eprints.rhul.ac.uk/ mailto:eprints@rhul.ac.uk OAI http://eprints.rhul.ac.uk/perl/oai2 oai_dc 1015 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo67.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo67.xml
new file mode 100644
index 0000000..e7cdee2
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo67.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Digital.CSIC Digital.CSIC http://digital.csic.es/image/digital_csic_en.gif ES -3.68631 40.437889 1 http://digital.csic.es/ Spanish National Research Council (CSIC) digital.csic-soportetecnico@csic.es OAI http://servmadrono.cs.urjc.es:8010/arcFuturo/servlet/OAIDPcsic oai_dc 6351 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo68.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo68.xml
new file mode 100644
index 0000000..b4bb6c2
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo68.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints ePrints.FRI ePrints.FRI http://eprints.fri.uni-lj.si/images/fri.png SI 14.505965 46.051426 1 http://eprints.fri.uni-lj.si/ Faculty of Computer and Information Science (FRI), University of Ljubljana, Slovenia. Miha.Peternel@fri.uni-lj.si OAI http://eprints.fri.uni-lj.si/perl/oai2 oai_dc 217 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo69.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo69.xml
new file mode 100644
index 0000000..65fed52
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo69.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace ECNIS Repository (Environmental Cancer Risk, Nutrition and Individual Susceptibility Repository) ECNIS Repository (Environmental Cancer Risk, Nutrition and Individual Susceptibility Repository) http://ecnis.openrepository.com/ecnis/image/header.gif PL 19.43716 51.801829 1 http://ecnis.openrepository.com Nofer Institute of Occupational Medicine library@imp.lodz.pl OAI http://ecnis.openrepository.com/ecnis/oai/request oai_dc 132 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo7.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo7.xml
new file mode 100644
index 0000000..41ed19f
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo7.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung E-LIB Dokumentserver E-LIB Document Server http://elib.suub.uni-bremen.de/bilder/ElibLogo.gif DE 8.863 53.105 1 http://elib.suub.uni-bremen.de/cocoon/diss/start University Bremen haake@suub.uni-bremen.de OAI http://elib.suub.uni-bremen.de/cgi-bin/oai2 oai_dc 1110 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo70.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo70.xml
new file mode 100644
index 0000000..8d25b37
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo70.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software Oulun yliopiston julkaisemia elektronisia julkaisuja University of Oulu - Electronic Publications http://www.kirjasto.oulu.fi/grafiikka/logot/logo_su.gif FI 25.466 65.059 1 http://www.kirjasto.oulu.fi/english/julkaisutoiminta/elektroniset/ University of Oulu Ville.Varjonen@oulu.fi OAI http://herkules.oulu.fi/OAI/OAI-script.xsql oai_dc 1191 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo71.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo71.xml
new file mode 100644
index 0000000..966f4d4
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo71.xml
@@ -0,0 +1,2 @@
+
+0 0 OAI Repository of the Technische Universiteit Eindhoven (TU/e) Technische Univ. Eindhoven: Repository TU/e http://w3.tue.nl/fileadmin/tue/img/tue-logo.gif NL 5.484 51.4344 1 http://w3.tue.nl/en/ denis@sandcat.nl OAI http://library.tue.nl/csp/dare/DARE.Repository.cls oai_dc dare_qdc dare_didl Publications TU/e Publications Keur der Wetenschap 16265 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo72.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo72.xml
new file mode 100644
index 0000000..2f135ee
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo72.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS University of Technics Hamburg, GERMANY, TUBdok TUBdok - Publication Server of the Hamburg University of Technology DE 9.992 53.55 1 http://doku.b.tu-harburg.de/ mailto:tubdok@tu-harburg.de OAI http://doku.b.tu-harburg.de/oai/oai2.php oai_dc epicur oai_pp xMetaDiss XMetaDissPlus Data processing Computer science Library and information sciences Psychology Social sciences Economics Education Commerce, communications, transport Mathematics Physics Chemistry and allied sciences Life sciences Technology (Applied sciences) Engineering and allied operations Chemical engineering Civic and landscape art Article Book HonoursThesis InBook InProceedings Journal Manual MastersThesis Misc Preprint Proceedings ResearchPaper TechReport Text.Thesis.Doctoral Everything with an SWB identiifer Everything without an SWB identiifer 459 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo73.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo73.xml
new file mode 100644
index 0000000..4d86366
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo73.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Oxford Eprints Oxford Univ. Library Services: Oxford Eprints http://www.lib.ox.ac.uk/images/crest/reverse-small.gif UK -1.25 51.75 0 http://eprints.ouls.ox.ac.uk/ mailto:benjamin.osteen@sers.ox.ac.uk OAI http://eprints.ouls.ox.ac.uk/perl/oai2 oai_dc mets Status = In Press Status = Published Status = Unpublished Subject = B.SHERPA Oxford Classification: Generalities Subject = A.University of Oxford Departments: MEDICAL SCIENCES: NON-CLINICAL: Pathology Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Clinical Laboratory Sciences Subject = B.SHERPA Oxford Classification: Language: Italic languages, i.e., Latin Subject = A.University of Oxford Departments: HUMANITIES: Chinese Studies Subject = A.University of Oxford Departments: HUMANITIES: American Studies Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Psychology Subject = A.University of Oxford Departments: SOCIAL SCIENCES: European Studies Subject = A.University of Oxford Departments: HUMANITIES Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Clinical Pharmacology Subject = B.SHERPA Oxford Classification: Generalities: Library & information sciences Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Human Genetics (Wellcome Trust Centre for Medical Oncology) Subject = B.SHERPA Oxford Classification: Geography & History: General history of other areas Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: English and Old English literature Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Botanical sciences Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Educational Studies Subject = A.University of Oxford Departments: LIFE AND ENVIRONMENTAL SCIENCES: Plant Sciences Subject = A.University of Oxford Departments: LIFE AND ENVIRONMENTAL SCIENCES: Geography Subject = A.University of Oxford Departments: CONTINUING EDUCATION: Continuing Education Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Astronomy & allied sciences Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: Spanish & Portuguese literatures Subject = A.University of Oxford Departments: LIFE AND ENVIRONMENTAL SCIENCES: Archaeology Subject = A.University of Oxford Departments: MEDICAL SCIENCES: NON-CLINICAL: Pharmacology Subject = B.SHERPA Oxford Classification: Social Sciences: Law Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Metaphysics Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: Literatures of Romance languages Subject = B.SHERPA Oxford Classification: Language: Italian, Romanian, Rhaeto-Romanic languages Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: PHYSICAL SCIENCES: Engineering Science Subject = B.SHERPA Oxford Classification: The Arts Subject = A.University of Oxford Departments: HUMANITIES: History of Art Subject = A.University of Oxford Departments: HUMANITIES: Modern History Subject = A.University of Oxford Departments: ASUC (Academic Services): OULS Subject = A.University of Oxford Departments: HUMANITIES: History of Medicine Subject = B.SHERPA Oxford Classification: Generalities: Bibliographies & catalogues Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: Literatures of other languages Subject = B.SHERPA Oxford Classification: Geography & History: General history of Asia & Far East Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Manufacture for specific uses Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Zoological sciences Subject = B.SHERPA Oxford Classification: Religion: Judaism Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Molecular Medicine (Weatherall Institute) Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Chemical engineering Subject = B.SHERPA Oxford Classification: Social Sciences: Economics Subject = B.SHERPA Oxford Classification: Geography & History: General history of Europe Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Anaesthetics Subject = B.SHERPA Oxford Classification: The Arts: Photography & photographs Subject = B.SHERPA Oxford Classification: The Arts: Plastic arts Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Law Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL Subject = B.SHERPA Oxford Classification: Religion Subject = B.SHERPA Oxford Classification: Language: English & Old English Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Psychiatry Subject = B.SHERPA Oxford Classification: The Arts: Recreational & performing arts Subject = B.SHERPA Oxford Classification: Religion: Buddhism Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Ethics (Moral philosophy) Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Russian and East European Studies Subject = B.SHERPA Oxford Classification: Generalities: News media, journalism, publishing Subject = B.SHERPA Oxford Classification: Social Sciences: Public administration Subject = B.SHERPA Oxford Classification: Literature & Rhetoric Subject = B.SHERPA Oxford Classification: Language: Spanish & Portuguese languages Subject = B.SHERPA Oxford Classification: Geography & History: Biography, genealogy, insignias Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: MATHEMATICAL SCIENCES Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Earth sciences Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Social Policy and Social Work Subject = A.University of Oxford Departments: ASUC (Academic Services) Subject = B.SHERPA Oxford Classification: Language: Other languages Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Paediatrics Subject = B.SHERPA Oxford Classification: Language: Romance languages, i.e., French Subject = A.University of Oxford Departments: CONTINUING EDUCATION Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: Italian, Romanian, Rhaeto-Romanic Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: Hellenic literatures, i.e., Classical Greek Subject = B.SHERPA Oxford Classification: Generalities: General organisations & museology Subject = B.SHERPA Oxford Classification: Social Sciences: General statistics Subject = B.SHERPA Oxford Classification: Religion: Religions of the Far East Subject = B.SHERPA Oxford Classification: Religion: Islam Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Clinical Neurology Subject = B.SHERPA Oxford Classification: Religion: Prehistoric and primitve religions Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Home economics & family living Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Japanese Studies Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: PHYSICAL SCIENCES: Materials Subject = B.SHERPA Oxford Classification: The Arts: Architecture Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Epistemology, causation, humankind Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: MATHEMATICAL SCIENCES: Statistics Subject = A.University of Oxford Departments: LIFE AND ENVIRONMENTAL SCIENCES: Zoology (including the Institute of Biological Anthropology) Subject = A.University of Oxford Departments: HUMANITIES: English Language and Literature Subject = B.SHERPA Oxford Classification: Generalities: Manuscripts & rare books Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Politics and International Relations Subject = B.SHERPA Oxford Classification: Geography & History: General history of South America Subject = A.University of Oxford Departments: SOCIAL SCIENCES Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Physics Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Internet Institute Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Medical sciences Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Management Studies (Said Business School) Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Interdisciplinary Area Studies Subject = B.SHERPA Oxford Classification: Language: Linguistics Subject = B.SHERPA Oxford Classification: Language Subject = B.SHERPA Oxford Classification: Social Sciences: Commerce, communications, transport Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Paleontology, Paleozoology Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: PHYSICAL SCIENCES: Physics Subject = B.SHERPA Oxford Classification: Geography & History: History of the ancient world Subject = B.SHERPA Oxford Classification: Geography & History Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Clinical Medicine Subject = A.University of Oxford Departments: LIFE AND ENVIRONMENTAL SCIENCES Subject = B.SHERPA Oxford Classification: The Arts: Drawing & decorative arts Subject = B.SHERPA Oxford Classification: Religion: Religions of the indian subcontinent. Hinduism, Jainism, Sihkism Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Ancient, medieval, Oriental philosophy Subject = B.SHERPA Oxford Classification: Philosophy & Psychology Subject = B.SHERPA Oxford Classification: Geography & History: General history of North America Subject = B.SHERPA Oxford Classification: Social Sciences Subject = B.SHERPA Oxford Classification: Geography & History: General history of Africa Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: PHYSICAL SCIENCES Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Logic Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Life Sciences Subject = A.University of Oxford Departments: HUMANITIES: Comparative Philology and General Linguistics and Phonetics Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Surgery Subject = A.University of Oxford Departments: ASUC (Academic Services): OUCS Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Cardiovascular Medicine Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Management & auxiliary services Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: Italic literatures, i.e., Latin Subject = B.SHERPA Oxford Classification: Language: Germanic languages, i.e., German Subject = B.SHERPA Oxford Classification: The Arts: Graphic arts Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics Subject = B.SHERPA Oxford Classification: Generalities: General encyclopaedic works Subject = A.University of Oxford Departments: SOCIAL SCIENCES: African Studies Subject = A.University of Oxford Departments: HUMANITIES: Classics (including Classical Languages and Literature and Ancient History) Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Engineering & allied sciences Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences) Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Ophthalmology Subject = A.University of Oxford Departments: HUMANITIES: Philosophy Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Sociology Subject = A.University of Oxford Departments: MEDICAL SCIENCES: NON-CLINICAL: Human Anatomy and Genetics Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: MATHEMATICAL SCIENCES: Mathematics Subject = B.SHERPA Oxford Classification: Generalities: General serials & their indexes Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Contemporary Chinese Studies Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Buildings Subject = B.SHERPA Oxford Classification: Religion: Modern spiritual movements Subject = A.University of Oxford Departments: LIFE AND ENVIRONMENTAL SCIENCES: Biochemistry Subject = B.SHERPA Oxford Classification: The Arts: Civic & landscape art Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Brazilian Studies Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: MATHEMATICAL SCIENCES: Computing Laboratory Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Development Studies (Queen Elizabeth House) Subject = B.SHERPA Oxford Classification: Social Sciences: Education Subject = A.University of Oxford Departments: MEDICAL SCIENCES Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Chemistry & allied sciences Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: PHYSICAL SCIENCES: Chemistry Subject = B.SHERPA Oxford Classification: Language: Hellenic languages, i.e., Classical Greek Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Public Health and Primary Care Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: Literatures of Germanic languages Subject = A.University of Oxford Departments: SOCIAL SCIENCES: South Asian Studies Subject = B.SHERPA Oxford Classification Subject = B.SHERPA Oxford Classification: Social Sciences: Social services; associations Subject = A.University of Oxford Departments: LIFE AND ENVIRONMENTAL SCIENCES: Anthropology Subject = A.University of Oxford Departments: HUMANITIES: Music Subject = B.SHERPA Oxford Classification: Natural Sciences & Mathematics: Mathematics Subject = B.SHERPA Oxford Classification: Social Sciences: Customs, etiquette, folklore Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Obstetrics and Gynaecology Subject = A.University of Oxford Departments: MEDICAL SCIENCES: NON-CLINICAL: Physiology Subject = A.University of Oxford Departments: HUMANITIES: Theology Subject = B.SHERPA Oxford Classification: Religion: Christianity Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Specific philosophical schools Subject = A.University of Oxford Departments: MEDICAL SCIENCES: CLINICAL: Orthopaedic Surgery Subject = B.SHERPA Oxford Classification: Literature & Rhetoric: American literature in English Subject = B.SHERPA Oxford Classification: Social Sciences: Political science Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Paranormal phenomena Subject = B.SHERPA Oxford Classification: Philosophy & Psychology: Modern Western philosophy Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Agriculture Subject = B.SHERPA Oxford Classification: The Arts: Music Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: PHYSICAL SCIENCES: Earth Sciences Subject = B.SHERPA Oxford Classification: Religion: Religions of antiquity. Minor cults and religions Subject = A.University of Oxford Departments: MEDICAL SCIENCES: NON-CLINICAL: Experimental Psychology Subject = A.University of Oxford Departments: HUMANITIES: Medieval and Modern Languages Subject = B.SHERPA Oxford Classification: Generalities: General collections Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Latin American Studies Subject = A.University of Oxford Departments: SOCIAL SCIENCES: Economics Subject = A.University of Oxford Departments: HUMANITIES: Ruskin School of Drawing and Fine Art Subject = A.University of Oxford Departments: MATHEMATICAL AND PHYSICAL SCIENCES: PHYSICAL SCIENCES: Astrophysics Subject = A.University of Oxford Departments: HUMANITIES: Oriental Studies Subject = A.University of Oxford Departments Subject = B.SHERPA Oxford Classification: Technology (Applied Sciences): Manufacturing Subject = A.University of Oxford Departments: MEDICAL SCIENCES: NON-CLINICAL Subject = B.SHERPA Oxford Classification: The Arts: Painting & paintings Subject = B.SHERPA Oxford Classification: Geography & History: Geography & travel 555 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo74.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo74.xml
new file mode 100644
index 0000000..4312d6c
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo74.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Nottingham ePrints The Univ. of Nottingham: ePrints http://www.nottingham.ac.uk/is/images/vis-logo.jpg UK -1.1667 52.9667 0 http://eprints.nottingham.ac.uk/ mailto:eprints@eprints.nottingham.ac.uk OAI http://eprints.nottingham.ac.uk/perl/oai2 oai_dc dp Status = Published Status = In Press Status = Unpublished School / Department = Faculty of Science: School of Computer Science and Information Technology School / Department = Faculty of Arts: School of Modern Languages: Department of Modern Cultural Studies School / Department = General: General School / Department = Faculty of Medicine and Health Sciences: School of Human Development School / Department = Faculty of Arts: School of Modern Languages: Postgraduate School of Critical Theory and Cultural Studies School / Department = Faculty of Arts: School of Humanities: Department of Art History School / Department = Faculty of Science: School of Biosciences: Food Sciences School / Department = Faculty of Arts: School of Humanities: Department of Classics School / Department = Faculty of Science: School of Biosciences: Nutritional Sciences School / Department = Faculty of Medicine and Health Sciences: School of Human Development: Obstetrics Midwifery and Gynaecology School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences School / Department = Faculty of Arts: School of Modern Languages: Department of Russian and Slavonic Studies School / Department = Faculty of Engineering: School of Civil Engineering: Engineering, Surveying and Space Geodesy School / Department = Faculty of Science: School of Psychology School / Department = Faculty of Law and Social Sciences: School of the Built Environment School / Department = Faculty of Law and Social Sciences: Institute for the Study of Genetics, Biorisks and Society School / Department = Faculty of Arts: School of American and Canadian Studies: Institute of Film Studies School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences: Trent Institute for Health Services Research School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Genetics School / Department = Faculty of Science: School of Chemistry School / Department = General School / Department = Faculty of Arts: School of Humanities: Department of Archaeology School / Department = Faculty of Arts: School of English Studies School / Department = Faculty of Medicine and Health Sciences: School of Nursing School / Department = Faculty of Arts: School of Modern Languages: Department of French School / Department = Faculty of Engineering School / Department = Faculty of Arts: School of Modern Languages: Department of German School / Department = Faculty of Law and Social Sciences: School of Politics School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences: Child and Adolescent Psychiatry School / Department = Faculty of Arts: School of Humanities: Department of Philosophy School / Department = Faculty of Science: School of Chemistry: Department of Organic Chemistry School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Immunology School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Clinical Chemistry School / Department = Faculty of Law and Social Sciences: Nottingham University Business School School / Department = Faculty of Education: School of Continuing Education School / Department = Faculty of Medicine and Health Sciences: School of Medical and Surgical Sciences: Anaesthesia School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Microbiology and Infectious Diseases School / Department = Faculty of Arts: School of Modern Languages: Department of Portuguese School / Department = Faculty of Science: School of Life and Environmental Sciences School / Department = General: Information Services School / Department = Faculty of Arts: School of Modern Languages: Department of Hispanic and Latin American Studies School / Department = Faculty of Arts: School of History School / Department = Faculty of Law and Social Sciences: Institute of Work, Health and Organization School / Department = Faculty of Arts: School of Modern Languages School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Infections and Immunity School / Department = Faculty of Science: School of Biosciences: Animal Physiology School / Department = Faculty of Law and Social Sciences: School of Economics School / Department = Faculty of Science: School of Pharmacy School / Department = Faculty of Medicine and Health Sciences: School of Medical and Surgical Sciences: Academic Radiology School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Pathology School / Department = Faculty of Engineering: School of Mechanical, Materials and Manufacturing Engineering School / Department = Faculty of Medicine and Health Sciences: School of Biomedical Sciences School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences: Learning Disabilities School / Department = Faculty of Law and Social Sciences: School of Sociology and Social Policy School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences: Physiotherapy School / Department = Faculty of Medicine and Health Sciences: School of Medical and Surgical Sciences: Medicine School / Department = Faculty of Education School / Department = Faculty of Medicine and Health Sciences: Institute of Hearing Research School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences: General Practice School / Department = Faculty of Science: School of Chemistry: Department of Physical Chemistry School / Department = Faculty of Engineering: School of Chemical, Environmental and Mining Engineering School / Department = Faculty of Education: School of Education School / Department = Faculty of Science: School of Mathematical Sciences: Theoretical Mechanics School / Department = Faculty of Law and Social Sciences School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Haematology School / Department = Faculty of Engineering: School of Electrical and Electronic Engineering School / Department = Faculty of Science: School of Biosciences: Agriculture and Horticulture School / Department = Faculty of Science: School of Chemistry: Department of Inorganic Chemistry School / Department = Faculty of Arts: School of American and Canadian Studies School / Department = Faculty of Science: School of Mathematical Sciences: Mathematical Physics School / Department = Faculty of Science: School of Physics and Astronomy School / Department = Faculty of Science: School of Mathematical Sciences: Statistics School / Department = Faculty of Medicine and Health Sciences: School of Medical and Surgical Sciences: Stroke Medicine School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences: Public Health Sciences School / Department = Faculty of Arts: School of Humanities: Department of Music School / Department = Faculty of Science: School of Biosciences: Plant Science School / Department = Faculty of Arts: School of Humanities School / Department = Faculty of Science: School of Mathematical Sciences: Pure Mathematics School / Department = Faculty of Science School / Department = Faculty of Medicine and Health Sciences: School of Human Development: Child Health School / Department = Faculty of Engineering: School of Civil Engineering School / Department = Faculty of Arts School / Department = Faculty of Science: School of Mathematical Sciences School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Clinical Oncology School / Department = Faculty of Medicine and Health Sciences: School of Medical and Surgical Sciences: Orthopaedic and Accident Surgery School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences: Psychiatry School / Department = Faculty of Law and Social Sciences: School of Geography School / Department = Faculty of Medicine and Health Sciences: School of Community Health Sciences: Rehabilitation and Ageing School / Department = Faculty of Medicine and Health Sciences School / Department = Faculty of Science: School of Biosciences School / Department = Faculty of Medicine and Health Sciences: School of Clinical Laboratory Sciences: Ophthamology and Visual Sciences School / Department = Faculty of Law and Social Sciences: School of Law School / Department = Faculty of Medicine and Health Sciences: School of Medical and Surgical Sciences: Surgery School / Department = Faculty of Medicine and Health Sciences: School of Medical and Surgical Sciences School / Department = Faculty of Arts: School of Humanities: Department of Theology 569 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo75.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo75.xml
new file mode 100644
index 0000000..1205982
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo75.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat Autònoma de Barcelona: Tesis Doctorals en Xarxa (TDX) Univ. Autònoma de Barcelona: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES 2.100031 41.504336 1 http://www.tdx.cesca.es/ Universitat Autònoma de Barcelona tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UAB/NDLTD-OAI/oai.pl oai_dc 2065 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo76.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo76.xml
new file mode 100644
index 0000000..a1b4018
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo76.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat de Lleida: Tesis Doctorals en Xarxa (TDX) Univ. of Lleida: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES 0.619674 41.614199 1 http://www.tdx.cesca.es/ Universitat de Lleida tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UdL/NDLTD-OAI/oai.pl oai_dc 160 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo77.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo77.xml
new file mode 100644
index 0000000..517ee6d
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo77.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software Naturalis Digital Academic Repository Naturalis Digital Academic Repository http://www.repository.naturalis.nl/n/naturalis/graphics/header-top.jpg NL 4.473802 52.164194 1 http://www.repository.naturalis.nl/cgi/b/bib/bib-idx?c=naturalis;cc=naturalis;lang=en Naturalis National Natural History Museum Foundation dpcmedewerkers-uba@uva.nl OAI http://dare.uva.nl/cgi/arno/oai/naturalis oai_dc 1036 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo78.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo78.xml
new file mode 100644
index 0000000..27e21a8
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo78.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software Webbased Archive of RIVM Publications Webbased Archive of RIVM Publications http://rivm.openrepository.com/rivm/image/header.gif NL 5.188613 52.118133 1 http://rivm.openrepository.com/rivm/ National Institute for Public Health and the Environment wichor.bramer@rivm.nl OAI http://rivm.openrepository.com/rivm-oai/request oai_dc 2201 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo79.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo79.xml
new file mode 100644
index 0000000..1186f60
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo79.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace at Erasmus Erasmus Univ. Rotterdam: Digital Repository https://ep.eur.nl/image/eur_logo.png NL 4.4783 51.922 1 https://ep.eur.nl/ ruigrokvanderwerven@ubib.eur.nl OAI http://ep.eur.nl/oai/request eur_qdc dare_qdc dare_data nereus_qdc dare_checksum dare_metadata dare_dc oai_dc Articles (EMC) Articles (ESE) Articles (Jan Tinbergen) Articles Philosophy Articles (published) (FHKW History) Books (EMC) Books (ESE) Books (FHKW Arts) Books (FHKW History) Books (Jan Tinbergen) Books Philosophy Center for Informatics and Law Centre for Local Democracy Centre for Public Management Commercial and Entrepreneurial Law Database of Happiness Datasets (ESE) Department of Informatics Department of Medical Psychology and Psychotherapy: Reports Dissertations DRIFT Dissertations (ESE) Dissertations ESM Dissertations (FHKW Arts) Dissertations (FHKW History) Dissertations in Management 1984-1999 Dissertations Philosophy Dissertations Psychology Dissertations (Public Administration) Dissertations (School of Law) Dissertations Sociology Dissertations (UL) DRIFT Econometric Institute Econometric Institute: Annual Reports Economists Online Erasmus Center Law and Society Erasmus MC Annual Reports Erasmus Research Institute of Management (ERIM) : Annual Reports Erasmus University Rotterdam: Annual Reports ERIM Article Series (EAS) ERIM Electronic Books ERIM Inaugural Lectures Research in Management Series ERIM Ph.D. Series Research in Management ERIM Report Series Research in Management ERIM Seminars and Workshops ESM EUR Medical Dissertations European Law Farewell Lectures (EMC) Farewell Lectures (ESE) Farewell Lectures (FHKW) Farewell Lectures (School of Law) Filosofiedag 2005 Handbook of Cultural Economics Inaugural Lectures: Arts (FHKW) Inaugural Lectures (DRIFT) Inaugural Lectures (EMC) Inaugural Lectures (ESE) Inaugural Lectures (FHKW) Inaugural Lectures (Psychology) Inaugural Lectures (Public Administration) Inaugural Lectures (School of Law) Inaugural Lectures (Sociology) Institute of Medical Technology Assessment (iMTA) Keur der Wetenschap (Cream of Science) NIG Annual Work Conference 2004 Rotterdam NIG Annual Work Conference 2005 Nijmegen Other publications: FHKW Papers (FHKW History) Papers (published): Arts (FHKW) Papers (unpublished): Arts (FHKW) PH D Series Safety and Security in Society Private Law Psychology Publications by R.A. de Mooij (Tinbergen Institute) Public Governance Reports: Arts (FHKW) Reports: BMG Reports Safety and Security in Society Research Centre for Economic Policy (OCFEB) Research Group Complex Decision-making and Management of Networks Research Papers Philosophy Rotterdam Institute of Law and Economics SEOR SEOR (ESE) Sociology Staphylococcus Aureus: Resources The European Metropolis 1920-2000 The New Educational Benefits of ICT in Higher Education Tinbergen Institute University Library: Annual Reports null 6759 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo8.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo8.xml
new file mode 100644
index 0000000..5edeb3e
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo8.xml
@@ -0,0 +1,2 @@
+
+DSpace 0 0 Arias Montano: Repositorio Institucional de la Universidad de Huelva Arias Montano: Huelva University Institutional Repository http://validator.driver.research-infrastructures.eu/validatorWeb/getRepositoryImage.do?&repositoryId=10-00acf49a-2759-4426-9e58-57988fdd217e_UGVuZGluZ1JlcG9zaXRvcnlSZXNvdXJjZXMvUmVwb3NpdG9yeVNlcnZpY2VSZXNvdXJjZVR5cGU= ES -6.9432132 37.2590376 1.0 http://rabida.uhu.es/dspace/ http://www.uhu.es/ soler@uhu.es OAI http://rabida.uhu.es/dspace-oai/request oai_dc All sets 59 0.0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo80.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo80.xml
new file mode 100644
index 0000000..c50b987
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo80.xml
@@ -0,0 +1,2 @@
+
+0 0 DIVA Publikasjoner fra Norges teknisk-naturvitenskapelige universitet Publications from Norwegian University of Science and Technology http://www.ntnu.no//ntnu_images/logoicon.ico NO 10.402265 63.419455 1 http://www.diva-portal.org/ntnu/index.xsql?lang=en Norwegian University of Science and Technology diva-support@ub.uu.se OAI http://www.diva-portal.org/oai/ntnu/OAI oai_dc 1839 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo81.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo81.xml
new file mode 100644
index 0000000..4bd495a
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo81.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI Universitat Pompeu Fabra: Tesis Doctorals en Xarxa (TDX) Univ. Pompeu Fabra: Theses and Dissertations Online (TDX) http://www.tesisenxarxa.net/images/tdx/titol_transp.gif ES 2.179152 41.378995 1 http://www.tdx.cesca.es/ Universitat Pompeu Fabra tdx@cesca.es OAI http://www.tdx.cesca.es/TDX_UPF/NDLTD-OAI/oai.pl oai_dc 203 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo82.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo82.xml
new file mode 100644
index 0000000..375e167
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo82.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Glasgow ePrints Service Univ. of Glasgow: ePrints Service http://www.lib.gla.ac.uk/g/crest.gif UK -4.2425 55.857 0 http://eprints.gla.ac.uk/ mailto:eprints@lib.gla.ac.uk OAI http://eprints.gla.ac.uk/perl/oai2 oai_dc dp Status = FALSE Status = TRUE Subject = D History General and Old World: DA Great Britain: DAW Central Europe Subject = Q Science: QP Physiology Subject = R Medicine: RC Internal medicine: RC0254 Neoplasms. Tumors. Oncology (including Cancer) Subject = Q Science: QR Microbiology Subject = M Music and Books on Music: MT Musical instruction and study Subject = J Political Science: JA Political science (General) Subject = R Medicine: R Medicine (General) Subject = N Fine Arts: N Visual arts (General) For photography, see TR Subject = J Political Science: JC Political theory Subject = C Auxiliary Sciences of History: CB History of civilization Subject = G Geography. Anthropology. Recreation: G Geography (General) Subject = C Auxiliary Sciences of History: CC Archaeology Subject = C Auxiliary Sciences of History: CD Diplomatics. Archives. Seals Subject = J Political Science: JF Political institutions (General) Subject = C Auxiliary Sciences of History: CE Technical chronology. Calendar Subject = T Technology: T Technology (General): T201 Patents. Trademarks Subject = D History General and Old World: D History (General): D051 Ancient History Subject = A General Works Subject = J Political Science: JK Political institutions (United States) Subject = C Auxiliary Sciences of History: CJ Numismatics Subject = B Philosophy. Psychology. Religion Subject = J Political Science: JL Political institutions (America except United States) Subject = C Auxiliary Sciences of History Subject = D History General and Old World Subject = Z Bibliography. Library Science. Information Resources: Z719 Libraries (General) Subject = J Political Science: JN Political institutions (Europe) Subject = E History America Subject = F History United States, Canada, Latin America Subject = R Medicine: RC Internal medicine: RC0321 Neuroscience. Biological psychiatry. Neuropsychiatry Subject = G Geography. Anthropology. Recreation Subject = C Auxiliary Sciences of History: CN Inscriptions. Epigraphy. Subject = L Education: LB Theory and practice of education: LB2361 Curriculum Subject = H Social Sciences Subject = B Philosophy. Psychology. Religion: BV Practical Theology: BV1460 Religious Education Subject = P Language and Literature: PN Literature (General): PN0080 Criticism Subject = J Political Science Subject = K Law Subject = L Education Subject = J Political Science: JQ Political institutions Asia Subject = R Medicine: RA Public aspects of medicine Subject = M Music and Books on Music Subject = R Medicine: RB Pathology Subject = N Fine Arts: NA Architecture Subject = N Fine Arts Subject = J Political Science: JS Local government Municipal government Subject = C Auxiliary Sciences of History: CR Heraldry Subject = V Naval Science: V Naval Science (General) Subject = R Medicine: RC Internal medicine Subject = N Fine Arts: NB Sculpture Subject = G Geography. Anthropology. Recreation: GA Mathematical geography. Cartography Subject = C Auxiliary Sciences of History: CS Genealogy Subject = R Medicine: RD Surgery Subject = N Fine Arts: NC Drawing Design Illustration Subject = G Geography. Anthropology. Recreation: GB Physical geography Subject = C Auxiliary Sciences of History: CT Biography Subject = R Medicine: RE Ophthalmology Subject = N Fine Arts: ND Painting Subject = K Law: K Law (General) Subject = J Political Science: JV Colonies and colonization. Emigration and immigration. International migration Subject = G Geography. Anthropology. Recreation: GC Oceanography Subject = R Medicine: RF Otorhinolaryngology Subject = N Fine Arts: NE Print media Subject = D History General and Old World: D History (General) Subject = R Medicine: RG Gynecology and obstetrics Subject = J Political Science: JX International law Subject = G Geography. Anthropology. Recreation: GE Environmental Sciences Subject = G Geography. Anthropology. Recreation: GF Human ecology. Anthropogeography Subject = D History General and Old World: D History (General): D731 World War II Subject = J Political Science: JN Political institutions (Europe): JN1187 Scotland Subject = P Language and Literature Subject = Q Science Subject = J Political Science: JZ International relations Subject = R Medicine: RJ Pediatrics Subject = R Medicine Subject = S Agriculture Subject = R Medicine: RK Dentistry Subject = T Technology Subject = R Medicine: RL Dermatology Subject = U Military Science Subject = N Fine Arts: NK Decorative arts Applied arts Decoration and ornament Subject = V Naval Science Subject = R Medicine: RM Therapeutics. Pharmacology Subject = R Medicine: RA Public aspects of medicine: RA1001 Forensic Medicine. Medical jurisprudence. Legal medicine Subject = G Geography. Anthropology. Recreation: GN Anthropology Subject = Z Bibliography. Library Science. Information Resources Subject = S Agriculture: SF Animal culture: SF600 Veterinary Medicine Subject = R Medicine: RS Pharmacy and materia medica Subject = R Medicine: RT Nursing Subject = G Geography. Anthropology. Recreation: GR Folklore Subject = S Agriculture: S Agriculture (General) Subject = R Medicine: RV Botanic, Thomsonian, and eclectic medicine Subject = G Geography. Anthropology. Recreation: GT Manners and customs Subject = D History General and Old World: DA Great Britain Subject = D History General and Old World: DB Austria Subject = R Medicine: RX Homeopathy Subject = K Law: KD England and Wales Subject = H Social Sciences: H Social Sciences (General) Subject = G Geography. Anthropology. Recreation: GV Recreation Leisure Subject = D History General and Old World: DC France Subject = N Fine Arts: NX Arts in general Subject = D History General and Old World: DD Germany Subject = Q Science: QH Natural history: QH301 Biology Subject = K Law: KF United States Federal Law Subject = F History United States, Canada, Latin America: F1201 Latin America (General) Subject = D History General and Old World: DE The Mediterranean Region. The Greco-Roman World Subject = D History General and Old World: DF Greece Subject = D History General and Old World: DG Italy Subject = P Language and Literature: PN Literature (General): PN2000 Dramatic representation. The Theater Subject = D History General and Old World: DH Netherlands (The Low Countries) Subject = R Medicine: RZ Other systems of medicine Subject = R Medicine: RJ Pediatrics: RJ101 Child Health. Child health services Subject = H Social Sciences: HD Industries. Land use. Labor: HD28 Management. Industrial Management Subject = D History General and Old World: DJ Netherlands (Holland) Subject = V Naval Science: VM Naval architecture. Shipbuilding. Marine engineering Subject = D History General and Old World: DK Russia. Soviet Union. Former Soviet Republics Subject = D History General and Old World: DL Northern Europe. Scandinavia Subject = Q Science: QH Natural history: QH426 Genetics Subject = D History General and Old World: D History (General): D880 Developing Countries Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources Subject = D History General and Old World: DP Spain Subject = L Education: LC Special aspects of education: LC5201 Education extension. Adult education. Continuing education Subject = S Agriculture: SB Plant culture Subject = R Medicine: RA Public aspects of medicine: RA0421 Public health. Hygiene. Preventive Medicine Subject = D History General and Old World: DR Balkan Peninsula Subject = H Social Sciences: HA Statistics Subject = D History General and Old World: DS Asia Subject = S Agriculture: SD Forestry Subject = P Language and Literature: P Philology. Linguistics Subject = H Social Sciences: HB Economic Theory Subject = D History General and Old World: DT Africa Subject = L Education: L Education (General) Subject = H Social Sciences: HC Economic History and Conditions Subject = D History General and Old World: DU Oceania (South Seas) Subject = S Agriculture: SF Animal culture Subject = H Social Sciences: HD Industries. Land use. Labor Subject = A General Works: AC Collections. Series. Collected works Subject = H Social Sciences: HE Transportation and Communications Subject = S Agriculture: SH Aquaculture. Fisheries. Angling Subject = H Social Sciences: HF Commerce Subject = H Social Sciences: HG Finance Subject = A General Works: AI Indexes (General) Subject = D History General and Old World: D History (General): D501 World War I Subject = D History General and Old World: D History (General): D839 Post-war History, 1945 on Subject = K Law: KZ Law of Nations Subject = S Agriculture: SK Hunting sports Subject = Q Science: QR Microbiology: QR180 Immunology Subject = H Social Sciences: HJ Public Finance Subject = H Social Sciences: HM Sociology Subject = A General Works: AM Museums (General). Collectors and collecting (General) Subject = H Social Sciences: HN Social history and conditions. Social problems. Social reform Subject = D History General and Old World: D History (General): D901 Europe (General) Subject = D History General and Old World: DJ Netherlands (Holland): DJK Eastern Europe Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources: ZA4050 Electronic information resources Subject = H Social Sciences: HQ The family. Marriage. Woman Subject = P Language and Literature: PA Classical philology Subject = P Language and Literature: PN Literature (General): PN1990 Broadcasting Subject = P Language and Literature: PB Modern European Languages Subject = L Education: LA History of education Subject = J Political Science: JN Political institutions (Europe): JN101 Great Britain Subject = H Social Sciences: HS Societies secret benevolent etc Subject = T Technology: T Technology (General) Subject = P Language and Literature: PC Romance languages Subject = L Education: LB Theory and practice of education Subject = H Social Sciences: HT Communities. Classes. Races Subject = A General Works: AS Academies and learned societies (General) Subject = P Language and Literature: PD Germanic languages Subject = L Education: LC Special aspects of education Subject = P Language and Literature: PN Literature (General): PN1993 Motion Pictures Subject = P Language and Literature: PE English Subject = L Education: LD Individual institutions (United States) Subject = H Social Sciences: HV Social pathology. Social and public welfare Subject = P Language and Literature: PF West Germanic Subject = L Education: LE Individual institutions (America except United States) Subject = B Philosophy. Psychology. Religion: B Philosophy (General) Subject = P Language and Literature: PG Slavic, Baltic, Albanian languages and literature Subject = L Education: LF Individual institutions (Europe) Subject = H Social Sciences: HX Socialism. Communism. Anarchism Subject = P Language and Literature: PH Finno-Ugrian, Basque languages and literatures Subject = L Education: LG Individual institutions (Asia. Africa) Subject = P Language and Literature: PI Oriental languages and literatures Subject = P Language and Literature: PJ Semitic Subject = A General Works: AZ History of Scholarship The Humanities Subject = P Language and Literature: PK Indo-Iranian Subject = P Language and Literature: PL Languages and literatures of Eastern Asia, Africa, Oceania Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources: ZA4450 Databases Subject = P Language and Literature: PN Literature (General): PN0441 Literary History Subject = P Language and Literature: PM Hyperborean, Indian, and Artificial languages Subject = P Language and Literature: PN Literature (General) Subject = L Education: LB Theory and practice of education: LB1501 Primary Education Subject = H Social Sciences: HF Commerce: HF5601 Accounting Subject = D History General and Old World: D History (General): D204 Modern History Subject = P Language and Literature: PB Modern European Languages: PB1501 Gaelic (Scottish Gaelic, Erse) Subject = R Medicine: RC Internal medicine: RC1200 Sports Medicine Subject = P Language and Literature: PQ Romance literatures Subject = P Language and Literature: PR English literature Subject = T Technology: TA Engineering (General). Civil engineering (General) Subject = P Language and Literature: PS American literature Subject = P Language and Literature: PT Germanic literature Subject = T Technology: TC Hydraulic engineering. Ocean engineering Subject = L Education: LT Textbooks Subject = T Technology: TD Environmental technology. Sanitary engineering Subject = Q Science: Q Science (General) Subject = T Technology: TE Highway engineering. Roads and pavements Subject = M Music and Books on Music: M Music Subject = E History America: E151 United States (General) Subject = Z Bibliography. Library Science. Information Resources: Z665 Library Science. Information Science Subject = T Technology: TF Railroad engineering and operation Subject = B Philosophy. Psychology. Religion: BC Logic Subject = T Technology: TG Bridge engineering Subject = B Philosophy. Psychology. Religion: BD Speculative Philosophy Subject = T Technology: TH Building construction Subject = B Philosophy. Psychology. Religion: BF Psychology Subject = B Philosophy. Psychology. Religion: BH Aesthetics Subject = D History General and Old World: D History (General): D890 Eastern Hemisphere Subject = P Language and Literature: PZ Childrens literature Subject = L Education: LB Theory and practice of education: LB2300 Higher Education Subject = F History United States, Canada, Latin America: F1001 Canada (General) Subject = T Technology: TJ Mechanical engineering and machinery Subject = T Technology: TK Electrical engineering. Electronics Nuclear engineering Subject = D History General and Old World: D History (General): D111 Medieval History Subject = Z Bibliography. Library Science. Information Resources: Z004 Books. Writing. Paleography Subject = T Technology: TL Motor vehicles. Aeronautics. Astronautics Subject = B Philosophy. Psychology. Religion: BJ Ethics Subject = T Technology: TN Mining engineering. Metallurgy Subject = B Philosophy. Psychology. Religion: BL Religion Subject = E History America: E11 America (General) Subject = B Philosophy. Psychology. Religion: BM Judaism Subject = T Technology: TP Chemical technology Subject = F History United States, Canada, Latin America: F001 United States local history Subject = T Technology: TR Photography Subject = T Technology: TS Manufactures Subject = K Law: KD England and Wales: KDC Scotland Subject = B Philosophy. Psychology. Religion: BP Islam. Bahaism. Theosophy, etc Subject = T Technology: TT Handicrafts Arts and crafts Subject = Q Science: QA Mathematics Subject = B Philosophy. Psychology. Religion: BQ Buddhism Subject = Q Science: QB Astronomy Subject = B Philosophy. Psychology. Religion: BR Christianity Subject = U Military Science: U Military Science (General) Subject = Q Science: QC Physics Subject = B Philosophy. Psychology. Religion: BS The Bible Subject = Q Science: QD Chemistry Subject = H Social Sciences: HD Industries. Land use. Labor: HD61 Risk Management Subject = B Philosophy. Psychology. Religion: BT Doctrinal Theology Subject = T Technology: TX Home economics Subject = Q Science: QH Natural history: QH345 Biochemistry Subject = Q Science: QE Geology Subject = J Political Science: J General legislative and executive papers Subject = C Auxiliary Sciences of History: C Auxiliary sciences of history (General) Subject = B Philosophy. Psychology. Religion: BV Practical Theology Subject = Q Science: QH Natural history Subject = B Philosophy. Psychology. Religion: BX Christian Denominations Subject = Q Science: QR Microbiology: QR355 Virology Subject = Q Science: QK Botany Subject = C Auxiliary Sciences of History: CD Diplomatics. Archives. Seals: CD921 Archives Subject = Q Science: QL Zoology Subject = Q Science: QM Human anatomy Subject = Q Science: QA Mathematics: QA75 Electronic computers. Computer science Subject = M Music and Books on Music: ML Literature of music Subject = Q Science: QA Mathematics: QA76 Computer software Subject = L Education: LB Theory and practice of education: LB1603 Secondary Education. High schools 4095 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo83.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo83.xml
new file mode 100644
index 0000000..7597dd5
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo83.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung University of Ulm, GERMANY, VTS Publication Service Univ. Ulm: Volltextserver http://vts.uni-ulm.de/standards/logo_vts.jpg DE 10 48.4 1 http://vts.uni-ulm.de/index.html vts@kiz.uni-ulm.de OAI http://vts.uni-ulm.de/oai/oai.asp oai_dc epicur xmetadissplus DDC classified objects Computer science, information & general works Data processing & computer science Bibliography Library & information sciences General encyclopedic works General serial publications Philosophy Psychology Social sciences General statistics Political science Economics Law Public administration & military science Education Natural sciences & mathematics Mathematics Physics Chemistry & allied sciences Life sciences Botanical sciences Technology (Applied sciences) Medicine & health Engineering & allied operations Objects having a formal document type Audio files Binary data, (executable) programs Data Images Multimedia files Notes Text Video files Objects having a formal publication type Journal Articles Conference Proceedings Dissertations and Professional Dissertations Lectures Diploma Theses Books, Monographs Music News Papers Plays Programs / Software Reports Standards Objects having a formal state Draft Not reviewed Reviewed 1336 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo84.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo84.xml
new file mode 100644
index 0000000..c4961a8
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo84.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints Doktori disszertációk Ph.D. dissertations http://phd.lib.uni-corvinus.hu/images/logo.jpg HU 19.0523 47.4974 1 http://phd.lib.uni-corvinus.hu Corvinus University Budapest webmester-lib@uni-corvinus.hu OAI http://phd.lib.uni-corvinus.hu/perl/oai2 oai_dc 298 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo85.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo85.xml
new file mode 100644
index 0000000..c33e564
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo85.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace Debreceni Egyetem elektronikus Archivumanak (DEA) Debreceni Egyetem elektronikus Archivumanak (DEA) http://ganymedes.lib.unideb.hu:8080/dea/image/fejlec_eleje.png HU 21.67 47.58 1 http://dspace.lib.unideb.hu:8080/dspace/ University of Debrecen xxx OAI http://ganymedes.lib.unideb.hu:8080/oai/request oai_dc 32035 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo86.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo86.xml
new file mode 100644
index 0000000..ede88ae
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo86.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace E-Archivo E-Archivo http://e-archivo.uc3m.es/dspace/image/logouc3m.gif ES -3.76640 40.333578 1 http://e-archivo.uc3m.es/dspace/ Univ. Carlos III de Madrid e-archivo@listserv.uc3m.es OAI http://servmadrono.cs.urjc.es:8010/arcFuturo/servlet/OAIDPuc3m oai_dc 2538 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo87.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo87.xml
new file mode 100644
index 0000000..fb64e48
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo87.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints The Univ. of Birmingham: The ePrints Archive The Univ. of Birmingham: ePrints Archive http://www.eprints.bham.ac.uk/globalssi/images/university-crest-subpage.gif UK -1.9167 52.4667 0 http://eprints.bham.ac.uk/ mailto:eprints-admin@redhat3.bham.ac.uk OAI http://eprints.bham.ac.uk/cgi/oai2 oai_dc Status = Submitted Status = Published Status = In Press Status = Unpublished Subject = D History General and Old World: DA Great Britain: DAW Central Europe Subject = Q Science: QP Physiology Subject = R Medicine: RC Internal medicine: RC0254 Neoplasms. Tumors. Oncology (including Cancer) Subject = Q Science: QR Microbiology Subject = M Music and Books on Music: MT Musical instruction and study Subject = J Political Science: JA Political science (General) Subject = R Medicine: R Medicine (General) Subject = N Fine Arts: N Visual arts (General) For photography, see TR Subject = J Political Science: JC Political theory Subject = C Auxiliary Sciences of History: CB History of civilization Subject = G Geography. Anthropology. Recreation: G Geography (General) Subject = C Auxiliary Sciences of History: CC Archaeology Subject = C Auxiliary Sciences of History: CD Diplomatics. Archives. Seals Subject = J Political Science: JF Political institutions (General) Subject = C Auxiliary Sciences of History: CE Technical chronology. Calendar Subject = T Technology: T Technology (General): T201 Patents. Trademarks Subject = D History General and Old World: D History (General): D051 Ancient History Subject = A General Works Subject = J Political Science: JK Political institutions (United States) Subject = C Auxiliary Sciences of History: CJ Numismatics Subject = B Philosophy. Psychology. Religion Subject = J Political Science: JL Political institutions (America except United States) Subject = C Auxiliary Sciences of History Subject = D History General and Old World Subject = Z Bibliography. Library Science. Information Resources: Z719 Libraries (General) Subject = J Political Science: JN Political institutions (Europe) Subject = E History America Subject = F History United States, Canada, Latin America Subject = R Medicine: RC Internal medicine: RC0321 Neuroscience. Biological psychiatry. Neuropsychiatry Subject = G Geography. Anthropology. Recreation Subject = C Auxiliary Sciences of History: CN Inscriptions. Epigraphy. Subject = L Education: LB Theory and practice of education: LB2361 Curriculum Subject = H Social Sciences Subject = B Philosophy. Psychology. Religion: BV Practical Theology: BV1460 Religious Education Subject = P Language and Literature: PN Literature (General): PN0080 Criticism Subject = J Political Science Subject = K Law Subject = L Education Subject = J Political Science: JQ Political institutions Asia Subject = R Medicine: RA Public aspects of medicine Subject = M Music and Books on Music Subject = R Medicine: RB Pathology Subject = N Fine Arts: NA Architecture Subject = N Fine Arts Subject = J Political Science: JS Local government Municipal government Subject = C Auxiliary Sciences of History: CR Heraldry Subject = V Naval Science: V Naval Science (General) Subject = R Medicine: RC Internal medicine Subject = N Fine Arts: NB Sculpture Subject = G Geography. Anthropology. Recreation: GA Mathematical geography. Cartography Subject = C Auxiliary Sciences of History: CS Genealogy Subject = R Medicine: RD Surgery Subject = N Fine Arts: NC Drawing Design Illustration Subject = G Geography. Anthropology. Recreation: GB Physical geography Subject = C Auxiliary Sciences of History: CT Biography Subject = R Medicine: RE Ophthalmology Subject = N Fine Arts: ND Painting Subject = K Law: K Law (General) Subject = J Political Science: JV Colonies and colonization. Emigration and immigration. International migration Subject = G Geography. Anthropology. Recreation: GC Oceanography Subject = R Medicine: RF Otorhinolaryngology Subject = N Fine Arts: NE Print media Subject = D History General and Old World: D History (General) Subject = R Medicine: RG Gynecology and obstetrics Subject = J Political Science: JX International law Subject = G Geography. Anthropology. Recreation: GE Environmental Sciences Subject = G Geography. Anthropology. Recreation: GF Human ecology. Anthropogeography Subject = D History General and Old World: D History (General): D731 World War II Subject = J Political Science: JN Political institutions (Europe): JN1187 Scotland Subject = P Language and Literature Subject = Q Science Subject = J Political Science: JZ International relations Subject = R Medicine: RJ Pediatrics Subject = R Medicine Subject = S Agriculture Subject = R Medicine: RK Dentistry Subject = T Technology Subject = R Medicine: RL Dermatology Subject = U Military Science Subject = N Fine Arts: NK Decorative arts Applied arts Decoration and ornament Subject = V Naval Science Subject = R Medicine: RM Therapeutics. Pharmacology Subject = R Medicine: RA Public aspects of medicine: RA1001 Forensic Medicine. Medical jurisprudence. Legal medicine Subject = G Geography. Anthropology. Recreation: GN Anthropology Subject = Z Bibliography. Library Science. Information Resources Subject = R Medicine: RS Pharmacy and materia medica Subject = R Medicine: RT Nursing Subject = G Geography. Anthropology. Recreation: GR Folklore Subject = S Agriculture: S Agriculture (General) Subject = R Medicine: RV Botanic, Thomsonian, and eclectic medicine Subject = G Geography. Anthropology. Recreation: GT Manners and customs Subject = D History General and Old World: DA Great Britain Subject = D History General and Old World: DB Austria Subject = R Medicine: RX Homeopathy Subject = K Law: KD England and Wales Subject = H Social Sciences: H Social Sciences (General) Subject = G Geography. Anthropology. Recreation: GV Recreation Leisure Subject = D History General and Old World: DC France Subject = N Fine Arts: NX Arts in general Subject = D History General and Old World: DD Germany Subject = Q Science: QH Natural history: QH301 Biology Subject = K Law: KF United States Federal Law Subject = F History United States, Canada, Latin America: F1201 Latin America (General) Subject = D History General and Old World: DE The Mediterranean Region. The Greco-Roman World Subject = D History General and Old World: DF Greece Subject = D History General and Old World: DG Italy Subject = P Language and Literature: PN Literature (General): PN2000 Dramatic representation. The Theater Subject = D History General and Old World: DH Netherlands (The Low Countries) Subject = R Medicine: RZ Other systems of medicine Subject = R Medicine: RJ Pediatrics: RJ101 Child Health. Child health services Subject = H Social Sciences: HD Industries. Land use. Labor: HD28 Management. Industrial Management Subject = D History General and Old World: DJ Netherlands (Holland) Subject = V Naval Science: VM Naval architecture. Shipbuilding. Marine engineering Subject = D History General and Old World: DK Russia. Soviet Union. Former Soviet Republics Subject = D History General and Old World: DL Northern Europe. Scandinavia Subject = Q Science: QH Natural history: QH426 Genetics Subject = D History General and Old World: D History (General): D880 Developing Countries Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources Subject = D History General and Old World: DP Spain Subject = L Education: LC Special aspects of education: LC5201 Education extension. Adult education. Continuing education Subject = S Agriculture: SB Plant culture Subject = R Medicine: RA Public aspects of medicine: RA0421 Public health. Hygiene. Preventive Medicine Subject = D History General and Old World: DR Balkan Peninsula Subject = H Social Sciences: HA Statistics Subject = D History General and Old World: DS Asia Subject = S Agriculture: SD Forestry Subject = P Language and Literature: P Philology. Linguistics Subject = H Social Sciences: HB Economic Theory Subject = D History General and Old World: DT Africa Subject = L Education: L Education (General) Subject = H Social Sciences: HC Economic History and Conditions Subject = D History General and Old World: DU Oceania (South Seas) Subject = S Agriculture: SF Animal culture Subject = H Social Sciences: HD Industries. Land use. Labor Subject = A General Works: AC Collections. Series. Collected works Subject = H Social Sciences: HE Transportation and Communications Subject = S Agriculture: SH Aquaculture. Fisheries. Angling Subject = H Social Sciences: HF Commerce Subject = H Social Sciences: HG Finance Subject = A General Works: AI Indexes (General) Subject = D History General and Old World: D History (General): D501 World War I Subject = D History General and Old World: D History (General): D839 Post-war History, 1945 on Subject = K Law: KZ Law of Nations Subject = S Agriculture: SK Hunting sports Subject = Q Science: QR Microbiology: QR180 Immunology Subject = H Social Sciences: HJ Public Finance Subject = H Social Sciences: HM Sociology Subject = A General Works: AM Museums (General). Collectors and collecting (General) Subject = H Social Sciences: HN Social history and conditions. Social problems. Social reform Subject = D History General and Old World: D History (General): D901 Europe (General) Subject = D History General and Old World: DJ Netherlands (Holland): DJK Eastern Europe Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources: ZA4050 Electronic information resources Subject = H Social Sciences: HQ The family. Marriage. Woman Subject = P Language and Literature: PA Classical philology Subject = P Language and Literature: PN Literature (General): PN1990 Broadcasting Subject = P Language and Literature: PB Modern European Languages Subject = L Education: LA History of education Subject = J Political Science: JN Political institutions (Europe): JN101 Great Britain Subject = H Social Sciences: HS Societies secret benevolent etc Subject = T Technology: T Technology (General) Subject = P Language and Literature: PC Romance languages Subject = L Education: LB Theory and practice of education Subject = H Social Sciences: HT Communities. Classes. Races Subject = A General Works: AS Academies and learned societies (General) Subject = P Language and Literature: PD Germanic languages Subject = L Education: LC Special aspects of education Subject = P Language and Literature: PN Literature (General): PN1993 Motion Pictures Subject = P Language and Literature: PE English Subject = L Education: LD Individual institutions (United States) Subject = H Social Sciences: HV Social pathology. Social and public welfare Subject = P Language and Literature: PF West Germanic Subject = L Education: LE Individual institutions (America except United States) Subject = B Philosophy. Psychology. Religion: B Philosophy (General) Subject = P Language and Literature: PG Slavic, Baltic, Albanian languages and literature Subject = L Education: LF Individual institutions (Europe) Subject = H Social Sciences: HX Socialism. Communism. Anarchism Subject = P Language and Literature: PH Finno-Ugrian, Basque languages and literatures Subject = L Education: LG Individual institutions (Asia. Africa) Subject = P Language and Literature: PI Oriental languages and literatures Subject = P Language and Literature: PJ Semitic Subject = A General Works: AZ History of Scholarship The Humanities Subject = P Language and Literature: PK Indo-Iranian Subject = P Language and Literature: PL Languages and literatures of Eastern Asia, Africa, Oceania Subject = Z Bibliography. Library Science. Information Resources: ZA Information resources: ZA4450 Databases Subject = P Language and Literature: PN Literature (General): PN0441 Literary History Subject = P Language and Literature: PM Hyperborean, Indian, and Artificial languages Subject = P Language and Literature: PN Literature (General) Subject = L Education: LB Theory and practice of education: LB1501 Primary Education Subject = H Social Sciences: HF Commerce: HF5601 Accounting Subject = D History General and Old World: D History (General): D204 Modern History Subject = P Language and Literature: PB Modern European Languages: PB1501 Gaelic (Scottish Gaelic, Erse) Subject = R Medicine: RC Internal medicine: RC1200 Sports Medicine Subject = P Language and Literature: PQ Romance literatures Subject = P Language and Literature: PR English literature Subject = T Technology: TA Engineering (General). Civil engineering (General) Subject = P Language and Literature: PS American literature Subject = P Language and Literature: PT Germanic literature Subject = T Technology: TC Hydraulic engineering. Ocean engineering Subject = L Education: LT Textbooks Subject = T Technology: TD Environmental technology. Sanitary engineering Subject = Q Science: Q Science (General) Subject = T Technology: TE Highway engineering. Roads and pavements Subject = M Music and Books on Music: M Music Subject = E History America: E151 United States (General) Subject = Z Bibliography. Library Science. Information Resources: Z665 Library Science. Information Science Subject = T Technology: TF Railroad engineering and operation Subject = B Philosophy. Psychology. Religion: BC Logic Subject = T Technology: TG Bridge engineering Subject = B Philosophy. Psychology. Religion: BD Speculative Philosophy Subject = T Technology: TH Building construction Subject = B Philosophy. Psychology. Religion: BF Psychology Subject = B Philosophy. Psychology. Religion: BH Aesthetics Subject = D History General and Old World: D History (General): D890 Eastern Hemisphere Subject = P Language and Literature: PZ Childrens literature Subject = L Education: LB Theory and practice of education: LB2300 Higher Education Subject = F History United States, Canada, Latin America: F1001 Canada (General) Subject = T Technology: TJ Mechanical engineering and machinery Subject = T Technology: TK Electrical engineering. Electronics Nuclear engineering Subject = D History General and Old World: D History (General): D111 Medieval History Subject = Z Bibliography. Library Science. Information Resources: Z004 Books. Writing. Paleography Subject = T Technology: TL Motor vehicles. Aeronautics. Astronautics Subject = B Philosophy. Psychology. Religion: BJ Ethics Subject = T Technology: TN Mining engineering. Metallurgy Subject = B Philosophy. Psychology. Religion: BL Religion Subject = E History America: E11 America (General) Subject = B Philosophy. Psychology. Religion: BM Judaism Subject = T Technology: TP Chemical technology Subject = F History United States, Canada, Latin America: F001 United States local history Subject = T Technology: TR Photography Subject = T Technology: TS Manufactures Subject = K Law: KD England and Wales: KDC Scotland Subject = B Philosophy. Psychology. Religion: BP Islam. Bahaism. Theosophy, etc Subject = T Technology: TT Handicrafts Arts and crafts Subject = Q Science: QA Mathematics Subject = B Philosophy. Psychology. Religion: BQ Buddhism Subject = Q Science: QB Astronomy Subject = B Philosophy. Psychology. Religion: BR Christianity Subject = U Military Science: U Military Science (General) Subject = Q Science: QC Physics Subject = B Philosophy. Psychology. Religion: BS The Bible Subject = Q Science: QD Chemistry Subject = H Social Sciences: HD Industries. Land use. Labor: HD61 Risk Management Subject = B Philosophy. Psychology. Religion: BT Doctrinal Theology Subject = T Technology: TX Home economics Subject = Q Science: QE Geology Subject = J Political Science: J General legislative and executive papers Subject = C Auxiliary Sciences of History: C Auxiliary sciences of history (General) Subject = B Philosophy. Psychology. Religion: BV Practical Theology Subject = Q Science: QH Natural history Subject = B Philosophy. Psychology. Religion: BX Christian Denominations Subject = Q Science: QR Microbiology: QR355 Virology Subject = Q Science: QK Botany Subject = C Auxiliary Sciences of History: CD Diplomatics. Archives. Seals: CD921 Archives Subject = Q Science: QL Zoology Subject = Q Science: QM Human anatomy Subject = Q Science: QA Mathematics: QA75 Electronic computers. Computer science Subject = M Music and Books on Music: ML Literature of music Subject = Q Science: QA Mathematics: QA76 Computer software Subject = L Education: LB Theory and practice of education: LB1603 Secondary Education. High schools 69 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo88.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo88.xml
new file mode 100644
index 0000000..58c50d0
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo88.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints NUI Maynooth ePrints and eTheses Archive NUI Maynooth ePrints and eTheses Archive http://eprints.nuim.ie/images/nuilogo.gif IE -6.506 53.386 0 http://eprints.may.ie/ National University of Ireland s.redmondmaloco@nuim.ie OAI http://eprints.nuim.ie/cgi/oai2 oai_dc 879 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo89.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo89.xml
new file mode 100644
index 0000000..38ad489
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo89.xml
@@ -0,0 +1,2 @@
+
+0 0 VTOAI xerxes xerxes http://theses.lub.lu.se/undergrad/images/xerxes.jpg.sv SE 13.196 55.712 1 http://theses.lub.lu.se/undergrad/ Lund University dissertations@lub.lu.se OAI http://theses.lub.lu.se/oai-service/xerxes/ oai_dc 7741 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo9.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo9.xml
new file mode 100644
index 0000000..e375abb
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo9.xml
@@ -0,0 +1,2 @@
+
+0 0 Opus ArchiMeD - Elektronische Publikationen der Universität Mainz Mainz Univ., ArchiMed http://archimed.uni-mainz.de/opusubm/grafiken/kopf_schriftzug.gif DE 8.27 50.0006 1 http://archimed.uni-mainz.de/opusubm/archimed-home.html mailto:seiler@hbz-nrw.de OAI http://ubm.opus.hbz-nrw.de/phpoai/oai2.php oai_dc epicur Generalities, Science Data processing Computer science Bibliography Library and information sciences General encyclopedic works General serials and their indexes General organization and museology News media, journalism, publishing General collections Manuscripts and rare books Philosophy Paranormal phenomena Psychology Religion Bible Christian theology Other and comparative religions Social sciences General statistics Political science Economics Law Public administration Military science "Social services; association" Education Commerce, communications, transport Customs, etiquette, folklore Language, Linguistics English Germanic Other Germanic languages Romance languages French Italian, Romanian, Rhaeto-Romantic Spanish and Portugese languages Italic Latin Hellenic languages Classical Greek Other languages Natural sciences and mathematics Mathematics Astronomy and allied sciences Physics Chemistry and allied sciences Earth sciences Paleontology Paleozoology Life sciences Botanical sciences Zoological sciences Technology (Applied sciences) Medical sciences Medicine Engineering and allied operations Agriculture Home economics and family living Management and auxiliary services Chemical engineering Manufacturing Buildings The arts Civic and landscape art Architecture Plastic arts Sculpture Drawing and decorative arts Comics, Cartoons Painting and paintings Graphic arts Printmaking and prints Photography and photographs Music Recreational and performing arts Public performances Stage presentations Indoor games and amusements Athletic and outdoor sports and games Literature and rhetoric American literature in English English and Old English literatures Literatures of Germanic languages Other Germanic literatures Literatures of Romance languages Italian, Romanian, Rhaeto-Romanic literatures Spanish and Portuguese literatures Italic literatures Latin Hellenic literatures Classical Greek Literatures of other languages Geography and history Geography and travel Geography and travel Germany Biography, genealogy, insignia History of ancient world General history of Europe General history of Europe Central Europe Germany General history of Asia Far East General history of Africa General history of North America General history of South America General history of other areas Text.Thesis.Doctoral Text.Thesis.Habilitation MastersThesis DiplomaThesis MagisterThesis Msc 1371 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo90.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo90.xml
new file mode 100644
index 0000000..73f603d
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo90.xml
@@ -0,0 +1,2 @@
+
+0 0 PUMA National Research Council Genova - IENI Repository National Research Council Genova - IENI Repository http://www.ieni.cnr.it/images/header1.png IT 8.900492 44.408715 1 http://metabsrv.isti.cnr.it:8080/test_metaopac/servlet/Isis?Conf=/export/home/metaopac/mpisa/ienige_geConf/cnr_ienige-pub-list.sys.file_x_x Istituto per l'Energetica e le Interfasi - CNR Genova giuseppe.romano@isti.cnr.it OAI http://leonardo.isti.cnr.it/oai_cnrpubdriver oai_dc 88 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo91.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo91.xml
new file mode 100644
index 0000000..84926b3
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo91.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Univ. Duesseldorf: Duesseldorfer Dokumenten- und Publikationsserver Heinrich-Heine-University Duesseldorf, Germany, Online Publications http://docserv.uni-duesseldorf.de/d/images/hhu_02.gif DE 6.797 51.190 1 http://docserv.uni-duesseldorf.de/ Universitaet Duesseldorf docserv@ub.uni-duesseldorf.de OAI http://docserv.uni-duesseldorf.de/servlets/OAIDataProvider oai_dc 2325 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo92.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo92.xml
new file mode 100644
index 0000000..484bed3
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo92.xml
@@ -0,0 +1,2 @@
+
+0 0 OPUS SavifaDok Publikationsplattform fuer die Sozialwissenschaften SavifaDok Digital Repository South Asian Studies http://archiv.ub.uni-heidelberg.de/savifadok/Icons/savifadokpublikation.gif DE 8.707999 49.409922 1 http://archiv.ub.uni-heidelberg.de/savifadok/?la=en Universität Heidelberg merkel@sai.uni-heidelberg.de OAI http://archiv.ub.uni-heidelberg.de/savifadok/oai2/oai2.php oai_dc 187 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo93.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo93.xml
new file mode 100644
index 0000000..58ff533
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo93.xml
@@ -0,0 +1,2 @@
+
+0 0 Eprints UCL Eprints Univ. College London: UCL Eprints http://www.ucl.ac.uk/Library/Images/ucl0013.gif UK -0.105 51.517 0 http://eprints.ucl.ac.uk/ mailto:lib-eprints@ucl.ac.uk OAI http://eprints.ucl.ac.uk/perl/oai2 oai_dc dp Type = Thesis Type = Book Type = Book section Type = Patent Type = Conference, workshop or other event Type = Monograph Type = Article Thesis type = Masters Thesis type = Doctoral.PhD Thesis type = Masters.MSc Thesis type = Doctoral.EngD Thesis type = Masters.MA Thesis type = Masters.MPhil Status = In press Status = Submitted Status = Published Status = Unpublished UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Mathematics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Infection: Centre for Paediatric Infectious Diseases and Microbiology UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Institute of Behavioural Neuroscience UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Psychology: Sub-department of Clinical Health Psychology: CORE - Centre for Outcomes Research and Effectiveness UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: UCL Management Studies Centre UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Centre for Economic Learning and Social Evolution (ELSE) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Academic Unit of Audiological Medicine UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Biochemical and Nutritional Sciences: Nutrition Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Oral and Maxillofacial Surgery UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Biochemical Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Cardiorespiratory Sciences: Portex Anasthaesia, Intensive Therapy and Respiratory Medicine Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Population Health: Department of Primary Care and Population Sciences: Centre for Sexual Health and HIV Research UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Anatomy and Developmental Biology: Wellcome Trust Centre for the History of Medicine at UCL: Wellcome Trust Centre for the History of Medicine at UCL UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Institute of Archaeology: Institute of Archaeology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Department of Clinical Neurosciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Computer Science: Vision Imaging and Virtual Environments UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Built Environment: The OMEGA Centre UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Economics: Discussion Paper Series UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Biology: Centre for Ecology and Evolution UCL Departments and Research Centres = UCL Departments and Research Centres UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Department of Medicine UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Laws UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Biochemistry and Endocrinology Research Groups: Proteomics and Enzymology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Eastman Dental Institute UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Academic Centre for Medical Education UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Electronic and Electrical Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: UCL Library Services UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Obstetrics and Gynaecology: Centre for Preimplantation Genetic Diagnosis UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: Department of Surgery UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Infection: Centre for Virology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Population Health: Department of Primary Care and Population Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Molecular Cell Biology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of Greek and Latin UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Infection: Centre for Medical Microbiology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Geomatic Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Intensive Care Medicine and Bloomsbury Institute of Intensive Care UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Neurology: Department of Headache, Brain Injury and Rehabilitation UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Paediatric Dentistry UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Oncology: CR UK and UCL Cancer Trials Centre UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Centre for Mathematics and Physical Sciences in the Life Sciences and Experimental Biology (COMPLEX) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Cardiorespiratory Sciences: Cardiac Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Computer Science: Intelligent Systems UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: UCL Ear Institute: Institute of Laryngology and Otology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Neurology: Department of Neuroinflammation UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of History of Art UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Physics and Astronomy: Atomic, Molecular, Optical and Positron Physics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Built Environment: The Bartlett School of Planning UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Political Science: Constitution Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Centre for Nonlinear Dynamics and its Applications (CNDA) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Economics: Department of Economics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Built Environment UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Immunology and Molecular Pathology: Centre for Paediatric and Adolescent Rheumatology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Anatomy and Developmental Biology: Department of Anatomy and Developmental Biology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: National Medical Laser Centre UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Civil and Environmental Engineering: Centre for Transport Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Psychology: Sub-department of Clinical Health Psychology: Sub-department of Clinical Health Psychology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: School of Library, Archive and Information Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Chemical Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Political Science: School of Public Policy (SPP): School of Public Policy (SPP) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Biology: Department of Biology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Biochemistry and Endocrinology Research Groups UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Biochemical and Nutritional Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Psychiatry and Behavioural Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Immunology and Molecular Pathology: Department of Immunology and Molecular Pathology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Institute of Archaeology: AHRC Centre for the Evolution of Cultural Diversity UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Immunology and Molecular Pathology: Centre for Immunodeficiency UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Physics and Astronomy: Elementary Particle Physics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of English Language and Literature UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Computer Science: Networks UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Biomedical Informatics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: ABC Breast Cancer Research Group UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Mathematics: Department of Mathematics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Space and Climate Physics at the Mullard Space Science Laboratory UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Psychology: Sub-department of Clinical Health Psychology: Psychoanalysis Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Anatomy and Developmental Biology: Wellcome Trust Centre for the History of Medicine at UCL: Wellcome Witnesses to Twentieth Century Medicine UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Institute of Urology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: Coloproctology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Laws: Centre for Politics, Law and Society UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Centre for Functional Neuroimaging UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Cancer: Molecular Haematology and Cancer Biology Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Laws: Faculty of Laws UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Pharmacology UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: Office of the Vice-Provost (Academic and International) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: School of Library, Archive and Information Studies: School of Library, Archive and Information Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Infection: Centre for Infectious Diseases and International Health UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Immunology and Molecular Pathology: Centre for Rheumatology Research UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: UCL Centre for Systems Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Computer Science: Bioinformatics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of European Social and Political Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Biochemistry and Endocrinology Research Groups: Molecular Endocrinology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Mechanical Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Civil and Environmental Engineering: Department of Civil and Environmental Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Infection: Department of Infection UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Radiology and Physics Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Built Environment: Development Planning Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: UCL Ear Institute: Centre for Auditory Research UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Built Environment: The Bartlett School of Construction and Project Management UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of German UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Infection and Immunity: Molecular Immunology Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Institute of Cognitive Neuroscience UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Institute of Hepatology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Institute of Archaeology: Institute for Archaeo-metallurgical Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Psychology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Population Health Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Molecular Medicine Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of English Language and Literature: Survey of English Usage UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Developmental Biology Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Neurology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Infection and Immunity UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Population Health: Department of Mental Health Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: Education and Information Support Division UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Medical Molecular Biology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Cardiology and Hatter Institute for Cardiovascular Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: UCL Ear Institute UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Physics and Astronomy: Condensed Matter and Materials Physics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Centre for Intercultural Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Boxgrove Project UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Clinical and Molecular Genetics Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Infection: Centre for Clinical Infection UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Physiology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of History UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Oral Medicine, Pathology and Special Needs Dentistry UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: Education and Information Support Division: Management Systems UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: London Centre for Nanotechnology UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Centre for Advanced Spatial Analysis (CASA) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Biomaterials and Tissue Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: UCLIC - UCL Interaction Centre UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Centre for Human Communication UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Centre for Human Genetics (CHG) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Earth Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Neurosciences Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Oral and Maxillofacial Implantology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Infection and Immunity: Infectious Diseases and Microbiology Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Biochemistry and Molecular Biology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Nephrology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Anatomy and Developmental Biology: Evolutionary Anatomy Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of Hebrew and Jewish Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: Academic Vascular Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Geography: Department of Geography UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Computer Science: Software Systems Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Physics and Astronomy UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Psychology: Department of Psychology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Institute of Human Genetics and Health UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Obstetrics and Gynaecology: Department of Obstetrics and Gynaecology UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: UCL Library Services: UCL Library Services UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Gatsby Computational Neuroscience Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Developmental Cognitive Neurosciences Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Institute of Movement Neuroscience UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Immunology and Molecular Pathology UCL Departments and Research Centres = UCL Departments and Research Centres: School of Slavonic and Eastern European Studies (SSEES) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Centre for Health Informatics and Multiprofessional Education (CHIME) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Amyloidosis and Acute Phase Proteins UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Visual Sciences Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Neural Development Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Biology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Cancer UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of Philosophy UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: CBaS - Centre for Bioscience and Society UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: CSERGE - Economics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: Leonard Cheshire Centre of Conflict Recovery UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Human Communication Science: Centre for Developmental Language Disorders and Cognitive Neuroscience UCL Departments and Research Centres = UCL Departments and Research Centres: School of Slavonic and Eastern European Studies (SSEES): Department of History UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Gastroenterology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Cardiorespiratory Sciences: Centre for Nursing and Allied Health Professionals Research UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Physics and Astronomy: Image Processing UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Centre for Advanced Instrumentation Systems (CAIS) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Institute of Child Health UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Laws: Bentham Project: Bentham Project UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Psychology: Sub-department of Clinical Health Psychology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Medical Physics and Bioengineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Population Health: MRC Clinical Trials UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Laws: Constitution Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Neurology: Wellcome Department of Imaging Neuroscience UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Phonetics and Linguistics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Diabetes and Endocrinology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Nephro-urology Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Biochemistry and Endocrinology Research Groups: Metabolism UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Cardiorespiratory Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Civil and Environmental Engineering UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Neural Plasticity Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Clinical Pharmacology and Therapeutics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Continuing Professional Development UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: UCL Library Services: SHERPA-LEAP Conference on Open Access to Research UCL Departments and Research Centres = UCL Departments and Research Centres: School of Slavonic and Eastern European Studies (SSEES): School of Slavonic and Eastern European Studies (SSEES) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of Dutch UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Oncology: Department of Oncology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Prosthetic Dentistry UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of Scandinavian Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Ophthalmology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Engineering Sciences: Department of Computer Science UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Statistical Science UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Pathology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Infection and Immunity: Rheumatology Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Economics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health: Behavioural and Brain Sciences Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Laws: Bentham Project UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Population Health Sciences: Centre for International Health and Development UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Virtual Reality Centre for the Built Environment UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Slade School of Fine Art UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Institute for Human Health and Performance UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Wolfson Institute for Biomedical Research UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: UCL Library Services: London Advocacy Event on Scholarly Communications 2002 UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Anthropology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: Centre for Anasthaesia UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Human Communication Science UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of French UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: School of Library, Archive and Information Studies: Centre for Publishing UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute for Women's Health UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Cardiovascular Biology and Medicine UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Neuroendocrinology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Anatomy and Developmental Biology: Wellcome Trust Centre for the History of Medicine at UCL UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Oncology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Population Health: Department of Primary Care and Population Sciences: Department of Primary Care and Population Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Medical Imaging UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Molecular Medicine UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: International Health and Medical Education Centre UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Institute of Archaeology UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: Education and Information Support Division: Education and Professional Development UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Centre for European Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Human Communication Science: Department of Human Communication Science UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Infection UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Rheumatology and Bloomsbury Rheumatology Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: Education and Information Support Division: Information Systems UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Population Health Sciences: Paediatric Epidemiology and Biostatistics Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Geography UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Respiratory Research UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Political Science: School of Public Policy (SPP) UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: UCL Library Services: LIFE Project UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Cardiovascular Genetics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Neurosciences and Mental Health UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Neurology: Department of Clinical and Experimental Epilepsy UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Population Health UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Cardiology in the Young UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Neurology: Sobell Department of Motor Neuroscience and Movement Disorders UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: Surgical Oncology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Orthodontics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: Clinical Trials Group UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Bone and Mineral Centre UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Physics and Astronomy: Astronomy, Astrophysics and Atmospheric Physics UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Life Sciences: Department of Anatomy and Developmental Biology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of Spanish and Latin American Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Space Syntax Laboratory UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of English Language and Literature: Department of English Language and Literature UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Built Environment: The Bartlett School of Architecture UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Genes, Development and Disease: Biochemistry and Endocrinology Research Groups: Nutrition UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Centre for European Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Neurology: Department of Neurodegenerative Disease UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Built Environment: Centre for Sustainable Heritage UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Institute of Orthopaedics and Musculoskeletal Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Infection and Immunity: Department of Immunology and Molecular Pathology: Wohl Virion Centre UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Arts and Humanities: Department of Italian UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Obstetrics and Gynaecology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Conservative Dentistry UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Department of Histopathology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Centre for Microbial Diseases UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: LICR/UCL Breast Cancer Laboratory UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences: Department of Surgery: Windeyer Institute UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Geography: Environmental Change Research Centre (ECRC) UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: Education and Information Support Division: Media Resources UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Science and Technology Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Political Science UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Institute for the Natural Environment UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Laws: Bentham Project: Journal of Bentham Studies UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Cancer Institute UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Political Science: School of Public Policy (SPP): Jill Dando Institute of Crime Science UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Mathematics: Clinical Operations Research Unit (CORU) UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Mathematics and Physical Sciences: Department of Chemistry UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Clinical Science, Technology and Geriatrics UCL Departments and Research Centres = UCL Departments and Research Centres: Services, Central Departments and Divisions: Scholarly Communications UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Hepatology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Social and Historical Sciences: Department of Economics: IFS Working Papers UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Neurology: Department of Molecular Neuroscience UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Infection and Immunity: Immunobiology Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Biochemical and Nutritional Sciences: Surgery Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Surgical and Interventional Sciences UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Population Health: Department of Epidemiology and Public Health UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Department of Nuclear Medicine UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Institute of Child Health: Population Health Sciences: International Perinatal Care Unit UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Eastman Dental Institute: Periodontology UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Biomedical Sciences: Division of Medicine: Centre for Rheumatology and Connective Tissue Diseases UCL Departments and Research Centres = UCL Departments and Research Centres: Interdepartmental and Cross-faculty Research Groups and Centres: Wolfson Institute for Biomedical Research UCL Departments and Research Centres = UCL Departments and Research Centres: Faculty of Built Environment: The Bartlett School of Graduate Studies 5582 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo94.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo94.xml
new file mode 100644
index 0000000..8cc1f75
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo94.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace DSpace at Utrecht University Univ. Utrecht: Igitur - Utrecht Publishing and Archiving Services http://www.igitur.nl/nl/uu_home_midden.jpg NL 5.11667 52.1 1 http://www.igitur.nl/ G.vanderLinde@library.uu.nl OAI http://dspace.library.uu.nl:8080/dspace-oai/request dare_didl oai_dc 1 Select collection Aardwetenschappen Biologie Biologie Proefschriften Biomedische Wetenschappen Proefschriften CERES Collectie Tjalling Koopmans Collectie Wiarda Copernicus DARE collectie DARLIN Diergeneeskunde Diergeneeskunde AV Diergeneeskunde proefschriften E-books Farmaceutische Wetenschappen Farmaceutische Wetenschappen Proefschriften Fysische Geografie Gedigitaliseerde boeken Gedigitaliseerde kaarten Geneeskunde Geneeskunde Proefschriften Geowetenschappen Proefschriften Godgeleerdheid Godgeleerdheid Proefschriften Godgeleerdheid Scripties ICO-ISOR IVLOS IVLOS Proefschriften IVLOS scripties Innovatie- en Milieuwetenschappen KEUR Leren doceren Letteren Letteren Proefschriften Letteren Scripties Natuur- en Sterrenkunde Natuur- en Sterrenkunde Proefschriften Rechtsgeleerdheid Rechtsgeleerdheid Proefschriften Scheikunde Scheikunde Proefschriften Sociale Geografie en Planologie Sociale Wetenschappen Sociale Wetenschappen Proefschriften Studium Generale Publicaties Universiteit voor Humanistiek University College University College Proefschriften Utrecht School of Economics Utrecht School of Economics Proefschriften Utrechtse School voor Bestuurs- en Organisatiewetenschap Utrechtse School voor Bestuurs- en Organisatiewetenschap Proefschriften Wijsbegeerte Wijsbegeerte Proefschriften Wiskunde en Informatica Wiskunde en Informatica Proefschriften 22776 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo95.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo95.xml
new file mode 100644
index 0000000..0fa61be
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo95.xml
@@ -0,0 +1,2 @@
+
+0 0 CDSware Bibliotheque Numerique RERO DOC digital library RERO DOC http://doc.rero.ch/img/bandeau_01_win.png CH 6.14 46.21 1 http://doc.rero.ch/?ln=en Reseau des Bibliotheques de Suisse Occidentale doc.support@rero.ch OAI http://doc.rero.ch/oai2d.py/ oai_dc 4839 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo96.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo96.xml
new file mode 100644
index 0000000..6b40ad9
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo96.xml
@@ -0,0 +1,2 @@
+
+0 0 Eigenentwicklung Publikationer från Uppsala universitet Publications from Uppsala University http://epc.ub.uu.se/uu_img/uulogo_white.gif SE 17.634483 59.86196 1 http://publications.uu.se/?lang=en Uppsala University diva-support@ub.uu.se OAI http://www.diva-portal.org/oai/uu/OAI oai_dc 3979 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo97.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo97.xml
new file mode 100644
index 0000000..11bfcf3
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo97.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace TEORA - Telemark Open Research Archive TEORA - Telemark Open Research Archive http://teora.hit.no/dspace/image/hit-teora-bok.gif NO 9.651319 59.136508 1 http://teora.hit.no/dspace/ Telemark University College Arild.Skalmeraas@hit.no OAI http://teora.hit.no/dspace-oai/request oai_dc 496 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo98.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo98.xml
new file mode 100644
index 0000000..f03b925
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo98.xml
@@ -0,0 +1,2 @@
+
+0 0 Proprietary Software Alma Mater Digital Library Alma Mater Digital Library http://diglib.cib.unibo.it/images/logo_unibo.gif IT 11.353 44.497 1 http://diglib.cib.unibo.it/ Universita di Bologna fmorroia@cib.unibo.it OAI http://diglib.cib.unibo.it/oai/oai2.php oai_dc 121 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo99.xml b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo99.xml
new file mode 100644
index 0000000..4e3b82a
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/test/repositories/repo99.xml
@@ -0,0 +1,2 @@
+
+0 0 DSpace research_online@UCD research_online@UCD http://irserver.ucd.ie/dspace/image/research_online_2.gif IE -6.215 53.307 0 http://irserver.ucd.ie/dspace/ University College Dublin research.online@ucd.ie OAI http://irserver.ucd.ie/dspace_oai/request oai_dc 667 0
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/exist-test-conf.xml b/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/exist-test-conf.xml
new file mode 100644
index 0000000..e07a98c
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/exist-test-conf.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/userProfileResourceSchema.xsd b/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/userProfileResourceSchema.xsd
new file mode 100644
index 0000000..3cd3581
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/userProfileResourceSchema.xsd
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/userProfileResourceSchemaClean.xsd b/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/userProfileResourceSchemaClean.xsd
new file mode 100644
index 0000000..037b29c
--- /dev/null
+++ b/dnet-information-service/src/test/resources/eu/dnetlib/xml/database/exist/userProfileResourceSchemaClean.xsd
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index eca7b60..358a13f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,6 +11,7 @@
dnet-core-components
dnet-core-services
+ dnet-information-service
@@ -56,7 +57,10 @@
dnet-deps
dnet-dependencies
http://maven.research-infrastructures.eu/nexus/content/repositories/dnet-deps
- default
+
+
+ exist
+ https://raw.github.com/eXist-db/mvn-repo/master
dnet45-releases
@@ -97,6 +101,7 @@
${commons.io.version}