From 27d7d8d02728c0c44e2d9160fdc0932901942e46 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 25 Jan 2017 16:20:54 -0500 Subject: [PATCH 01/88] #1 refactored to common jargon parent pom --- pom.xml | 699 +++++------------- .../jargon/dataone/MemberNodeService.java | 521 +++++++------ src/test/resources/testing.properties | 18 +- 3 files changed, 445 insertions(+), 793 deletions(-) diff --git a/pom.xml b/pom.xml index f8e0f55..7bedafa 100644 --- a/pom.xml +++ b/pom.xml @@ -2,23 +2,16 @@ 4.0.0 - org.irods - dfc-dataone - 0.0.1-SNAPSHOT + irods-dataone + + org.irods + jargon-pom + 4.1.10.0-SNAPSHOT + war dfc-dataone - REST API for iRODS DataONE Member Node Implementation based on Jargon + REST API for iRODS DataONE Member Node Implementation https://code.renci.org/gf/project/dfc-dataone/ - - UTF-8 - - - 4.0.2.3-RELEASE - 2.3.6.Final - 3.1.0.RELEASE - 3.1.0.RELEASE - 1.3.0-SNAPSHOT - gForge https://code.renci.org/gf/project/dfc-dataone/tracker/ @@ -43,462 +36,169 @@ developer + + michal-conway + Mike Conway + michael_conway@unc.edu + http://www.renci.org + RENCI + http://www.renci.org + + developer + + - - - ibiblio.repository - ibiblio.repository - http://mirrors.ibiblio.org/pub/mirrors/maven2 - - true - - - true - never - fail - - - - dice.repository snaps - dice.repository.snapshots - https://raw.github.com/DICE-UNC/DICE-Maven/master/snapshots - - true - - - true - always - warn - - - - dice.repository - dice.repository - https://raw.github.com/DICE-UNC/DICE-Maven/master/releases - - true - - - true - always - warn - - - - jboss - jboss.repository - https://repository.jboss.org/nexus/content/groups/public-jboss/ - - true - - - true - never - fail - - - - dataone.org - http://dev-testing.dataone.org/maven - - true - - - true - - - - - - renci.repository - renci.repository - https://ci-dev.renci.org/nexus/content/repositories/release - - - renci.snapshots - renci.snapshots - https://ci-dev.renci.org/nexus/content/repositories/snapshots - - - - - - org.codehaus.mojo - taglist-maven-plugin - - - org.codehaus.mojo - jxr-maven-plugin - - - maven-surefire-plugin - - - org.apache.maven.plugins - maven-surefire-report-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - - - http://java.sun.com/javase/6/docs/api/ - http://java.sun.com/javaee/5/docs/api/ - http://commons.apache.org/logging/apidocs/ - http://commons.apache.org/io/apidocs/ - http://commons.apache.org/lang/apidocs/ - http://www.junit.org/junit/javadoc/ - http://logging.apache.org/log4j/docs/api/ - http://velocity.apache.org/engine/devel/apidocs/ - - - - - org.apache.maven.plugins - maven-changelog-plugin - - - org.codehaus.mojo - cobertura-maven-plugin - 2.4 - - - - - - - org.jboss.resteasy - resteasy-jaxrs - ${resteasy.version} - - - - org.jboss.resteasy - resteasy-jaxb-provider - ${resteasy.version} - - - org.jboss.resteasy - resteasy-jettison-provider - ${resteasy.version} - - - - - org.jboss.resteasy - resteasy-cache-core - ${resteasy.version} - - - org.jboss.resteasy - resteasy-jackson-provider - ${resteasy.version} - - - org.jboss.resteasy - resteasy-crypto - ${resteasy.version} - - - org.jboss.resteasy - resteasy-multipart-provider - ${resteasy.version} - - - - - - - - - - org.jboss.resteasy - resteasy-spring - ${resteasy.version} - - - - - - - - - - - org.irods.jargon - jargon-core - ${jargon.version} - - - - junit - junit - 4.8.2 - test - - - org.slf4j - slf4j-api - 1.5.10 - - - log4j - log4j - 1.2.16 - - - org.slf4j - slf4j-log4j12 - 1.5.10 - - - org.mockito - mockito-all - 1.8.1 - test - - - org.springframework - spring-core - ${spring.core.version} - - - org.springframework - spring-aop - ${spring.core.version} - - - org.springframework - spring-expression - ${spring.core.version} - - - org.springframework - spring-webmvc - ${spring.core.version} - - - org.springframework - spring-context - ${spring.core.version} - - - org.springframework - spring-beans - ${spring.core.version} - - - - org.jboss.resteasy - tjws - ${resteasy.version} - - - javax.servlet - servlet-api - 2.5 - - - org.springframework - spring-test - ${spring.core.version} - - - org.dataone - d1_libclient_java - ${d1_libclient_version} - jar - - - org.handle - handle - 7.3.1 - system - ${project.basedir}/src/main/lib/handle.jar - - - org.elasticsearch - elasticsearch - 1.4.4 - - - org.apache.tika - tika-core - 1.8 - - - - - - javax.inject - javax.inject - 1 - - - org.eclipse.jdt.core.compiler - ecj - 4.2.1 - - - org.jboss.resteasy - resteasy-jaxrs - - - org.jboss.resteasy - resteasy-jackson-provider - - - org.jboss.resteasy - resteasy-crypto - - - org.jboss.resteasy - tjws - test - - - org.jboss.resteasy - resteasy-multipart-provider - - - javax.servlet - servlet-api - provided - - - org.springframework - spring-test - test - - - - org.jboss.resteasy - resteasy-jaxb-provider - - - - - org.jboss.resteasy - resteasy-spring - - - org.irods.jargon - jargon-core - - - - junit - junit - test - - - org.slf4j - slf4j-api - - - log4j - log4j - - - org.slf4j - slf4j-log4j12 - - - org.mockito - mockito-all - test - - - org.springframework - spring-core - - - org.springframework - spring-expression - - - org.springframework - spring-aop - - - org.springframework - spring-webmvc - - - spring-expression - org.springframework - - - - - org.springframework - spring-context - - - spring-aop - org.springframework - - - spring-expression - org.springframework - - - - - org.springframework - spring-beans - - - org.dataone - d1_libclient_java - - - handle - org.handle - system - ${project.basedir}/src/main/lib/handle.jar - - - org.elasticsearch - elasticsearch - - - org.apache.tika - tika-core - - + + + javax.inject + javax.inject + 1 + + + org.eclipse.jdt.core.compiler + ecj + 4.2.1 + + + org.jboss.resteasy + resteasy-jaxrs + + + org.jboss.resteasy + resteasy-jaxb-provider + + + org.jboss.resteasy + resteasy-jackson-provider + + + org.jboss.resteasy + resteasy-crypto + + + org.jboss.resteasy + tjws + test + + + org.jboss.resteasy + resteasy-multipart-provider + + + org.jboss.resteasy + resteasy-jettison-provider + + + javax.servlet + servlet-api + provided + + + org.springframework + spring-test + test + + + + org.jboss.resteasy + resteasy-jaxb-provider + + + + org.jboss.resteasy + resteasy-spring + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + org.springframework + spring-core + + + org.springframework + spring-expression + + + org.springframework + spring-aop + + + org.springframework + spring-webmvc + + + spring-expression + org.springframework + + + + + org.springframework + spring-context + + + spring-aop + org.springframework + + + spring-expression + org.springframework + + + + + org.springframework + spring-beans + + + handle + org.handle + system + 1.0.0 + ${project.basedir}/src/main/lib/handle.jar + + + org.elasticsearch + elasticsearch + 1.7.6 + + + org.apache.tika + tika-core + + + org.dataone + d1_libclient_java + 2.3.0 + jar + + @@ -522,7 +222,7 @@ append="true" message="public final class RestVersion {${line.separator}" /> + message=" public static String VERSION="${project.version}";${line.separator}" /> @@ -553,9 +253,10 @@ test.irods.scratch.subdir=${jargon.test.irods.scratch.subdir} test.rest.port=${test.rest.port} - - - + + + @@ -564,58 +265,10 @@ - - maven-compiler-plugin - 3.0 - - 1.6 - 1.6 - - - - maven-war-plugin - 2.3 - - src/main/webapp - true - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - - org.apache.maven.plugins - - - maven-antrun-plugin - - - [1.3,) - - - run - - - - - - - - - - - + + diff --git a/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/src/main/java/org/irods/jargon/dataone/MemberNodeService.java index d24aed0..82a31ce 100644 --- a/src/main/java/org/irods/jargon/dataone/MemberNodeService.java +++ b/src/main/java/org/irods/jargon/dataone/MemberNodeService.java @@ -1,5 +1,35 @@ package org.irods.jargon.dataone; +import java.io.IOException; +import java.io.StringReader; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.HEAD; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.xml.bind.JAXB; + import org.dataone.service.exceptions.InsufficientResources; import org.dataone.service.exceptions.InvalidRequest; import org.dataone.service.exceptions.InvalidToken; @@ -19,17 +49,17 @@ import org.dataone.service.types.v1.SystemMetadata; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.IRODSAccessObjectFactory; -import org.irods.jargon.dataone.tier1.MNCoreImpl; -import org.irods.jargon.dataone.tier1.MNReadImpl; -import org.irods.jargon.dataone.utils.ISO8601; import org.irods.jargon.dataone.configuration.RestConfiguration; import org.irods.jargon.dataone.domain.MNChecksum; import org.irods.jargon.dataone.domain.MNError; import org.irods.jargon.dataone.domain.MNLog; -import org.irods.jargon.dataone.domain.MNObjectList; import org.irods.jargon.dataone.domain.MNNode; +import org.irods.jargon.dataone.domain.MNObjectList; import org.irods.jargon.dataone.domain.MNSystemMetadata; import org.irods.jargon.dataone.events.EventLogAOElasticSearchImpl; +import org.irods.jargon.dataone.tier1.MNCoreImpl; +import org.irods.jargon.dataone.tier1.MNReadImpl; +import org.irods.jargon.dataone.utils.ISO8601; import org.jboss.resteasy.annotations.providers.jaxb.json.Mapped; import org.jboss.resteasy.annotations.providers.jaxb.json.XmlNsMap; import org.jboss.resteasy.plugins.providers.multipart.InputPart; @@ -37,139 +67,109 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.HEAD; -import javax.ws.rs.POST; -import javax.ws.rs.PathParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.xml.bind.JAXB; - -import java.io.IOException; -import java.io.StringReader; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - /** - * User: Lisa Stillwell - RENCI, UNC @ Chapel Hill - * Date: 10/4/13 - * Time: 2:22 PM + * User: Lisa Stillwell - RENCI, UNC @ Chapel Hill Date: 10/4/13 Time: 2:22 PM */ @Named @Path("/mn/v1") public class MemberNodeService { - + private Logger logger = LoggerFactory.getLogger(this.getClass()); - + @Inject IRODSAccessObjectFactory irodsAccessObjectFactory; @Inject RestConfiguration restConfiguration; - @GET - @Path("/monitor/ping") - @Produces(MediaType.TEXT_XML) - @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) -// public Response handlePing(@HeaderParam("Authorization") final String authorization) - public Response handlePing() - throws NotImplemented, ServiceFailure, InsufficientResources, JargonException { + @GET + @Path("/monitor/ping") + @Produces(MediaType.TEXT_XML) + @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) + // public Response handlePing(@HeaderParam("Authorization") final String + // authorization) + public Response handlePing() throws NotImplemented, ServiceFailure, + InsufficientResources, JargonException { -// if (authorization == null || authorization.isEmpty()) { -// throw new IllegalArgumentException("null or empty authorization"); -// } + // if (authorization == null || authorization.isEmpty()) { + // throw new IllegalArgumentException("null or empty authorization"); + // } if (irodsAccessObjectFactory == null) { throw new IllegalArgumentException("null irodsAccessObjectFactory"); } -// MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, restConfiguration, authorization); - MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, restConfiguration); - Date irodsDate = mnCoreImpl.ping(); - - SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz"); + // MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, + // restConfiguration, authorization); + MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, + restConfiguration); + Date irodsDate = mnCoreImpl.ping(); + + SimpleDateFormat df = new SimpleDateFormat( + "EEE, dd MMM yyyy HH:mm:ss zzz"); String dateStr = df.format(irodsDate); - + Response.ResponseBuilder builder = Response.ok(); - builder.header("Date", dateStr); - builder.type("text/xml"); - builder.header("Content-Length", "0"); - - return builder.build(); - } - - @GET - @Path("/node") - @Produces(MediaType.TEXT_XML) - @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public MNNode handleGetCapabilities() - throws NotImplemented, ServiceFailure { - - MNNode nodeCapabilities = new MNNode(); - - MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, restConfiguration); - Node node = mnCoreImpl.getCapabilities(); - - nodeCapabilities.copy(node); - - return nodeCapabilities; - } - - @GET - @Path("/") - @Produces(MediaType.TEXT_XML) - @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public MNNode handleDeafaultGetCapabilities() - throws NotImplemented, ServiceFailure { - - MNNode nodeCapabilities = handleGetCapabilities(); - - return nodeCapabilities; - } - - //log?[fromDate={fromDate}][&toDate={toDate}][&event={event}][&pidFilter={pidFilter}][&start={start}][&count={count}] + builder.header("Date", dateStr); + builder.type("text/xml"); + builder.header("Content-Length", "0"); + + return builder.build(); + } + + @GET + @Path("/node") + @Produces(MediaType.TEXT_XML) + @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) + public MNNode handleGetCapabilities() throws NotImplemented, ServiceFailure { + + MNNode nodeCapabilities = new MNNode(); + + MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, + restConfiguration); + Node node = mnCoreImpl.getCapabilities(); + + nodeCapabilities.copy(node); + + return nodeCapabilities; + } + + @GET + @Path("/") + @Produces(MediaType.TEXT_XML) + @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) + public MNNode handleDeafaultGetCapabilities() throws NotImplemented, + ServiceFailure { + + MNNode nodeCapabilities = handleGetCapabilities(); + + return nodeCapabilities; + } + + // log?[fromDate={fromDate}][&toDate={toDate}][&event={event}][&pidFilter={pidFilter}][&start={start}][&count={count}] @GET - @Path("/log") - @Produces(MediaType.TEXT_XML) - @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public MNLog handleGetLogRecords( - @QueryParam("fromDate") String fromDateStr, - @QueryParam("toDate") String toDateStr, - @QueryParam("event") String event, - @QueryParam("pidFilter") String pidFilter, - @DefaultValue("0") @QueryParam("start") int start, - @DefaultValue("500") @QueryParam("count") int count - ) - throws NotImplemented, - ServiceFailure, - NotAuthorized, - InvalidRequest, - InvalidToken { - - logger.info("/log request: fromData={} toDate={}", fromDateStr, toDateStr); + @Path("/log") + @Produces(MediaType.TEXT_XML) + @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) + public MNLog handleGetLogRecords( + @QueryParam("fromDate") String fromDateStr, + @QueryParam("toDate") String toDateStr, + @QueryParam("event") String event, + @QueryParam("pidFilter") String pidFilter, + @DefaultValue("0") @QueryParam("start") int start, + @DefaultValue("500") @QueryParam("count") int count) + throws NotImplemented, ServiceFailure, NotAuthorized, + InvalidRequest, InvalidToken { + + logger.info("/log request: fromData={} toDate={}", fromDateStr, + toDateStr); logger.info("/log request: event={} pidFilter={}", event, pidFilter); logger.info("/log request: start={} count={}", start, count); - - MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, restConfiguration); - + + MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, + restConfiguration); + // parse date strings Date fromDate = null; Date toDate = null; @@ -184,23 +184,17 @@ public MNLog handleGetLogRecords( logger.error("handleListObjects: unable to parse query dates"); throw new InvalidRequest("1480", e.getMessage()); } - + Event e = Event.convert(event); - - Log log = mnCoreImpl.getLogRecords( - fromDate, - toDate, - e, - pidFilter, - start, - count); + + Log log = mnCoreImpl.getLogRecords(fromDate, toDate, e, pidFilter, + start, count); logger.info("returned log={}", log.toString()); - - + // set Log attributes in MNLog MNLog mnLog = new MNLog(); mnLog.copy(log); - + return mnLog; } @@ -208,236 +202,239 @@ public MNLog handleGetLogRecords( @Path("/object/{id}") @Produces(MediaType.APPLICATION_OCTET_STREAM) public void handleRead(@PathParam("id") final String pid, - @Context final HttpServletResponse response) - throws InvalidToken, - ServiceFailure, - NotAuthorized, - NotFound, - NotImplemented, - InsufficientResources { - - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, restConfiguration); - + @Context final HttpServletResponse response) throws InvalidToken, + ServiceFailure, NotAuthorized, NotFound, NotImplemented, + InsufficientResources { + + MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, + restConfiguration); + Identifier id = new Identifier(); id.setValue(pid); // Had to write new method in mnReadImpl since I // couldn't figure out how to override the get method mnReadImpl.streamObject(response, id); - + // now log the event - EventLogAOElasticSearchImpl eventLog = new EventLogAOElasticSearchImpl(irodsAccessObjectFactory, restConfiguration); + EventLogAOElasticSearchImpl eventLog = new EventLogAOElasticSearchImpl( + irodsAccessObjectFactory, restConfiguration); try { eventLog.recordEvent(Event.READ, id, "DataONE replication"); } catch (Exception e) { - logger.error("Unable to log EVENT: {} for data object id: {}", Event.READ, pid); + logger.error("Unable to log EVENT: {} for data object id: {}", + Event.READ, pid); } - + } - + @GET @Path("/checksum/{id}") @Produces(MediaType.TEXT_XML) - public MNChecksum handleGetChecksum(@PathParam("id") final String pid, - @DefaultValue("MD5") @QueryParam("checksumAlgorithm") final String algorithm) - throws InvalidToken, - ServiceFailure, - NotAuthorized, - NotFound, - NotImplemented, - InvalidRequest { + public MNChecksum handleGetChecksum( + @PathParam("id") final String pid, + @DefaultValue("MD5") @QueryParam("checksumAlgorithm") final String algorithm) + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, + NotImplemented, InvalidRequest { MNChecksum mnChecksum = new MNChecksum(); - + if (!algorithm.toUpperCase().equals("MD5")) { - throw new InvalidRequest("1402", "invalid checksum algorithm requested - only MD5 supported"); + throw new InvalidRequest("1402", + "invalid checksum algorithm requested - only MD5 supported"); } Identifier id = new Identifier(); id.setValue(pid); - - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, restConfiguration); + + MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, + restConfiguration); Checksum checksum = mnReadImpl.getChecksum(id, algorithm); - - mnChecksum.copy(checksum); - + + mnChecksum.copy(checksum); + return mnChecksum; } - + @GET @Path("/replica/{id}") @Produces(MediaType.APPLICATION_OCTET_STREAM) public void handleReplica(@PathParam("id") final String pid, - @Context final HttpServletResponse response) - throws InvalidToken, - ServiceFailure, - NotAuthorized, - NotFound, - NotImplemented, - InsufficientResources { - - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, restConfiguration); - + @Context final HttpServletResponse response) throws InvalidToken, + ServiceFailure, NotAuthorized, NotFound, NotImplemented, + InsufficientResources { + + MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, + restConfiguration); + Identifier id = new Identifier(); id.setValue(pid); - + // Had to write new method in mnReadImpl since I // couldn't figure out how to override the get method mnReadImpl.streamObject(response, id); - + // now log the event - EventLogAOElasticSearchImpl eventLog = new EventLogAOElasticSearchImpl(irodsAccessObjectFactory, restConfiguration); + EventLogAOElasticSearchImpl eventLog = new EventLogAOElasticSearchImpl( + irodsAccessObjectFactory, restConfiguration); try { eventLog.recordEvent(Event.REPLICATE, id, "DataONE replication"); } catch (Exception e) { - logger.error("Unable to log EVENT: {} for data object id: {}", Event.REPLICATE, pid); + logger.error("Unable to log EVENT: {} for data object id: {}", + Event.REPLICATE, pid); } - + } - + @GET @Path("/meta/{id}") @Produces(MediaType.TEXT_XML) - public MNSystemMetadata handleGetSystemMetadata(@PathParam("id") final String pid) - //@Context final HttpServletResponse response) - throws InvalidToken, - ServiceFailure, - NotAuthorized, - NotFound, - NotImplemented, - InvalidRequest { + public MNSystemMetadata handleGetSystemMetadata( + @PathParam("id") final String pid) + // @Context final HttpServletResponse response) + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, + NotImplemented, InvalidRequest { MNSystemMetadata mnSystemMetadata = new MNSystemMetadata(); - + Identifier id = new Identifier(); id.setValue(pid); - - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, restConfiguration); + + MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, + restConfiguration); SystemMetadata sysMetadata = mnReadImpl.getSystemMetadata(id); - - mnSystemMetadata.copy(sysMetadata); - + + mnSystemMetadata.copy(sysMetadata); + return mnSystemMetadata; } - + @HEAD - @Path("/object/{id}") - @Produces(MediaType.TEXT_XML) - @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public Response handleDescribe(@PathParam("id") final String pid) - //@Context final HttpServletResponse response) - throws NotAuthorized, NotImplemented, ServiceFailure, NotFound, InvalidToken { - + @Path("/object/{id}") + @Produces(MediaType.TEXT_XML) + @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) + public Response handleDescribe(@PathParam("id") final String pid) + // @Context final HttpServletResponse response) + throws NotAuthorized, NotImplemented, ServiceFailure, NotFound, + InvalidToken { + Identifier id = new Identifier(); id.setValue(pid); - + DescribeResponse describeResponse; - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, restConfiguration); - try { + MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, + restConfiguration); + try { describeResponse = mnReadImpl.describe(id); } catch (NotFound ex) { - + Response.ResponseBuilder builder = Response.ok(); builder.status(Status.NOT_FOUND); - builder.type(MediaType.TEXT_XML); - builder.header("DataONE-Exception-Name", "NotFound"); - builder.header("DataONE-Exception-DetailCode", ex.getDetail_code()); - builder.header("DataONE-Exception-Description", ex.getDescription()); - builder.header("DataONE-Exception-PID", pid); - - return builder.build(); + builder.type(MediaType.TEXT_XML); + builder.header("DataONE-Exception-Name", "NotFound"); + builder.header("DataONE-Exception-DetailCode", ex.getDetail_code()); + builder.header("DataONE-Exception-Description", ex.getDescription()); + builder.header("DataONE-Exception-PID", pid); + + return builder.build(); } - - Checksum checksum = describeResponse.getDataONE_Checksum(); - String checksumStr = checksum.getAlgorithm() + "," + checksum.getValue(); - - // Convert data to GMT and format for HTTP header - DateFormat gmtFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss "); - TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); - gmtFormat.setTimeZone(gmtTimeZone); - Calendar calendar = new GregorianCalendar(); + + Checksum checksum = describeResponse.getDataONE_Checksum(); + String checksumStr = checksum.getAlgorithm() + "," + + checksum.getValue(); + + // Convert data to GMT and format for HTTP header + DateFormat gmtFormat = new SimpleDateFormat( + "EEE, dd MMM yyyy HH:mm:ss "); + TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); + gmtFormat.setTimeZone(gmtTimeZone); + Calendar calendar = new GregorianCalendar(); calendar.setTime(describeResponse.getLast_Modified()); calendar.setTimeZone(gmtTimeZone); - String dateStr = gmtFormat.format(calendar.getTime()); - dateStr += "GMT"; - + String dateStr = gmtFormat.format(calendar.getTime()); + dateStr += "GMT"; + Response.ResponseBuilder builder = Response.ok(); - builder.header("Last-Modified", dateStr); - builder.header("Content-Length", describeResponse.getContent_Length().toString()); - builder.type(MediaType.APPLICATION_OCTET_STREAM); - builder.header("DataONE-formatId", describeResponse.getDataONE_ObjectFormatIdentifier().getValue().toString()); - builder.header("DataONE-Checksum", checksumStr); - builder.header("DataONE-SerialVersion", describeResponse.getSerialVersion().toString()); - - return builder.build(); - } - + builder.header("Last-Modified", dateStr); + builder.header("Content-Length", describeResponse.getContent_Length() + .toString()); + builder.type(MediaType.APPLICATION_OCTET_STREAM); + builder.header("DataONE-formatId", describeResponse + .getDataONE_ObjectFormatIdentifier().getValue().toString()); + builder.header("DataONE-Checksum", checksumStr); + builder.header("DataONE-SerialVersion", describeResponse + .getSerialVersion().toString()); + + return builder.build(); + } + @POST - @Path("/error") + @Path("/error") @Produces(MediaType.TEXT_XML) @Consumes(MediaType.MULTIPART_FORM_DATA) - @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public Response handleSynchronizationFailed( - MultipartFormDataInput input) - throws NotAuthorized, NotImplemented, ServiceFailure, InvalidToken { + @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) + public Response handleSynchronizationFailed(MultipartFormDataInput input) + throws NotAuthorized, NotImplemented, ServiceFailure, InvalidToken { Map> uploadForm = input.getFormDataMap(); List inputParts = uploadForm.get("message"); if (inputParts == null || inputParts.size() == 0) { - throw new ServiceFailure("2161", "Synch Failure Exception cannot parse message"); + throw new ServiceFailure("2161", + "Synch Failure Exception cannot parse message"); } String str_xml = null; try { str_xml = inputParts.get(0).getBodyAsString(); } catch (IOException e) { - throw new ServiceFailure("2161", "Synch Failure Exception cannot extract message xml"); + throw new ServiceFailure("2161", + "Synch Failure Exception cannot extract message xml"); } - MNError error = JAXB.unmarshal(new StringReader(str_xml), MNError.class); + MNError error = JAXB + .unmarshal(new StringReader(str_xml), MNError.class); SynchronizationFailed message = error.copyToSynchronizationFailed(); if (message == null) { - throw new ServiceFailure("2161", "Synch Failure Exception message is null"); + throw new ServiceFailure("2161", + "Synch Failure Exception message is null"); } - - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, restConfiguration); + + MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, + restConfiguration); boolean success = mnReadImpl.synchronizationFailed(message); if (!success) { - throw new ServiceFailure("2161", "Failed to log Synchronization Failure event"); + throw new ServiceFailure("2161", + "Failed to log Synchronization Failure event"); } - + Response.ResponseBuilder builder = Response.ok(); - + return builder.build(); } - + // GET /object[?fromDate={fromDate}&toDate={toDate}&formatId={formatId} // &replicaStatus={replicaStatus} &start={start}&count={count}] @GET @Path("/object") @Produces(MediaType.TEXT_XML) - public MNObjectList handleListObjects( - @QueryParam("fromDate") final String fromDateStr, - @QueryParam("toDate") final String toDateStr, - @QueryParam("formatId") final String formatIdStr, - @QueryParam("replicaStatus") final Boolean replicaStatus, - @DefaultValue("0") @QueryParam("start") final Integer start, - @DefaultValue("500") @QueryParam("count") final Integer count - ) throws - InvalidToken, - ServiceFailure, - NotAuthorized, - InvalidRequest, - NotImplemented { + public MNObjectList handleListObjects( + @QueryParam("fromDate") final String fromDateStr, + @QueryParam("toDate") final String toDateStr, + @QueryParam("formatId") final String formatIdStr, + @QueryParam("replicaStatus") final Boolean replicaStatus, + @DefaultValue("0") @QueryParam("start") final Integer start, + @DefaultValue("500") @QueryParam("count") final Integer count) + throws InvalidToken, ServiceFailure, NotAuthorized, InvalidRequest, + NotImplemented { MNObjectList mnObjectList = new MNObjectList(); - + // parse any query arguments to convert into correct formats, // if not handled by data type constructors ObjectFormatIdentifier formatId = new ObjectFormatIdentifier(); formatId.setValue(formatIdStr); - + Date fromDate = null; Date toDate = null; try { @@ -451,11 +448,13 @@ public MNObjectList handleListObjects( logger.error("handleListObjects: unable to parse query dates"); throw new InvalidRequest("1540", e.getMessage()); } - - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, restConfiguration); - ObjectList objectList = mnReadImpl.listObjects(fromDate, toDate, formatId, replicaStatus, start, count); + + MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, + restConfiguration); + ObjectList objectList = mnReadImpl.listObjects(fromDate, toDate, + formatId, replicaStatus, start, count); mnObjectList.copy(objectList); - + return mnObjectList; } } diff --git a/src/test/resources/testing.properties b/src/test/resources/testing.properties index 0f2cb71..2a88bd5 100644 --- a/src/test/resources/testing.properties +++ b/src/test/resources/testing.properties @@ -1,10 +1,10 @@ test.confirm=${jargon.test.confirm} - test.data.directory=${jargon.test.data.directory} - test.irods.user=${jargon.test.irods.user} - test.irods.password=${jargon.test.irods.password} - test.irods.resource=${jargon.test.irods.resource} - test.irods.host=${jargon.test.irods.host} - test.irods.port=${jargon.test.irods.port} - test.irods.zone=${jargon.test.irods.zone} - test.irods.scratch.subdir=${jargon.test.irods.scratch.subdir} - test.rest.port=${test.rest.port} \ No newline at end of file + test.data.directory=/home/mconway/temp/irodsscratch/ + test.irods.user=test1 + test.irods.password=test + test.irods.resource=test1-resc + test.irods.host=irods419.irodslocal + test.irods.port=1247 + test.irods.zone=zone1 + test.irods.scratch.subdir=jargon-scratch + test.rest.port=8888 \ No newline at end of file From 436796c15ed471fb5b26f7b564b69b9e3ab3379b Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 26 Jan 2017 17:39:29 -0500 Subject: [PATCH 02/88] #1 refactor --- .gitignore | 38 --------------- README.md | 18 -------- pom.xml | 46 ++----------------- .../jargon/rest/service/SMIMEService.java | 17 ------- .../irods/jargon/rest/unittest/AllTests.java | 15 ------ 5 files changed, 3 insertions(+), 131 deletions(-) delete mode 100644 .gitignore delete mode 100644 README.md delete mode 100644 src/test/java/org/irods/jargon/rest/service/SMIMEService.java delete mode 100644 src/test/java/org/irods/jargon/rest/unittest/AllTests.java diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 49e3a54..0000000 --- a/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -/target -*.pydevproject -.project -.metadata -.springBeans -bin/** -tmp/** -tmp/**/* -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath -.DS_Store -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - -#Version file -src/**/RestVersion.java - -#removed files -test-certs/public.pem -test-certs/private.pem -test-certs/cakey.pem -test-certs/cacert.pem -src/main/resources/admpriv.bin diff --git a/README.md b/README.md deleted file mode 100644 index 53fc060..0000000 --- a/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# dfc-dataone -DataONE Member Node Implementation for iRODS -============================================ - -Supports DataONE Member Node Tier 1 Implementaion v2.0 - -Uses: Jargon, Spring, RestEasy - -Projects using this code for an iRODS based D1 member node implementation must customize: - -1. resources/d1_client.properties -1. implementation of events/EventLogAO interface -1. implementation of id/UniqueIdAO interface - -To Do: ------- -Develop Tests - diff --git a/pom.xml b/pom.xml index 7bedafa..5d2816b 100644 --- a/pom.xml +++ b/pom.xml @@ -2,52 +2,14 @@ 4.0.0 - irods-dataone + dataone-node org.irods - jargon-pom + dfc-dataone 4.1.10.0-SNAPSHOT war - dfc-dataone - REST API for iRODS DataONE Member Node Implementation - https://code.renci.org/gf/project/dfc-dataone/ - - gForge - https://code.renci.org/gf/project/dfc-dataone/tracker/ - - - scm:git:ssh://developername@code.renci.org/gitroot/dfc-dataone - scm:git:ssh://${user.name}@code.renci.org/gitroot/dfc-dataone - - - RENCI - http://www.renci.org - - - - lisa - Lisa Stillwell - lisa@renci.org - http://www.renci.org - RENCI - http://www.renci.org - - developer - - - - michal-conway - Mike Conway - michael_conway@unc.edu - http://www.renci.org - RENCI - http://www.renci.org - - developer - - - + DataOne node javax.inject @@ -195,8 +157,6 @@ org.dataone d1_libclient_java - 2.3.0 - jar diff --git a/src/test/java/org/irods/jargon/rest/service/SMIMEService.java b/src/test/java/org/irods/jargon/rest/service/SMIMEService.java deleted file mode 100644 index e194012..0000000 --- a/src/test/java/org/irods/jargon/rest/service/SMIMEService.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package org.irods.jargon.rest.service; - -import javax.inject.Named; - -/** - * Services for SMIME encryption and decryption - * - * @author Mike Conway - DICE (www.irods.org) - * - */ -@Named -public class SMIMEService { - -} diff --git a/src/test/java/org/irods/jargon/rest/unittest/AllTests.java b/src/test/java/org/irods/jargon/rest/unittest/AllTests.java deleted file mode 100644 index 1cc726a..0000000 --- a/src/test/java/org/irods/jargon/rest/unittest/AllTests.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.irods.jargon.rest.unittest; - -//import org.irods.jargon.rest.commands.user.UserGroupServiceTest; -//import org.irods.jargon.rest.commands.user.UserServiceTest; -//import org.irods.jargon.rest.environment.ServerEnvironmentServiceTest; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -//import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -//@SuiteClasses({ UserGroupServiceTest.class, UserServiceTest.class, -// ServerEnvironmentServiceTest.class }) -public class AllTests { - -} From 3b8f132757b32d83b401be253e2a2ed6458ff3d9 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 26 Jan 2017 17:40:38 -0500 Subject: [PATCH 03/88] #1 cleanup --- .../java/org/irods/jargon/dataone/utils/RestVersion.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/org/irods/jargon/dataone/utils/RestVersion.java diff --git a/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java new file mode 100644 index 0000000..6db88cd --- /dev/null +++ b/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -0,0 +1,5 @@ +package org.irods.jargon.dataone.utils; +public final class RestVersion { + public static String VERSION="4.1.10.0-SNAPSHOT"; + public static String BUILD_TIME="2017-01-26T22:35:58Z"; +} From 5bf06a305812e7345f9484d20cd625d920edef0d Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 26 Jan 2017 17:46:40 -0500 Subject: [PATCH 04/88] #1 big refactor --- .gitignore | 29 ++ README.md | 18 ++ dataone-node/pom.xml | 234 +++++++++++++++ .../jargon/dataone/IrodsDataoneVersion.java | 0 .../jargon/dataone/MemberNodeService.java | 0 .../jargon/dataone/auth/BasicAuthFilter.java | 0 .../auth/DefaultHttpClientAndContext.java | 0 .../jargon/dataone/auth/RestAuthUtils.java | 0 .../jargon/dataone/auth/package-info.java | 0 .../configuration/RestConfiguration.java | 0 .../dataone/configuration/package-info.java | 0 .../context/SpringApplicationContext.java | 0 .../jargon/dataone/context/package-info.java | 0 .../jargon/dataone/domain/MNAccessPolicy.java | 0 .../jargon/dataone/domain/MNChecksum.java | 0 .../irods/jargon/dataone/domain/MNError.java | 0 .../irods/jargon/dataone/domain/MNLog.java | 0 .../jargon/dataone/domain/MNLogEntry.java | 0 .../irods/jargon/dataone/domain/MNNode.java | 0 .../jargon/dataone/domain/MNObjectInfo.java | 0 .../jargon/dataone/domain/MNObjectList.java | 0 .../dataone/domain/MNPermissionEnum.java | 0 .../irods/jargon/dataone/domain/MNPing.java | 0 .../dataone/domain/MNReplicationPolicy.java | 0 .../jargon/dataone/domain/MNSchedule.java | 0 .../jargon/dataone/domain/MNService.java | 0 .../dataone/domain/MNSynchronization.java | 0 .../dataone/domain/MNSystemMetadata.java | 0 .../jargon/dataone/domain/ServerInfo.java | 0 .../jargon/dataone/domain/package-info.java | 0 .../jargon/dataone/events/EventLogAO.java | 0 .../events/EventLogAOElasticSearchImpl.java | 0 .../jargon/dataone/events/EventsEnum.java | 0 .../jargon/dataone/events/package-info.java | 0 .../dataone/exceptions/ExceptionUtils.java | 0 .../exceptions/NotFoundExceptionMapper.java | 0 .../dataone/exceptions/package-info.java | 0 .../dataone/id/DataObjectListResponse.java | 0 .../dataone/id/HandleListerRunnable.java | 0 .../irods/jargon/dataone/id/UniqueIdAO.java | 0 .../dataone/id/UniqueIdAOHandleImpl.java | 0 .../id/UniqueIdAOHandleInMetadataImpl.java | 0 .../irods/jargon/dataone/id/package-info.java | 0 .../irods/jargon/dataone/package-info.java | 0 .../jargon/dataone/tier1/MNCoreImpl.java | 0 .../jargon/dataone/tier1/MNReadImpl.java | 0 .../jargon/dataone/tier1/package-info.java | 0 .../utils/DataObjectMetadataUtils.java | 0 .../jargon/dataone/utils/DataTypeUtils.java | 0 .../irods/jargon/dataone/utils/ISO8601.java | 0 .../dataone/utils/PropertiesLoader.java | 0 .../dataone/utils/RestTestingProperties.java | 0 .../jargon/dataone/utils/RestVersion.java | 2 +- .../jargon/dataone/utils/package-info.java | 0 .../src}/main/lib/cnriutil.jar | Bin {src => dataone-node/src}/main/lib/handle.jar | Bin .../src}/main/resources/config.xml | 0 .../src}/main/resources/d1client.properties | 0 .../src}/main/resources/jargon-beans.xml | 0 .../src}/main/resources/log4j.properties | 0 .../src}/main/webapp/WEB-INF/rest-servlet.xml | 0 .../src}/main/webapp/WEB-INF/web.xml | 0 .../src}/main/webapp/accessDenied.htm | 0 .../src}/main/webapp/index.html | 0 .../jargon/rest/service/package-info.java | 0 .../src}/test/resources/rest-servlet.xml | 0 .../test-certs}/notes.txt | 0 pom.xml | 280 ++++-------------- src/test/resources/testing.properties | 10 - 69 files changed, 337 insertions(+), 236 deletions(-) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 dataone-node/pom.xml rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/MemberNodeService.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/auth/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/configuration/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/context/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNChecksum.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNError.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNLog.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNNode.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNObjectList.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNPing.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNSchedule.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNService.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/ServerInfo.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/domain/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/events/EventLogAO.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/events/EventsEnum.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/events/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/exceptions/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/id/HandleListerRunnable.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleImpl.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleInMetadataImpl.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/id/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/tier1/package-info.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/utils/ISO8601.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java (100%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/utils/RestVersion.java (68%) rename {src => dataone-node/src}/main/java/org/irods/jargon/dataone/utils/package-info.java (100%) rename {src => dataone-node/src}/main/lib/cnriutil.jar (100%) rename {src => dataone-node/src}/main/lib/handle.jar (100%) rename {src => dataone-node/src}/main/resources/config.xml (100%) rename {src => dataone-node/src}/main/resources/d1client.properties (100%) rename {src => dataone-node/src}/main/resources/jargon-beans.xml (100%) rename {src => dataone-node/src}/main/resources/log4j.properties (100%) rename {src => dataone-node/src}/main/webapp/WEB-INF/rest-servlet.xml (100%) rename {src => dataone-node/src}/main/webapp/WEB-INF/web.xml (100%) rename {src => dataone-node/src}/main/webapp/accessDenied.htm (100%) rename {src => dataone-node/src}/main/webapp/index.html (100%) rename {src => dataone-node/src}/test/java/org/irods/jargon/rest/service/package-info.java (100%) rename {src => dataone-node/src}/test/resources/rest-servlet.xml (100%) rename {test-certs => dataone-node/test-certs}/notes.txt (100%) delete mode 100644 src/test/resources/testing.properties diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cd325f --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +**/.classpath +**/.DS_Store +**/nb-configuration.xml +**/.springBeans +**/testing.properties +*.iml +.project +.idea +.metadata +.DS_Store +Servers +.settings +.classpath +target +mvn-repo +bin +*.war +*.log +*/nbactions.xml +*.eml +nbactions.xml +testing.properties +*/test-output +JargonVersion.java +**/${test.option.mount.basedir} +*.*~ +**/.project +**/.settings +**/target diff --git a/README.md b/README.md new file mode 100644 index 0000000..53fc060 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# dfc-dataone +DataONE Member Node Implementation for iRODS +============================================ + +Supports DataONE Member Node Tier 1 Implementaion v2.0 + +Uses: Jargon, Spring, RestEasy + +Projects using this code for an iRODS based D1 member node implementation must customize: + +1. resources/d1_client.properties +1. implementation of events/EventLogAO interface +1. implementation of id/UniqueIdAO interface + +To Do: +------ +Develop Tests + diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml new file mode 100644 index 0000000..5d2816b --- /dev/null +++ b/dataone-node/pom.xml @@ -0,0 +1,234 @@ + + + 4.0.0 + dataone-node + + org.irods + dfc-dataone + 4.1.10.0-SNAPSHOT + + war + DataOne node + + + javax.inject + javax.inject + 1 + + + org.eclipse.jdt.core.compiler + ecj + 4.2.1 + + + org.jboss.resteasy + resteasy-jaxrs + + + org.jboss.resteasy + resteasy-jaxb-provider + + + org.jboss.resteasy + resteasy-jackson-provider + + + org.jboss.resteasy + resteasy-crypto + + + org.jboss.resteasy + tjws + test + + + org.jboss.resteasy + resteasy-multipart-provider + + + org.jboss.resteasy + resteasy-jettison-provider + + + javax.servlet + servlet-api + provided + + + org.springframework + spring-test + test + + + + org.jboss.resteasy + resteasy-jaxb-provider + + + + org.jboss.resteasy + resteasy-spring + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + org.springframework + spring-core + + + org.springframework + spring-expression + + + org.springframework + spring-aop + + + org.springframework + spring-webmvc + + + spring-expression + org.springframework + + + + + org.springframework + spring-context + + + spring-aop + org.springframework + + + spring-expression + org.springframework + + + + + org.springframework + spring-beans + + + handle + org.handle + system + 1.0.0 + ${project.basedir}/src/main/lib/handle.jar + + + org.elasticsearch + elasticsearch + 1.7.6 + + + org.apache.tika + tika-core + + + org.dataone + d1_libclient_java + + + + + + maven-antrun-plugin + + + + run + + generate-sources + + + + + + + + + + + + + + + + + + 0 + validate + + + + + + test.confirm=${jargon.test.confirm} + test.data.directory=${jargon.test.data.directory} + test.irods.user=${jargon.test.irods.user} + test.irods.password=${jargon.test.irods.password} + test.irods.resource=${jargon.test.irods.resource} + test.irods.host=${jargon.test.irods.host} + test.irods.port=${jargon.test.irods.port} + test.irods.zone=${jargon.test.irods.zone} + test.irods.scratch.subdir=${jargon.test.irods.scratch.subdir} + test.rest.port=${test.rest.port} + + + + + + + + run + + + + + + + + + + + diff --git a/src/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java diff --git a/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/MemberNodeService.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java diff --git a/src/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java diff --git a/src/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java diff --git a/src/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java diff --git a/src/main/java/org/irods/jargon/dataone/auth/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/auth/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/auth/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java diff --git a/src/main/java/org/irods/jargon/dataone/configuration/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/configuration/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java b/dataone-node/src/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java diff --git a/src/main/java/org/irods/jargon/dataone/context/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/context/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/context/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/context/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNChecksum.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNChecksum.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNChecksum.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNChecksum.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNError.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNError.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNError.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNError.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNLog.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLog.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNLog.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLog.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNNode.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNNode.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNObjectList.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectList.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNObjectList.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectList.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNPing.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPing.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNPing.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPing.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNService.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNService.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNService.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/ServerInfo.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/ServerInfo.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/ServerInfo.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/ServerInfo.java diff --git a/src/main/java/org/irods/jargon/dataone/domain/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/domain/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/domain/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java b/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/events/EventLogAO.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java diff --git a/src/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java diff --git a/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java b/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/events/EventsEnum.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java diff --git a/src/main/java/org/irods/jargon/dataone/events/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/events/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/events/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/events/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java diff --git a/src/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java diff --git a/src/main/java/org/irods/jargon/dataone/exceptions/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/exceptions/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java diff --git a/src/main/java/org/irods/jargon/dataone/id/HandleListerRunnable.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/HandleListerRunnable.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/id/HandleListerRunnable.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/id/HandleListerRunnable.java diff --git a/src/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java diff --git a/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleImpl.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleImpl.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleImpl.java diff --git a/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleInMetadataImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleInMetadataImpl.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleInMetadataImpl.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleInMetadataImpl.java diff --git a/src/main/java/org/irods/jargon/dataone/id/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/id/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/id/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java diff --git a/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java diff --git a/src/main/java/org/irods/jargon/dataone/tier1/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/tier1/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/tier1/package-info.java diff --git a/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java diff --git a/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java diff --git a/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/utils/ISO8601.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java diff --git a/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java diff --git a/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java diff --git a/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java similarity index 68% rename from src/main/java/org/irods/jargon/dataone/utils/RestVersion.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 6db88cd..66afed1 100644 --- a/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-01-26T22:35:58Z"; + public static String BUILD_TIME="2017-01-26T22:42:52Z"; } diff --git a/src/main/java/org/irods/jargon/dataone/utils/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/package-info.java similarity index 100% rename from src/main/java/org/irods/jargon/dataone/utils/package-info.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/utils/package-info.java diff --git a/src/main/lib/cnriutil.jar b/dataone-node/src/main/lib/cnriutil.jar similarity index 100% rename from src/main/lib/cnriutil.jar rename to dataone-node/src/main/lib/cnriutil.jar diff --git a/src/main/lib/handle.jar b/dataone-node/src/main/lib/handle.jar similarity index 100% rename from src/main/lib/handle.jar rename to dataone-node/src/main/lib/handle.jar diff --git a/src/main/resources/config.xml b/dataone-node/src/main/resources/config.xml similarity index 100% rename from src/main/resources/config.xml rename to dataone-node/src/main/resources/config.xml diff --git a/src/main/resources/d1client.properties b/dataone-node/src/main/resources/d1client.properties similarity index 100% rename from src/main/resources/d1client.properties rename to dataone-node/src/main/resources/d1client.properties diff --git a/src/main/resources/jargon-beans.xml b/dataone-node/src/main/resources/jargon-beans.xml similarity index 100% rename from src/main/resources/jargon-beans.xml rename to dataone-node/src/main/resources/jargon-beans.xml diff --git a/src/main/resources/log4j.properties b/dataone-node/src/main/resources/log4j.properties similarity index 100% rename from src/main/resources/log4j.properties rename to dataone-node/src/main/resources/log4j.properties diff --git a/src/main/webapp/WEB-INF/rest-servlet.xml b/dataone-node/src/main/webapp/WEB-INF/rest-servlet.xml similarity index 100% rename from src/main/webapp/WEB-INF/rest-servlet.xml rename to dataone-node/src/main/webapp/WEB-INF/rest-servlet.xml diff --git a/src/main/webapp/WEB-INF/web.xml b/dataone-node/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from src/main/webapp/WEB-INF/web.xml rename to dataone-node/src/main/webapp/WEB-INF/web.xml diff --git a/src/main/webapp/accessDenied.htm b/dataone-node/src/main/webapp/accessDenied.htm similarity index 100% rename from src/main/webapp/accessDenied.htm rename to dataone-node/src/main/webapp/accessDenied.htm diff --git a/src/main/webapp/index.html b/dataone-node/src/main/webapp/index.html similarity index 100% rename from src/main/webapp/index.html rename to dataone-node/src/main/webapp/index.html diff --git a/src/test/java/org/irods/jargon/rest/service/package-info.java b/dataone-node/src/test/java/org/irods/jargon/rest/service/package-info.java similarity index 100% rename from src/test/java/org/irods/jargon/rest/service/package-info.java rename to dataone-node/src/test/java/org/irods/jargon/rest/service/package-info.java diff --git a/src/test/resources/rest-servlet.xml b/dataone-node/src/test/resources/rest-servlet.xml similarity index 100% rename from src/test/resources/rest-servlet.xml rename to dataone-node/src/test/resources/rest-servlet.xml diff --git a/test-certs/notes.txt b/dataone-node/test-certs/notes.txt similarity index 100% rename from test-certs/notes.txt rename to dataone-node/test-certs/notes.txt diff --git a/pom.xml b/pom.xml index 5d2816b..213711e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,233 +2,63 @@ 4.0.0 - dataone-node + dfc-dataone org.irods - dfc-dataone + jargon-pom 4.1.10.0-SNAPSHOT - war - DataOne node - - - javax.inject - javax.inject - 1 - - - org.eclipse.jdt.core.compiler - ecj - 4.2.1 - - - org.jboss.resteasy - resteasy-jaxrs - - - org.jboss.resteasy - resteasy-jaxb-provider - - - org.jboss.resteasy - resteasy-jackson-provider - - - org.jboss.resteasy - resteasy-crypto - - - org.jboss.resteasy - tjws - test - - - org.jboss.resteasy - resteasy-multipart-provider - - - org.jboss.resteasy - resteasy-jettison-provider - - - javax.servlet - servlet-api - provided - - - org.springframework - spring-test - test - - - - org.jboss.resteasy - resteasy-jaxb-provider - - - - org.jboss.resteasy - resteasy-spring - - - org.irods.jargon - jargon-core - ${project.version} - - - - junit - junit - test - - - org.slf4j - slf4j-api - - - log4j - log4j - - - org.slf4j - slf4j-log4j12 - - - org.mockito - mockito-all - - - org.springframework - spring-core - - - org.springframework - spring-expression - - - org.springframework - spring-aop - - - org.springframework - spring-webmvc - - - spring-expression - org.springframework - - - - - org.springframework - spring-context - - - spring-aop - org.springframework - - - spring-expression - org.springframework - - - - - org.springframework - spring-beans - - - handle - org.handle - system - 1.0.0 - ${project.basedir}/src/main/lib/handle.jar - - - org.elasticsearch - elasticsearch - 1.7.6 - - - org.apache.tika - tika-core - - - org.dataone - d1_libclient_java - - - - - - maven-antrun-plugin - - - - run - - generate-sources - - - - - - - - - - - - - - - - - - 0 - validate - - - - - - test.confirm=${jargon.test.confirm} - test.data.directory=${jargon.test.data.directory} - test.irods.user=${jargon.test.irods.user} - test.irods.password=${jargon.test.irods.password} - test.irods.resource=${jargon.test.irods.resource} - test.irods.host=${jargon.test.irods.host} - test.irods.port=${jargon.test.irods.port} - test.irods.zone=${jargon.test.irods.zone} - test.irods.scratch.subdir=${jargon.test.irods.scratch.subdir} - test.rest.port=${test.rest.port} - - - - - - - - run - - - - - - - - - - + pom + dfc-dataone + DataONE Member Node service and supporting libraries + https://code.renci.org/gf/project/dfc-dataone/ + + gForge + https://code.renci.org/gf/project/dfc-dataone/tracker/ + + + scm:git:ssh://developername@code.renci.org/gitroot/dfc-dataone + scm:git:ssh://${user.name}@code.renci.org/gitroot/dfc-dataone + + + RENCI + http://www.renci.org + + + + lisa + Lisa Stillwell + lisa@renci.org + http://www.renci.org + RENCI + http://www.renci.org + + developer + + + + michal-conway + Mike Conway + michael_conway@unc.edu + http://www.renci.org + RENCI + http://www.renci.org + + developer + + + + + + + org.dataone + d1_libclient_java + 2.3.0 + jar + + + + + dataone-node + diff --git a/src/test/resources/testing.properties b/src/test/resources/testing.properties deleted file mode 100644 index 2a88bd5..0000000 --- a/src/test/resources/testing.properties +++ /dev/null @@ -1,10 +0,0 @@ -test.confirm=${jargon.test.confirm} - test.data.directory=/home/mconway/temp/irodsscratch/ - test.irods.user=test1 - test.irods.password=test - test.irods.resource=test1-resc - test.irods.host=irods419.irodslocal - test.irods.port=1247 - test.irods.zone=zone1 - test.irods.scratch.subdir=jargon-scratch - test.rest.port=8888 \ No newline at end of file From ea91ce37480a3eae0f90ab6af7d6f9b4acd78880 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 26 Jan 2017 17:50:36 -0500 Subject: [PATCH 05/88] #1 add cruft --- LICENSE.txt | 28 +++++++++++++++++++++ README.md | 29 +++++++++++++--------- dataone-node/README.md | 44 +++++++++++++++++++++++++++++++++ eclipse-formatting.xml | 56 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 145 insertions(+), 12 deletions(-) create mode 100644 LICENSE.txt create mode 100644 dataone-node/README.md create mode 100644 eclipse-formatting.xml diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..caca18c --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,28 @@ +iRODS license terms and copyright info from the irods site at: https://www.irods.org/index.php/License + +License +iRODS Copyright and Licensing + +iRODS is open source software released under a BSD License, see license text in "iRODS License Terms and Conditions" below. +The BSD license has been described in very general terms as allowing you to do whatever you want to with the software and +source code as long as you acknowledge who wrote it and that, as with any open source software, there is no warranty and you're using the code "as is." +In the spirit of collaborative open source software, the iRODS community encourages you to communicate with us, letting us know what features you like, +features that would be useful, problems, bugs, suggestions, etc., and to perhaps contribute source code. +The iRODS community has formed the Data Intensive Cyberinfrastructure Foundation, a 501(c)(3) nonprofit corporation established to serve + as the home of the iRODS open source community over the long term. If you choose to contribute new code, you'll receive full acknowledgment. All you do is complete the Contributor's Agreement, under which you retain copyright ownership + in your code but give a free license to the iRODS nonprofit foundation, allowing your code to be integrated into iRODS and in turn released under the BSD license. +Note: The above text is an educational overview of iRODS open source licensing, and not intended as legal advice nor is it part of the iRODS license agreement, which is below. As always, for legal advice consult an attorney. + +iRODS License Terms and Conditions Notice + +Copyright (c) 2005-2011, Regents of the University of California, the University of North Carolina, and the Data Intensive Cyberinfrastructure Foundation +All rights reserved. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +Neither the name of the University of California, San Diego (UCSD) nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md index 53fc060..a349231 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,23 @@ -# dfc-dataone -DataONE Member Node Implementation for iRODS -============================================ -Supports DataONE Member Node Tier 1 Implementaion v2.0 +# Project: DataONE Member Node Service +#### Date: +#### Release Version: +#### git tag: +#### Developer: Lisa Stillwell - RENCI,Mike Conway - DICE -Uses: Jargon, Spring, RestEasy +DataONE Member Node software and supporting libraries -Projects using this code for an iRODS based D1 member node implementation must customize: -1. resources/d1_client.properties -1. implementation of events/EventLogAO interface -1. implementation of id/UniqueIdAO interface +======= -To Do: ------- -Develop Tests +Please go to [[https://github.com/DFC-Incubator/dfc-dataone]] for the latest news and info. + + +## Requirements + +* Jargon depends on Java 1.8+ +* Jargon is built using Apache Maven2, see POM for dependencies +* Jargon supports iRODS 3.0 through iRODS 3.3.1 community, as well as iRODS 4.2.0 consortium + +## Libraries diff --git a/dataone-node/README.md b/dataone-node/README.md new file mode 100644 index 0000000..20ae9d9 --- /dev/null +++ b/dataone-node/README.md @@ -0,0 +1,44 @@ + +# Project: Jargon-core API +#### Date: +#### Release Version: +#### git tag: 4.1.10.1-RC2 +#### Developer: Mike Conway - DICE + +## News + +4.1.10 Release compatability supporting issue 225: https://github.com/DICE-UNC/jargon/issues/225 + +This includes support for pooling of iRODS connections targeting REST, WebDav, Cloud Browser + +======= + +Please go to [[https://github.com/DICE-UNC/jargon]] for the latest news and info. + +Jargon-core consists of the following libraries + +* jargon-core - base libraries, implementation of the iRODS protocol +* jargon-data-utils - additional functionality for dealing with iRODS data, such as building trees, storing information in iRODS on behalf of applications, and doing diffs between local and iRODS +* jargon-user-tagging - code for using free tagging and other metadata metaphors on top of iRODS +* jargon-user-profile - allows management of user profile and related configuration data in a user home directory +* jargon-ticket - support for ticket processing +* jargon-httpstream - stream http content into iRODS via Jargon +* jargon-ruleservice - support for running and managing rules from interfaces + +## Requirements + +* Jargon depends on Java 1.8+ +* Jargon is built using Apache Maven2, see POM for dependencies +* Jargon supports iRODS 3.0 through iRODS 3.3.1 community, as well as iRODS 4.2.0 consortium + +## Libraries + +Jargon-core uses Maven for dependency management. See the pom.xml file for references to various dependencies. + +Note that the following bug and feature requests are logged in GForge with related commit information [[https://github.com/DICE-UNC/jargon/issues]] + +## Changes + +#### Add object pooling protocol manager #225 + +Test addition of commons-pool support for the protocol manager (this is considered experimental at this point) diff --git a/eclipse-formatting.xml b/eclipse-formatting.xml new file mode 100644 index 0000000..d2776ff --- /dev/null +++ b/eclipse-formatting.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a637a3c7ba7c2f324d64f88aa1377e4a9b0efa53 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 26 Jan 2017 18:12:05 -0500 Subject: [PATCH 06/88] #2 hold open space for abstract api for pid and event --- .../jargon/dataone/utils/RestVersion.java | 2 +- event-service-api/pom.xml | 45 +++++++++++++++++++ pid-service-api/pom.xml | 45 +++++++++++++++++++ pom.xml | 2 + 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 event-service-api/pom.xml create mode 100644 pid-service-api/pom.xml diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 66afed1..372f290 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-01-26T22:42:52Z"; + public static String BUILD_TIME="2017-01-26T23:09:49Z"; } diff --git a/event-service-api/pom.xml b/event-service-api/pom.xml new file mode 100644 index 0000000..f3b6761 --- /dev/null +++ b/event-service-api/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + event-service-api + + org.irods + dfc-dataone + 4.1.10.0-SNAPSHOT + + jar + Event service API + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + + + diff --git a/pid-service-api/pom.xml b/pid-service-api/pom.xml new file mode 100644 index 0000000..a2c21fc --- /dev/null +++ b/pid-service-api/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + pid-service-api + + org.irods + dfc-dataone + 4.1.10.0-SNAPSHOT + + jar + PID service API + + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + + diff --git a/pom.xml b/pom.xml index 213711e..b77d570 100644 --- a/pom.xml +++ b/pom.xml @@ -60,5 +60,7 @@ dataone-node + pid-service-api + event-service-api From ed809f8727a3360c837caf93a4a1270dd7eb2695 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 30 Jan 2017 08:44:32 -0500 Subject: [PATCH 07/88] #1 add pid and event code --- event-service-api/src/main/java/.gitinclude | 0 event-service-api/src/main/resources/.gitinclude | 0 event-service-api/src/test/java/.gitinclude | 0 pid-service-api/src/main/java/.gitinclude | 0 pid-service-api/src/main/resources/.gitinclude | 0 pid-service-api/src/test/java/.gitinclude | 0 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 event-service-api/src/main/java/.gitinclude create mode 100644 event-service-api/src/main/resources/.gitinclude create mode 100644 event-service-api/src/test/java/.gitinclude create mode 100644 pid-service-api/src/main/java/.gitinclude create mode 100644 pid-service-api/src/main/resources/.gitinclude create mode 100644 pid-service-api/src/test/java/.gitinclude diff --git a/event-service-api/src/main/java/.gitinclude b/event-service-api/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/event-service-api/src/main/resources/.gitinclude b/event-service-api/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/event-service-api/src/test/java/.gitinclude b/event-service-api/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pid-service-api/src/main/java/.gitinclude b/pid-service-api/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pid-service-api/src/main/resources/.gitinclude b/pid-service-api/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pid-service-api/src/test/java/.gitinclude b/pid-service-api/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 From 4d3665f2820835f950d50196b91216f2f4a46bbe Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 7 Feb 2017 13:23:30 -0500 Subject: [PATCH 08/88] #2 more refactoring --- dataone-node/pom.xml | 7 -- .../jargon/dataone/MemberNodeService.java | 2 +- .../jargon/dataone/utils/RestVersion.java | 2 +- pid-service-api/pom.xml | 5 +- .../pidservice/DataObjectListResponse.java | 31 ++++++++ .../jargon/pid/pidservice/UniqueIdAO.java | 72 +++++++++++++++++++ .../jargon/pid/pidservice/package-info.java | 7 ++ pid-service-handle-impl/pom.xml | 51 +++++++++++++ .../src/main/java/.gitinclude | 0 .../src/main/resources/.gitinclude | 0 .../src/test/java/.gitinclude | 0 .../src/test/resources/.gitinclude | 0 pom.xml | 1 + 13 files changed, 168 insertions(+), 10 deletions(-) create mode 100644 pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java create mode 100644 pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java create mode 100644 pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/package-info.java create mode 100644 pid-service-handle-impl/pom.xml create mode 100644 pid-service-handle-impl/src/main/java/.gitinclude create mode 100644 pid-service-handle-impl/src/main/resources/.gitinclude create mode 100644 pid-service-handle-impl/src/test/java/.gitinclude create mode 100644 pid-service-handle-impl/src/test/resources/.gitinclude diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 5d2816b..3713892 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -138,13 +138,6 @@ org.springframework spring-beans - - handle - org.handle - system - 1.0.0 - ${project.basedir}/src/main/lib/handle.jar - org.elasticsearch elasticsearch diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java index 82a31ce..93361f3 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java @@ -139,7 +139,7 @@ public MNNode handleGetCapabilities() throws NotImplemented, ServiceFailure { @Path("/") @Produces(MediaType.TEXT_XML) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public MNNode handleDeafaultGetCapabilities() throws NotImplemented, + public MNNode handleDefaultGetCapabilities() throws NotImplemented, ServiceFailure { MNNode nodeCapabilities = handleGetCapabilities(); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 372f290..7b467cb 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-01-26T23:09:49Z"; + public static String BUILD_TIME="2017-02-07T18:20:28Z"; } diff --git a/pid-service-api/pom.xml b/pid-service-api/pom.xml index a2c21fc..b52911e 100644 --- a/pid-service-api/pom.xml +++ b/pid-service-api/pom.xml @@ -11,7 +11,6 @@ jar PID service API - org.irods.jargon jargon-core @@ -40,6 +39,10 @@ org.mockito mockito-all + + org.dataone + d1_libclient_java + diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java new file mode 100644 index 0000000..f075862 --- /dev/null +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java @@ -0,0 +1,31 @@ +package org.irods.jargon.pid.pidservice; + +import java.util.List; + +import org.irods.jargon.core.pub.domain.DataObject; + +public class DataObjectListResponse { + + List dataObjects; + int total; + int count; + + public List getDataObjects() { + return dataObjects; + } + public void setDataObjects(List dataObjects) { + this.dataObjects = dataObjects; + } + public int getTotal() { + return total; + } + public void setTotal(int total) { + this.total = total; + } + public int getCount() { + return count; + } + public void setCount(int count) { + this.count = count; + } +} diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java new file mode 100644 index 0000000..72740ca --- /dev/null +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java @@ -0,0 +1,72 @@ +package org.irods.jargon.pid.pidservice; + +import java.util.Date; +import java.util.List; + +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.core.pub.domain.DataObject; + +// Access object for unique identifiers that are associated with iRODS Data Objects + +public interface UniqueIdAO { + + //These methods are intended for future support of DataONE MN tiers > 1 + //public Identifier createNewIdentifier(); + //public Identifier createNewIdentifier(String identifier); + //public void deleteIdentifier(String identifier); + + /** + * Returns a DataONE Identifier object for the iRODS Data Object specified + * + * @param dataObject + * DataObject of iRODS Data Object + * associated with the identifier to be returned. + * @throws JargonException + */ + public Identifier getIdentifierFromDataObject(DataObject dataObject) + throws JargonException; + + + /** + * Returns an iRODS Data Object for the DataONE Identifier object specified + * + * @param identifier + * Identifier associated with the iRODS Data Object + * to be returned. + * @throws JargonException + */ + public DataObject getDataObjectFromIdentifier(Identifier identifier) + throws JargonException; + + + + /** + * Returns a complete list of Unique Identifiers that are associated with + * iRODS objects that are exposed to DataONE + * + * @return List<Identifier> + * @throws JargonException + */ + public List getListOfDataoneExposedIdentifiers() + throws JargonException; + + + + /** + * Returns an iRODS Data Object for the DataONE Identifier object specified + * + * @return List<DataObject> + * @throws JargonException + */ + public DataObjectListResponse getListOfDataoneExposedDataObjects( + Date fromDate, + Date toDate, + ObjectFormatIdentifier formatId, + Boolean replicaStatus, + Integer start, + Integer count + ) throws JargonException; + +} diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/package-info.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/package-info.java new file mode 100644 index 0000000..5c92a2c --- /dev/null +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/package-info.java @@ -0,0 +1,7 @@ +/** + * Base API for processing persistent identifiers in a uniform, pluggable manner. + * + * @author mconway + * + */ +package org.irods.jargon.pid.pidservice; \ No newline at end of file diff --git a/pid-service-handle-impl/pom.xml b/pid-service-handle-impl/pom.xml new file mode 100644 index 0000000..6f7d051 --- /dev/null +++ b/pid-service-handle-impl/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + pid-service-handle-impl + + org.irods + dfc-dataone + 4.1.10.0-SNAPSHOT + + jar + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + handle + org.handle + system + 1.0.0 + ${project.basedir}/src/main/lib/handle.jar + + + + Handle PID server impl + diff --git a/pid-service-handle-impl/src/main/java/.gitinclude b/pid-service-handle-impl/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pid-service-handle-impl/src/main/resources/.gitinclude b/pid-service-handle-impl/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pid-service-handle-impl/src/test/java/.gitinclude b/pid-service-handle-impl/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pid-service-handle-impl/src/test/resources/.gitinclude b/pid-service-handle-impl/src/test/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml index b77d570..fc2f52e 100644 --- a/pom.xml +++ b/pom.xml @@ -62,5 +62,6 @@ dataone-node pid-service-api event-service-api +pid-service-handle-impl From f714835e8f57a147e9c0049d3af0b79d6d0ffd3d Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 7 Feb 2017 13:27:11 -0500 Subject: [PATCH 09/88] #2 factor out handle stuff --- .../jargon/dataone/id/handle}/HandleListerRunnable.java | 2 +- .../jargon/dataone/id/handle}/UniqueIdAOHandleImpl.java | 2 +- .../id/handle}/UniqueIdAOHandleInMetadataImpl.java | 2 +- .../org/irods/jargon/dataone/id/handle/package-info.java | 9 +++++++++ 4 files changed, 12 insertions(+), 3 deletions(-) rename {dataone-node/src/main/java/org/irods/jargon/dataone/id => pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle}/HandleListerRunnable.java (99%) rename {dataone-node/src/main/java/org/irods/jargon/dataone/id => pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle}/UniqueIdAOHandleImpl.java (99%) rename {dataone-node/src/main/java/org/irods/jargon/dataone/id => pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle}/UniqueIdAOHandleInMetadataImpl.java (99%) create mode 100644 pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/package-info.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/id/HandleListerRunnable.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/HandleListerRunnable.java similarity index 99% rename from dataone-node/src/main/java/org/irods/jargon/dataone/id/HandleListerRunnable.java rename to pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/HandleListerRunnable.java index 9e86340..5fb460b 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/id/HandleListerRunnable.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/HandleListerRunnable.java @@ -1,4 +1,4 @@ -package org.irods.jargon.dataone.id; +package org.irods.jargon.dataone.id.handle; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java similarity index 99% rename from dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleImpl.java rename to pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java index c8f6b9b..3437f30 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java @@ -1,4 +1,4 @@ -package org.irods.jargon.dataone.id; +package org.irods.jargon.dataone.id.handle; import java.io.IOException; import java.io.InputStream; diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleInMetadataImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java similarity index 99% rename from dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleInMetadataImpl.java rename to pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java index 1faeb15..9a3351a 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAOHandleInMetadataImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java @@ -1,4 +1,4 @@ -package org.irods.jargon.dataone.id; +package org.irods.jargon.dataone.id.handle; import java.io.IOException; import java.io.InputStream; diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/package-info.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/package-info.java new file mode 100644 index 0000000..92c14f2 --- /dev/null +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/package-info.java @@ -0,0 +1,9 @@ +/** + * + */ +/** + * @author lisa + * Handle implemementation of PID + * + */ +package org.irods.jargon.dataone.id.handle; \ No newline at end of file From 777d8e9de224b88da9b29e2eae3f5883d82af01f Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 7 Feb 2017 13:38:53 -0500 Subject: [PATCH 10/88] #2 cleaned up refs to handle and es, commented out with fixme --- .../jargon/dataone/MemberNodeService.java | 39 +- .../events/EventLogAOElasticSearchImpl.java | 428 --------- .../jargon/dataone/tier1/MNCoreImpl.java | 247 +++-- .../jargon/dataone/tier1/MNReadImpl.java | 850 +++++++++--------- 4 files changed, 558 insertions(+), 1006 deletions(-) delete mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java index 93361f3..d1f000d 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java @@ -56,7 +56,6 @@ import org.irods.jargon.dataone.domain.MNNode; import org.irods.jargon.dataone.domain.MNObjectList; import org.irods.jargon.dataone.domain.MNSystemMetadata; -import org.irods.jargon.dataone.events.EventLogAOElasticSearchImpl; import org.irods.jargon.dataone.tier1.MNCoreImpl; import org.irods.jargon.dataone.tier1.MNReadImpl; import org.irods.jargon.dataone.utils.ISO8601; @@ -215,15 +214,15 @@ public void handleRead(@PathParam("id") final String pid, // couldn't figure out how to override the get method mnReadImpl.streamObject(response, id); - // now log the event - EventLogAOElasticSearchImpl eventLog = new EventLogAOElasticSearchImpl( - irodsAccessObjectFactory, restConfiguration); - try { - eventLog.recordEvent(Event.READ, id, "DataONE replication"); - } catch (Exception e) { - logger.error("Unable to log EVENT: {} for data object id: {}", - Event.READ, pid); - } + // FIXME: add log stuff + /* + * // now log the event EventLogAOElasticSearchImpl eventLog = new + * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, + * restConfiguration); try { eventLog.recordEvent(Event.READ, id, + * "DataONE replication"); } catch (Exception e) { + * logger.error("Unable to log EVENT: {} for data object id: {}", + * Event.READ, pid); } + */ } @@ -273,15 +272,17 @@ public void handleReplica(@PathParam("id") final String pid, // couldn't figure out how to override the get method mnReadImpl.streamObject(response, id); - // now log the event - EventLogAOElasticSearchImpl eventLog = new EventLogAOElasticSearchImpl( - irodsAccessObjectFactory, restConfiguration); - try { - eventLog.recordEvent(Event.REPLICATE, id, "DataONE replication"); - } catch (Exception e) { - logger.error("Unable to log EVENT: {} for data object id: {}", - Event.REPLICATE, pid); - } + // FIXME: add log stuff + + /* + * + * // now log the event EventLogAOElasticSearchImpl eventLog = new + * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, + * restConfiguration); try { eventLog.recordEvent(Event.REPLICATE, id, + * "DataONE replication"); } catch (Exception e) { + * logger.error("Unable to log EVENT: {} for data object id: {}", + * Event.REPLICATE, pid); } + */ } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java deleted file mode 100644 index 4302647..0000000 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAOElasticSearchImpl.java +++ /dev/null @@ -1,428 +0,0 @@ -package org.irods.jargon.dataone.events; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import org.dataone.service.exceptions.ServiceFailure; -import org.dataone.service.types.v1.Event; -import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.Log; -import org.dataone.service.types.v1.LogEntry; -import org.dataone.service.types.v1.NodeReference; -import org.dataone.service.types.v1.Subject; -import org.irods.jargon.core.connection.IRODSAccount; -import org.irods.jargon.core.exception.FileNotFoundException; -import org.irods.jargon.core.exception.InvalidArgumentException; -import org.irods.jargon.core.exception.JargonException; -import org.irods.jargon.core.pub.CollectionAndDataObjectListAndSearchAO; -import org.irods.jargon.core.pub.DataObjectAO; -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; -import org.irods.jargon.core.pub.RuleProcessingAO; -import org.irods.jargon.core.pub.domain.DataObject; -import org.irods.jargon.core.pub.domain.ObjStat; -import org.irods.jargon.core.pub.io.IRODSFile; -import org.irods.jargon.core.rule.IRODSRuleExecResult; -import org.irods.jargon.dataone.auth.RestAuthUtils; -import org.irods.jargon.dataone.configuration.RestConfiguration; -import org.irods.jargon.dataone.id.UniqueIdAOHandleImpl; -import org.irods.jargon.dataone.utils.PropertiesLoader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.elasticsearch.action.search.SearchRequestBuilder; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.Client; -import org.elasticsearch.client.transport.NoNodeAvailableException; -import org.elasticsearch.client.transport.TransportClient; -import org.elasticsearch.common.settings.ImmutableSettings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.transport.InetSocketTransportAddress; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.FilterBuilders; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.RangeFilterBuilder; -import org.elasticsearch.search.SearchHit; - -public class EventLogAOElasticSearchImpl implements EventLogAO { - - // Hard-code subject for now - private final String SUBJECT_USER = "dataone"; - final IRODSAccessObjectFactory irodsAccessObjectFactory; - final RestConfiguration restConfiguration; - - private Logger logger = LoggerFactory.getLogger(this.getClass()); - - public EventLogAOElasticSearchImpl(IRODSAccessObjectFactory irodsAccessObjectFactory, - RestConfiguration restConfiguration) { - - this.irodsAccessObjectFactory = irodsAccessObjectFactory; - this.restConfiguration = restConfiguration; - } - - - // retrieve list of logEntry (events) - @SuppressWarnings("resource") - // log?[fromDate={fromDate}][&toDate={toDate}][&event={event}][&pidFilter={pidFilter}][&start={start}][&count={count}] - // TODO: The response MUST contain only records for which the requester has permission to read. This is - // always okay because access is anonymous and read only? - @Override - public Log getLogs(Date fromDate, Date toDate, EventsEnum event, String pidFilter, int startIdx, int count) - throws NoNodeAvailableException { - - if (fromDate != null) { - logger.info("getLogs: fromDate= {}", fromDate.toString()); - } - if (toDate != null) { - logger.info("getLogs: toDate={}", toDate.toString()); - } - if (event != null) { - logger.info("getLogs: event={}", event.name()); - } - if (pidFilter != null) { - logger.info("getLogs: pidFilter={}", pidFilter); - } - logger.info("getLogs: startIdx={}, count={}", startIdx, count); - - // ignoring pidFilter for now - - boolean datesExist = true; - if (fromDate == null && toDate == null) { - datesExist = false; - } - - // restrict search to DataONE exposed data objects - // get this list from the Handle server - // should return something like this: - // 10/9/15 - worked with how to change databook rules so messages only get - // created for objects under a certain dir: i.e. /eesZone/home/nexrad/NEXRAD_LEVEL_2/*.nc - // so just assume we can query all elastic search messages, since they are only created - // for the nexrad data - String uriRegex = null; - /* so don't need this anymore - try { - // "\"/dfc3/home/rods/fabfile.py2\".*|\"/dfc3/home/rods/fabfile.py3\".*" - uriRegex = getDataOneDataObjectsRegex(); - } catch (JargonException e) { - logger.error("error getting DataOne uids and converting to regex"); - throw new NoNodeAvailableException(e.getMessage()); - } */ - - // maybe implement spring bean for these settings? - // get elasticsearch properties - PropertiesLoader loader = new PropertiesLoader(); - String elasticsearchDNS = loader.getProperty("irods.dataone.events.elasticsearch.dns"); - int elasticsearchport = Integer.parseInt(loader.getProperty("irods.dataone.events.elasticsearch.port")); - String searchIndex = loader.getProperty("irods.dataone.events.elasticsearch.searchindex"); - String searchType = loader.getProperty("irods.dataone.events.elasticsearch.searchtype"); - String clusterName = loader.getProperty("irods.dataone.events.elasticsearch.cluster.name"); - String rangeField = "created"; - - BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() - .must(QueryBuilders.matchQuery("type", "databook.persistence.rule.rdf.ruleset.Access")); - //.must(QueryBuilders.matchQuery("userEntityLink", userEntityLink)); - if (event != null) { - boolQuery.must(QueryBuilders.matchQuery("title", event.getDatabookEvent())); - } - // skip any events of no interest to DataONE - boolQuery.mustNot(QueryBuilders.matchQuery("title", "metadata add")); - - if (uriRegex != null && !uriRegex.isEmpty()) { - boolQuery.must(QueryBuilders.regexpQuery("uri", uriRegex)); - } - - // Note that date time precision is limited to one millisecond. - // TODO: If no timezone information is provided UTC will be assumed. - RangeFilterBuilder filterBuilder = FilterBuilders - .rangeFilter(rangeField); - if (datesExist) { - if (fromDate != null) { - filterBuilder - .from(fromDate.getTime()) - //.from(fromDate.getTime()/1000) - .includeLower(true); - } - else { - filterBuilder - .from(0) - .includeLower(true); - } - if (toDate != null) { - filterBuilder - .to(toDate.getTime()) - .includeUpper(false); - } - else { - filterBuilder - .to(System.currentTimeMillis()) - .includeUpper(false); - } - } - - logger.info("creating elastic search transport client: dns={}, port={}", elasticsearchDNS, elasticsearchport); - Settings settings = ImmutableSettings.settingsBuilder() //TODO: put this in config file - .put("cluster.name", clusterName).build(); - Client client = null; - if(elasticsearchDNS != null && elasticsearchDNS.length() > 0) { - client = new TransportClient(settings) - .addTransportAddress(new InetSocketTransportAddress(elasticsearchDNS, elasticsearchport)); - } - else { - client = new TransportClient(settings) - .addTransportAddress(new InetSocketTransportAddress("localhost", 9300)); - } - - SearchRequestBuilder srBuilder = client.prepareSearch(searchIndex) - .setTypes(searchType) - //.setSearchType(SearchType.DEFAULT) - .setQuery(boolQuery) - //.setPostFilter(filterBuilder) - .setFrom(startIdx).setSize(startIdx + count); - if (datesExist) { - srBuilder.setPostFilter(filterBuilder); - } - logger.info("getLogs: built search request: {}", srBuilder.toString()); - - SearchResponse response = srBuilder.execute().actionGet(); - logger.info("getLogs: got search response: {}", response.toString()); - - SearchHit[] searchHits = response.getHits().getHits(); - Log log = new Log(); - if (searchHits.length > 0) { - // now put data and put in Log object - try { - log = copyHitsToLog(startIdx, count, response.getHits().getTotalHits(), searchHits); - } catch (JargonException e) { - client.close(); - logger.error("error copying elastic search hits into Log entries"); - throw new NoNodeAvailableException(e.getMessage()); - } - } - client.close(); - - return log; - } - - - private Log copyHitsToLog(int start, int count, long totalHits, SearchHit[] searchHits) throws JargonException { - - int skipped = 0; - Log log = new Log(); - // load properties for some log entries - PropertiesLoader props = new PropertiesLoader(); - - // go through search hits and populate log entries - if (count > searchHits.length) count = searchHits.length; - for (int c = 0; c < count; c++) { - LogEntry logEntry = new LogEntry(); - // DataONE's Mark Servilla said this entry id should be an object id. - // now set below, near setIdentifier - //logEntry.setEntryId(String.valueOf(start++)); - - Map hit = searchHits[c].sourceAsMap(); - // If this is not a databook event that we recognize, just skip this record - String eventTitle = (String)hit.get("title"); - if ( EventsEnum.valueOfFromDatabook(eventTitle) == EventsEnum.FAILED) { - skipped++; - logger.info("Unrecognized event '{}' when parsing databook events - event skipped", eventTitle); - continue; - } - - Event event = EventsEnum.valueOfFromDatabook((String)hit.get("title")).getDataoneEvent(); - logEntry.setEvent(event); - Date createdDate = new Date((Long)hit.get("created")); - logEntry.setDateLogged(createdDate); - - ArrayList linkingDataEntity = (ArrayList)hit.get("linkingDataEntity"); - Map linkingDataEntity0 = (Map)linkingDataEntity.get(0); - Map dataEntity = (Map)linkingDataEntity0.get("dataEntity"); - - String objectUri = new String((String)dataEntity.get("uri")); - int end = objectUri.indexOf('@'); - String objectPath = objectUri.substring(0, end); - - // check to make sure we can find this data object - // if not just abandon this log entry - String objectId = null; - try { - objectId = getDataObjectEntryId(objectPath); - } catch (FileNotFoundException fnf) { - skipped++; - logger.info("Cannot find dataObject id for : {} - may have been removed - event skipped", objectPath); - continue; - } - - logger.info("found data object id: {}",objectId); - logEntry.setEntryId(objectId); - - // check to make sure we can find this data object in handle server - // if not just abandon this log entry - Identifier identifier = getDataObjectIdentifier(objectPath); - logEntry.setIdentifier(identifier); - NodeReference nodeReference = new NodeReference(); - String nodeIdentifierProp = props.getProperty("irods.dataone.identifier"); - if (nodeIdentifierProp != null) { - nodeReference.setValue(nodeIdentifierProp); - logEntry.setNodeIdentifier(nodeReference); - } - - // ipAddress? not included in elastic search response - - // userAgent not set - - Subject subject = new Subject(); - String subjectString = new String(); - subjectString += props.getProperty("irods.dataone.subject-string"); - subject.setValue(subjectString); - logEntry.setSubject(subject); - - logger.info("adding new log entry: {}", logEntry.getEntryId()); - logger.info(" date logged: {}", logEntry.getDateLogged()); - logger.info(" event: {}", logEntry.getEvent()); - logger.info(" object identifier: {}", logEntry.getIdentifier().getValue()); - logger.info(" node identifier: {}", logEntry.getNodeIdentifier().getValue()); - logger.info(" subject: {}", logEntry.getSubject().getValue()); - log.addLogEntry(logEntry); - } - - // finally - set header values - int total = 0; - log.setStart(start); - log.setCount(searchHits.length - skipped); - if ( totalHits > (long)Integer.MAX_VALUE ) { - total = Integer.MAX_VALUE - skipped; - } - else { - total = (int)totalHits - skipped; - } - log.setTotal(total); - - return log; - } - - - private String getDataOneDataObjectsRegex() throws JargonException { - StringBuilder regexBuilder = new StringBuilder(); - - UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl(restConfiguration, irodsAccessObjectFactory); - List uids = handleImpl.getListOfDataoneExposedIdentifiers(); - - for (Identifier uid : uids) { - DataObject dataObject = handleImpl.getDataObjectFromIdentifier(uid); - if (dataObject != null) { - if (regexBuilder.length() > 0) { - regexBuilder.append("|"); - } - regexBuilder.append("\""); - regexBuilder.append(dataObject.getAbsolutePath()); - regexBuilder.append("\".*"); - } - else { - logger.warn("iRODS data object with uid: {} not found " + - "- expecting that this is a DataOne exposed object"); - } - logger.info("regex={}", regexBuilder.toString()); - } - - return regexBuilder.toString(); - } - - - // execute rule to add event to databook event log - // sendAccess("synch_failure", user name, data object uri, object type, timestamp in seconds, short description); - @Override - public void recordEvent(Event event, Identifier id, String description) - throws InvalidArgumentException, JargonException, ServiceFailure { - - // check for valid input parameters - if (event == null) { - throw new InvalidArgumentException("invalid Event parameter"); - } - if (id == null) { - throw new InvalidArgumentException("invalid data object identifier"); - } - - EventsEnum e = EventsEnum.valueOfFromDataOne(event); - String databookEvent = e.getDatabookEvent(); - //Long timeNow = new Long(java.lang.System.currentTimeMillis()/1000); - Long timeNow = new Long(java.lang.System.currentTimeMillis()); - String timeNowStr = timeNow.toString(); - - UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl(restConfiguration, irodsAccessObjectFactory); - DataObject dataObject = handleImpl.getDataObjectFromIdentifier(id); - // going to use dataObject path for description - as suggested by Hao 5/1/15 - // this is required in order to be able to query event logs by path later - String pathDescription = dataObject.getAbsolutePath(); - int dataObjectId = dataObject.getId(); - String dataObjIdStr = new Integer(dataObjectId).toString(); -// long dataObjectId = handleImpl.getDataObjectIdFromDataOneIdentifier(id); -// String dataObjIdStr = new Long(dataObjectId).toString(); - - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(this.restConfiguration); - RuleProcessingAO ruleProcessingAO = irodsAccessObjectFactory - .getRuleProcessingAO(irodsAccount); - IRODSFile irodsFile = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount).instanceIRODSFile(pathDescription); - Long createTime = new Long(irodsFile.lastModified()); - String createTimeStr = createTime.toString(); - - StringBuilder sb = new StringBuilder(); - sb.append("addEventRule {\n"); - sb.append(" sendAccess(\""); - sb.append(databookEvent); - sb.append("\", \""); - sb.append(SUBJECT_USER); - sb.append("\", \""); - sb.append(pathDescription); - sb.append("@"); - sb.append(createTimeStr); - sb.append("\", \""); - sb.append("DataObject"); - sb.append("\", \""); - sb.append(timeNowStr); - - if (description != null) { - sb.append("\", \""); - sb.append(description); - } - sb.append("\");\n}\n"); - sb.append("OUTPUT ruleExecOut"); - String ruleString = sb.toString(); - - IRODSRuleExecResult result = ruleProcessingAO.executeRule(ruleString); - } - - private String getDataObjectEntryId(String dataObjectPath) throws JargonException { - String dataObjectId = null; - - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(restConfiguration); - - CollectionAndDataObjectListAndSearchAO collectionAndDataObjectListAndSearchAO = - irodsAccessObjectFactory.getCollectionAndDataObjectListAndSearchAO(irodsAccount); - logger.info("getting object records associated with path: {}", dataObjectPath); - ObjStat objStat = collectionAndDataObjectListAndSearchAO - .retrieveObjectStatForPath(dataObjectPath); - int id = objStat.getDataId(); - dataObjectId = String.valueOf(id); - - return dataObjectId; - } - - private Identifier getDataObjectIdentifier(String dataObjectPath) throws JargonException { - - Identifier identifier = null; - - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(restConfiguration); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - UniqueIdAOHandleImpl uniqueIdAOHandleImpl = new UniqueIdAOHandleImpl(restConfiguration, - irodsAccessObjectFactory); - identifier = uniqueIdAOHandleImpl.getIdentifierFromDataObject(dataObjectAO.findByAbsolutePath(dataObjectPath)); - - return identifier; - } - -} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java index 2cb4691..29d7867 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java @@ -1,120 +1,120 @@ package org.irods.jargon.dataone.tier1; -import org.dataone.service.exceptions.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.dataone.service.exceptions.InsufficientResources; +import org.dataone.service.exceptions.InvalidRequest; +import org.dataone.service.exceptions.InvalidToken; +import org.dataone.service.exceptions.NotAuthorized; +import org.dataone.service.exceptions.NotImplemented; +import org.dataone.service.exceptions.ServiceFailure; import org.dataone.service.mn.tier1.v1.MNCore; import org.dataone.service.types.v1.Event; import org.dataone.service.types.v1.Log; import org.dataone.service.types.v1.Node; +import org.dataone.service.types.v1.NodeState; import org.dataone.service.types.v1.Ping; import org.dataone.service.types.v1.Session; import org.dataone.service.types.v1.Subject; import org.dataone.service.types.v1.Synchronization; -import org.dataone.service.types.v1.NodeState; -import org.elasticsearch.client.transport.NoNodeAvailableException; import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.pub.EnvironmentalInfoAO; import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.dataone.auth.RestAuthUtils; import org.irods.jargon.dataone.configuration.RestConfiguration; -import org.irods.jargon.dataone.events.EventLogAOElasticSearchImpl; import org.irods.jargon.dataone.events.EventsEnum; import org.irods.jargon.dataone.utils.PropertiesLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - - public class MNCoreImpl implements MNCore { - + private Logger log = LoggerFactory.getLogger(this.getClass()); private final IRODSAccessObjectFactory irodsAccessObjectFactory; private final RestConfiguration restConfiguration; -// private final MNCoreModel mnCoreModel; - - public MNCoreImpl( - IRODSAccessObjectFactory irodsAccessObjectFactory, - RestConfiguration restConfiguration) { - - this.irodsAccessObjectFactory = irodsAccessObjectFactory; - this.restConfiguration = restConfiguration; -// this.mnCoreModel = new MNCoreModel(irodsAccessObjectFactory, restConfiguration); - } - - @Override - public Date ping() throws NotImplemented, ServiceFailure, InsufficientResources { - - try { + + // private final MNCoreModel mnCoreModel; + + public MNCoreImpl(IRODSAccessObjectFactory irodsAccessObjectFactory, + RestConfiguration restConfiguration) { + + this.irodsAccessObjectFactory = irodsAccessObjectFactory; + this.restConfiguration = restConfiguration; + // this.mnCoreModel = new MNCoreModel(irodsAccessObjectFactory, + // restConfiguration); + } + + @Override + public Date ping() throws NotImplemented, ServiceFailure, + InsufficientResources { + + try { IRODSAccount irodsAccount = RestAuthUtils .getIRODSAccountFromBasicAuthValues(restConfiguration); - + EnvironmentalInfoAO environmentalInfoAO = irodsAccessObjectFactory .getEnvironmentalInfoAO(irodsAccount); - + long currentTime = environmentalInfoAO.getIRODSServerCurrentTime(); return new Date(currentTime); - + } catch (Exception e) { log.error("ping failed: {}", e.getMessage()); throw new ServiceFailure("2042", "failed to contact iRODS server"); } finally { irodsAccessObjectFactory.closeSessionAndEatExceptions(); } - } - - @Override - public Log getLogRecords( - Date fromDate, - Date toDate, - Event event, - String pidFilter, - Integer startIdx, - Integer count) - throws InvalidRequest, - InvalidToken, - NotAuthorized, - NotImplemented, - ServiceFailure { - - Log d1log = new Log(); - EventsEnum newEvent = null; - - log.info("getLogRecords: elasticsearch implementation"); - if (event != null) { - newEvent = EventsEnum.valueOfFromDataOne(event); - } - - EventLogAOElasticSearchImpl eventLogAO = - new EventLogAOElasticSearchImpl(irodsAccessObjectFactory, restConfiguration); - try { - d1log = eventLogAO.getLogs(fromDate, toDate, newEvent, pidFilter, startIdx, count); - } catch(NoNodeAvailableException ex) { - throw new ServiceFailure("1490", "retrieval of log records failed"); - } - - return d1log; - } - - @Override - public Node getCapabilities() throws NotImplemented, ServiceFailure { - - Node node = new Node(); - - Ping ping = new Ping(); - ping.setSuccess(true); - node.setState(NodeState.UP); - - try { + } + + @Override + public Log getLogRecords(Date fromDate, Date toDate, Event event, + String pidFilter, Integer startIdx, Integer count) + throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, + ServiceFailure { + + Log d1log = new Log(); + EventsEnum newEvent = null; + + log.info("getLogRecords: elasticsearch implementation"); + if (event != null) { + newEvent = EventsEnum.valueOfFromDataOne(event); + } + + // FIXME: add log stuff + + /* + * + * EventLogAOElasticSearchImpl eventLogAO = new + * EventLogAOElasticSearchImpl(irodsAccessObjectFactory, + * restConfiguration); try { d1log = eventLogAO.getLogs(fromDate, + * toDate, newEvent, pidFilter, startIdx, count); } + * catch(NoNodeAvailableException ex) { throw new ServiceFailure("1490", + * "retrieval of log records failed"); } + */ + return d1log; + } + + @Override + public Node getCapabilities() throws NotImplemented, ServiceFailure { + + Node node = new Node(); + + Ping ping = new Ping(); + ping.setSuccess(true); + node.setState(NodeState.UP); + + try { IRODSAccount irodsAccount = RestAuthUtils .getIRODSAccountFromBasicAuthValues(restConfiguration); - + EnvironmentalInfoAO environmentalInfoAO = irodsAccessObjectFactory .getEnvironmentalInfoAO(irodsAccount); - - long bootTime = environmentalInfoAO.getIRODSServerProperties().getServerBootTime(); - + + long bootTime = environmentalInfoAO.getIRODSServerProperties() + .getServerBootTime(); + } catch (Exception e) { log.error("getCapabilities: iRODS server is not running"); ping.setSuccess(false); @@ -122,54 +122,47 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { } finally { irodsAccessObjectFactory.closeSessionAndEatExceptions(); } - - // get properties - PropertiesLoader pl = new PropertiesLoader(); - String subjectString = new String(); - subjectString += pl.getProperty("irods.dataone.subject-string"); - String contactSubjectString = new String(); - contactSubjectString += pl.getProperty("irods.dataone.contact-subject-string"); - - List subjects = new ArrayList(); - Subject subject = new Subject(); - subject.setValue(subjectString); - subjects.add(subject); - List contactSubjects = new ArrayList(); - Subject contactSubject = new Subject(); - contactSubject.setValue(contactSubjectString); - contactSubjects.add(contactSubject); - - node.setPing(ping); - node.setSubjectList(subjects); - node.setContactSubjectList(contactSubjects); - - Synchronization sync = new Synchronization(); - // TODO: put correct dates here - sync.setLastCompleteHarvest(new Date()); - sync.setLastHarvested(new Date()); - node.setSynchronization(sync); - - log.info("returning node: {}", node.toString()); - - return node; - } - - @Override - public Log getLogRecords( - Session session, - Date date1, - Date date2, - Event event, - String s, - Integer integer1, - Integer integer2) - throws InvalidRequest, - InvalidToken, - NotAuthorized, - NotImplemented, - ServiceFailure { - - throw new NotImplemented("1461", "Authenticated getLogRecords not implemented"); - } - + + // get properties + PropertiesLoader pl = new PropertiesLoader(); + String subjectString = new String(); + subjectString += pl.getProperty("irods.dataone.subject-string"); + String contactSubjectString = new String(); + contactSubjectString += pl + .getProperty("irods.dataone.contact-subject-string"); + + List subjects = new ArrayList(); + Subject subject = new Subject(); + subject.setValue(subjectString); + subjects.add(subject); + List contactSubjects = new ArrayList(); + Subject contactSubject = new Subject(); + contactSubject.setValue(contactSubjectString); + contactSubjects.add(contactSubject); + + node.setPing(ping); + node.setSubjectList(subjects); + node.setContactSubjectList(contactSubjects); + + Synchronization sync = new Synchronization(); + // TODO: put correct dates here + sync.setLastCompleteHarvest(new Date()); + sync.setLastHarvested(new Date()); + node.setSynchronization(sync); + + log.info("returning node: {}", node.toString()); + + return node; + } + + @Override + public Log getLogRecords(Session session, Date date1, Date date2, + Event event, String s, Integer integer1, Integer integer2) + throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, + ServiceFailure { + + throw new NotImplemented("1461", + "Authenticated getLogRecords not implemented"); + } + } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index 8f69440..1071234 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -1,7 +1,6 @@ package org.irods.jargon.dataone.tier1; import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -13,7 +12,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.tika.detect.DefaultDetector; -import org.apache.tika.detect.TypeDetector; import org.apache.tika.metadata.Metadata; import org.apache.tika.mime.MediaType; import org.dataone.service.exceptions.InsufficientResources; @@ -25,20 +23,14 @@ import org.dataone.service.exceptions.ServiceFailure; import org.dataone.service.exceptions.SynchronizationFailed; import org.dataone.service.mn.tier1.v1.MNRead; -import org.dataone.service.types.v1.AccessPolicy; -import org.dataone.service.types.v1.AccessRule; import org.dataone.service.types.v1.Checksum; import org.dataone.service.types.v1.DescribeResponse; -import org.dataone.service.types.v1.Event; import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.NodeReference; import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.dataone.service.types.v1.ObjectInfo; import org.dataone.service.types.v1.ObjectList; import org.dataone.service.types.v1.Permission; -import org.dataone.service.types.v1.ReplicationPolicy; import org.dataone.service.types.v1.Session; -import org.dataone.service.types.v1.Subject; import org.dataone.service.types.v1.SystemMetadata; import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.FileNotFoundException; @@ -53,45 +45,39 @@ //import org.irods.jargon.dataprofile.DataProfile; //import org.irods.jargon.core.pub.Stream2StreamAO; import org.irods.jargon.core.pub.domain.DataObject; +import org.irods.jargon.core.pub.domain.UserFilePermission; import org.irods.jargon.core.pub.io.IRODSFile; import org.irods.jargon.core.pub.io.IRODSFileInputStream; import org.irods.jargon.dataone.auth.RestAuthUtils; import org.irods.jargon.dataone.configuration.RestConfiguration; import org.irods.jargon.dataone.domain.MNPermissionEnum; -import org.irods.jargon.dataone.events.EventLogAOElasticSearchImpl; import org.irods.jargon.dataone.id.DataObjectListResponse; -import org.irods.jargon.dataone.id.UniqueIdAOHandleImpl; -import org.irods.jargon.dataone.id.UniqueIdAOHandleInMetadataImpl; import org.irods.jargon.dataone.utils.DataObjectMetadataUtils; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.dataone.utils.PropertiesLoader; -import org.irods.jargon.core.pub.domain.UserFilePermission; -import org.irods.jargon.core.query.JargonQueryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - public class MNReadImpl implements MNRead { - + private Logger log = LoggerFactory.getLogger(this.getClass()); - + private final IRODSAccessObjectFactory irodsAccessObjectFactory; private final RestConfiguration restConfiguration; - + private PropertiesLoader properties = new PropertiesLoader(); - - public MNReadImpl( - IRODSAccessObjectFactory irodsAccessObjectFactory, - RestConfiguration restConfiguration) { - - this.irodsAccessObjectFactory = irodsAccessObjectFactory; - this.restConfiguration = restConfiguration; - } + + public MNReadImpl(IRODSAccessObjectFactory irodsAccessObjectFactory, + RestConfiguration restConfiguration) { + + this.irodsAccessObjectFactory = irodsAccessObjectFactory; + this.restConfiguration = restConfiguration; + } @Override public DescribeResponse describe(Identifier id) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { - + if (id == null || id.getValue().isEmpty()) { log.error("id is null or empty"); throw new NotFound("1402", "invalid iRODS data object id"); @@ -103,64 +89,79 @@ public DescribeResponse describe(Identifier id) throws InvalidToken, BigInteger contentLength; Date lastModified; BigInteger serialVersion; - + try { - // need last modified, content length, Content-Type: application/octet-stream, object format (mime), checksum, serial version - UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl(restConfiguration, irodsAccessObjectFactory); - dataObject = handleImpl.getDataObjectFromIdentifier(id); + + // FIXME: add handle factory and lookup + + // need last modified, content length, Content-Type: + // application/octet-stream, object format (mime), checksum, serial + // version + // UniqueIdAOHandleImpl handleImpl = new + // UniqueIdAOHandleImpl(restConfiguration, + // irodsAccessObjectFactory); + // dataObject = handleImpl.getDataObjectFromIdentifier(id); } catch (Exception e) { log.info("cannot find id: {}", id.getValue()); - throw new NotFound("1380", "The specified object does not exist on this node."); + throw new NotFound("1380", + "The specified object does not exist on this node."); } - + try { Long contentLengthLong = dataObject.getDataSize(); String contentLengthStr = contentLengthLong.toString(); - contentLength = new BigInteger(contentLengthStr); - + contentLength = new BigInteger(contentLengthStr); + IRODSAccount irodsAccount = RestAuthUtils .getIRODSAccountFromBasicAuthValues(restConfiguration); - //lastModified = dataObject.getUpdatedAt(); - lastModified = DataObjectMetadataUtils.getStartDateTime(irodsAccessObjectFactory, irodsAccount, dataObject); + // lastModified = dataObject.getUpdatedAt(); + lastModified = DataObjectMetadataUtils.getStartDateTime( + irodsAccessObjectFactory, irodsAccount, dataObject); - String format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, irodsAccessObjectFactory, dataObject); + String format = DataTypeUtils.getDataObjectFormatFromMetadata( + irodsAccount, irodsAccessObjectFactory, dataObject); // use back up if no format stores in dataObject AVU - if (format == null ) { + if (format == null) { format = getDataObjectMimeType(irodsAccount, dataObject); } formatIdentifier.setValue(format); String csum = dataObject.getChecksum(); if (csum == null) { - log.info("checksum does not exist for file: {}", dataObject.getAbsolutePath()); - //throw new NotFound("404", "1420"); - } - else { + log.info("checksum does not exist for file: {}", + dataObject.getAbsolutePath()); + // throw new NotFound("404", "1420"); + } else { checksum.setValue(csum); - checksum.setAlgorithm(properties.getProperty("irods.dataone.chksum-algorithm")); + checksum.setAlgorithm(properties + .getProperty("irods.dataone.chksum-algorithm")); } serialVersion = getSerialVersion(); } catch (Exception e) { - log.error("Cannot access iRODS object: {}", dataObject.getAbsolutePath()); + log.error("Cannot access iRODS object: {}", + dataObject.getAbsolutePath()); throw new ServiceFailure("1390", e.getMessage()); - } finally { + } finally { irodsAccessObjectFactory.closeSessionAndEatExceptions(); - } - return new DescribeResponse(formatIdentifier, contentLength, lastModified, checksum, serialVersion); + } + return new DescribeResponse(formatIdentifier, contentLength, + lastModified, checksum, serialVersion); } @Override public DescribeResponse describe(Session arg0, Identifier arg1) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { - throw new NotImplemented("1361", "this service has not been implemented"); + throw new NotImplemented("1361", + "this service has not been implemented"); } - - public void streamObject(HttpServletResponse response, Identifier id) throws ServiceFailure, NotFound { - + + public void streamObject(HttpServletResponse response, Identifier id) + throws ServiceFailure, NotFound { + IRODSFileInputStream stream = null; OutputStream output = null; int contentLength = 0; @@ -168,110 +169,112 @@ public void streamObject(HttpServletResponse response, Identifier id) throws Ser DataObject dataObject = new DataObject(); IRODSAccount irodsAccount; IRODSFile irodsFile; - + // first try and find data object for this id try { irodsAccount = RestAuthUtils .getIRODSAccountFromBasicAuthValues(restConfiguration); - - UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl(restConfiguration, irodsAccessObjectFactory); - dataObject = handleImpl.getDataObjectFromIdentifier(id); - path = dataObject.getAbsolutePath(); - irodsFile = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount).instanceIRODSFile(path); - - if (!irodsFile.exists()) { - log.info("file does not exist"); - throw new NotFound("1020", "No data object could be found for given PID:" + id.getValue()); - } - } catch(Exception ex) { + + // FIXME: add handle factory and lookup + + /* + * UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl( + * restConfiguration, irodsAccessObjectFactory); dataObject = + * handleImpl.getDataObjectFromIdentifier(id); path = + * dataObject.getAbsolutePath(); irodsFile = + * irodsAccessObjectFactory.getIRODSFileFactory( + * irodsAccount).instanceIRODSFile(path); + * + * if (!irodsFile.exists()) { log.info("file does not exist"); throw + * new NotFound("1020", + * "No data object could be found for given PID:" + id.getValue()); + * } + */ + } catch (Exception ex) { log.info("file does not exist"); - throw new NotFound("1020", "No data object could be found for given PID:" + id.getValue()); + throw new NotFound("1020", + "No data object could be found for given PID:" + + id.getValue()); } - - // now try and stream it - try { - stream = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount) - .instanceIRODSFileInputStream(irodsFile); - // TODO: need to catch and return appropriate exceptions here for no permission - - - contentLength = (int) irodsFile.length(); - log.info("contentLength={}", contentLength); - - response.setContentType("application/octet-stream"); - response.setHeader("Content-Disposition","attachment;filename=" + dataObject.getDataName()); - response.setContentLength(contentLength); - //response.addHeader("Vary", "Accept-Encoding"); - log.info("reponse: {}", response.toString()); - - output = new BufferedOutputStream(response.getOutputStream()); - -// Stream2StreamAO stream2StreamAO = getIrodsAccessObjectFactory() -// .getStream2StreamAO(irodsAccount); -// stream2StreamAO.streamToStreamCopyUsingStandardIO(input, output); - - int readBytes = 0; - byte [] buffer = new byte [4096]; - - while ((readBytes = stream.read (buffer,0,4096)) != -1) { - //log.info("readBytes={}", readBytes); - output.write (buffer,0,readBytes); - } - output.flush(); - if(stream != null) - stream.close(); - if(output != null) - output.close(); - - } catch (Exception e) { - log.error("Cannot stream iRODS object: {}", path); - throw new ServiceFailure("1030", "unable to stream iRODS data object"); - } finally { - irodsAccessObjectFactory.closeSessionAndEatExceptions(); - } + /* + * + * // now try and stream it try { + * + * stream = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount) + * .instanceIRODSFileInputStream(irodsFile); // TODO: need to catch and + * return appropriate exceptions here for no // permission + * + * contentLength = (int) irodsFile.length(); + * log.info("contentLength={}", contentLength); + * + * response.setContentType("application/octet-stream"); + * response.setHeader("Content-Disposition", "attachment;filename=" + + * dataObject.getDataName()); response.setContentLength(contentLength); + * // response.addHeader("Vary", "Accept-Encoding"); + * log.info("reponse: {}", response.toString()); + * + * output = new BufferedOutputStream(response.getOutputStream()); + * + * // Stream2StreamAO stream2StreamAO = getIrodsAccessObjectFactory() // + * .getStream2StreamAO(irodsAccount); // + * stream2StreamAO.streamToStreamCopyUsingStandardIO(input, output); + * + * int readBytes = 0; byte[] buffer = new byte[4096]; + * + * while ((readBytes = stream.read(buffer, 0, 4096)) != -1) { // + * log.info("readBytes={}", readBytes); output.write(buffer, 0, + * readBytes); } output.flush(); if (stream != null) stream.close(); if + * (output != null) output.close(); + * + * } catch (Exception e) { log.error("Cannot stream iRODS object: {}", + * path); throw new ServiceFailure("1030", + * "unable to stream iRODS data object"); } finally { + * irodsAccessObjectFactory.closeSessionAndEatExceptions(); } + */ + } @Override - public IRODSFileInputStream get(Identifier id) throws InvalidToken, NotAuthorized, - NotImplemented, ServiceFailure, NotFound, InsufficientResources { - - // TODO: Not sure how to implement this properly - used streamObject method instead + public IRODSFileInputStream get(Identifier id) throws InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure, NotFound, + InsufficientResources { + + // TODO: Not sure how to implement this properly - used streamObject + // method instead IRODSFileInputStream stream = null; -// if (id == null || id.toString().isEmpty()) { -// throw new NotFound("invalid", "identifier is invalid"); -// } - -// String path = "/dfcmain/home/DFC-public/DFC-slide.pptx"; -// String path = "/dfcmain/home/lisa/test_this.txt"; - - -// log.info("decoded path:{}", path); -// -// try { -// IRODSAccount irodsAccount = RestAuthUtils -// .getIRODSAccountFromBasicAuthValues(restConfiguration); -// IRODSFile irodsFile = irodsAccessObjectFactory -// .getIRODSFileFactory(irodsAccount).instanceIRODSFile(path); -// -// if (!irodsFile.exists()) { -// log.info("file does not exist"); -// throw new NotFound("404", "The iRODS member node can't find object requested - "+id.toString()); -// } -// -// stream = irodsAccessObjectFactory -// .getIRODSFileFactory(irodsAccount) -// .instanceIRODSFileInputStream(irodsFile); -// -// } catch (Exception e) { -// throw new ServiceFailure(e.getMessage(), e.toString()); -// } finally { -// irodsAccessObjectFactory.closeSessionAndEatExceptions(); -// -// } + // if (id == null || id.toString().isEmpty()) { + // throw new NotFound("invalid", "identifier is invalid"); + // } + + // String path = "/dfcmain/home/DFC-public/DFC-slide.pptx"; + // String path = "/dfcmain/home/lisa/test_this.txt"; + + // log.info("decoded path:{}", path); + // + // try { + // IRODSAccount irodsAccount = RestAuthUtils + // .getIRODSAccountFromBasicAuthValues(restConfiguration); + // IRODSFile irodsFile = irodsAccessObjectFactory + // .getIRODSFileFactory(irodsAccount).instanceIRODSFile(path); + // + // if (!irodsFile.exists()) { + // log.info("file does not exist"); + // throw new NotFound("404", + // "The iRODS member node can't find object requested - "+id.toString()); + // } + // + // stream = irodsAccessObjectFactory + // .getIRODSFileFactory(irodsAccount) + // .instanceIRODSFileInputStream(irodsFile); + // + // } catch (Exception e) { + // throw new ServiceFailure(e.getMessage(), e.toString()); + // } finally { + // irodsAccessObjectFactory.closeSessionAndEatExceptions(); + // + // } return stream; } @@ -280,46 +283,52 @@ public IRODSFileInputStream get(Identifier id) throws InvalidToken, NotAuthorize public InputStream get(Session arg0, Identifier arg1) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound, InsufficientResources { - throw new NotImplemented("1001", "this service has not been implemented"); + throw new NotImplemented("1001", + "this service has not been implemented"); } @Override public Checksum getChecksum(Identifier id, String algorithm) throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { - + if (id == null || id.getValue().isEmpty()) { throw new NotFound("1420", "invalid iRODS data object id"); } - + if (algorithm == null || algorithm.isEmpty()) { throw new NotFound("1420", "invalid checksum algorithm provided"); } DataObject dataObject = new DataObject(); Checksum checksum = new Checksum(); - - try { - - UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl(restConfiguration, irodsAccessObjectFactory); - dataObject = handleImpl.getDataObjectFromIdentifier(id); - String csum = dataObject.getChecksum(); - if (csum == null) { - log.info("checksum does not exist for file: {}", dataObject.getAbsolutePath()); - throw new NotFound("1410", "Checksum does not exist for data object id provided"); - } - checksum.setValue(csum); - checksum.setAlgorithm(properties.getProperty("irods.dataone.chksum-algorithm")); - - } catch (FileNotFoundException nf) { - log.error("Cannot access iRODS object: {}", dataObject.getAbsolutePath()); - throw new NotFound("1410", "No data object could be found for given PID:"); - } catch (JargonException je) { - log.error("cannot access iRODS object: {}", dataObject.getAbsolutePath()); - throw new ServiceFailure("1410", je.getMessage()); - } finally { - irodsAccessObjectFactory.closeSessionAndEatExceptions(); - } + + /* + * try { + * + * // FIXME: need to add handle stuff + * + * + * + * UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl( + * restConfiguration, irodsAccessObjectFactory); dataObject = + * handleImpl.getDataObjectFromIdentifier(id); String csum = + * dataObject.getChecksum(); if (csum == null) { + * log.info("checksum does not exist for file: {}", + * dataObject.getAbsolutePath()); throw new NotFound("1410", + * "Checksum does not exist for data object id provided"); } + * checksum.setValue(csum); checksum.setAlgorithm(properties + * .getProperty("irods.dataone.chksum-algorithm")); + * + * } catch (FileNotFoundException nf) { + * log.error("Cannot access iRODS object: {}", + * dataObject.getAbsolutePath()); throw new NotFound("1410", + * "No data object could be found for given PID:"); } catch + * (JargonException je) { log.error("cannot access iRODS object: {}", + * dataObject.getAbsolutePath()); throw new ServiceFailure("1410", + * je.getMessage()); } finally { + * irodsAccessObjectFactory.closeSessionAndEatExceptions(); } + */ return checksum; } @@ -327,7 +336,8 @@ public Checksum getChecksum(Identifier id, String algorithm) public Checksum getChecksum(Session arg0, Identifier arg1, String arg2) throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { - throw new NotImplemented("1401", "this service has not been implemented"); + throw new NotImplemented("1401", + "this service has not been implemented"); } @Override @@ -342,13 +352,13 @@ public InputStream getReplica(Identifier arg0) throws InvalidToken, public InputStream getReplica(Session arg0, Identifier arg1) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound, InsufficientResources { - throw new NotImplemented("2180", "this service has not been implemented"); + throw new NotImplemented("2180", + "this service has not been implemented"); } @Override - public SystemMetadata getSystemMetadata(Identifier id) - throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, - NotFound { + public SystemMetadata getSystemMetadata(Identifier id) throws InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure, NotFound { if (id == null || id.getValue().isEmpty()) { throw new InvalidToken("1402", "invalid iRODS data object id"); } @@ -357,109 +367,97 @@ public SystemMetadata getSystemMetadata(Identifier id) SystemMetadata metadata = new SystemMetadata(); IRODSAccount irodsAccount; DataObjectAO dataObjectAO; - + // TODO: hardcode version to 1 for now metadata.setSerialVersion(getSerialVersion()); - + Checksum checksum = new Checksum(); - + // first try and find data object for this id - try { - irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(restConfiguration); - - dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl(restConfiguration, irodsAccessObjectFactory); - dataObject = handleImpl.getDataObjectFromIdentifier(id); - } catch(Exception ex) { - log.info("file does not exist"); - throw new NotFound("1060", "No metadata could be found for given PID:" + id.getValue()); - } - - try { - String csum = dataObject.getChecksum(); - if (csum == null) { - log.info("checksum does not exist for file: {}", dataObject.getAbsolutePath()); -// throw new NotFound("404", "1420"); - } - else { - checksum.setValue(csum); - checksum.setAlgorithm(properties.getProperty("irods.dataone.chksum-algorithm")); - } - - String format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, irodsAccessObjectFactory, dataObject); - if (format == null) { - format = getDataObjectMimeType(irodsAccount, dataObject); - } - metadata.setIdentifier(id); - ObjectFormatIdentifier formatId = new ObjectFormatIdentifier(); - formatId.setValue(format); - metadata.setFormatId(formatId); - - Long dataSizeLong = new Long(dataObject.getDataSize()); - String dataSizeStr = dataSizeLong.toString(); - metadata.setSize(new BigInteger(dataSizeStr)); - metadata.setChecksum(checksum); - - String dataOwner = "uid=" + dataObject.getDataOwnerName(); - Subject submitter = new Subject(); - submitter.setValue(dataOwner); - metadata.setSubmitter(submitter); - - Subject rightsHolder = new Subject(); - rightsHolder.setValue(dataOwner); - metadata.setRightsHolder(rightsHolder); - - List permissions = dataObjectAO.listPermissionsForDataObject(dataObject.getAbsolutePath()); - if (permissions != null) { - AccessPolicy accessPolicy = new AccessPolicy(); - for (UserFilePermission permission : permissions) { - AccessRule rule = new AccessRule(); - Subject subject = new Subject(); - - // in DataONE - anonymous translates to public - // TODO: also may need to make translation for "public" to "authenticatedUser" - if (permission.getUserName().equals("anonymous")) { - subject.setValue("public"); - } - else { - subject.setValue("uid=" + permission.getUserName()); - } - rule.addSubject(subject); - List d1Premissions = getD1Permission(permission); - for(Permission d1Premission : d1Premissions) { - rule.addPermission(d1Premission); - } - accessPolicy.addAllow(rule); - } - metadata.setAccessPolicy(accessPolicy); - } - - ReplicationPolicy replicationPolicy = new ReplicationPolicy(); - replicationPolicy.setReplicationAllowed(false); - metadata.setReplicationPolicy(replicationPolicy); - - // Add support for obsoletes or obsoletedBy? - - // Use AVU epoch date - //metadata.setDateUploaded(dataObject.getCreatedAt()); - //metadata.setDateSysMetadataModified(dataObject.getUpdatedAt()); - Date startDate = DataObjectMetadataUtils.getStartDateTime(irodsAccessObjectFactory, irodsAccount, dataObject); - metadata.setDateSysMetadataModified(startDate); - metadata.setDateUploaded(startDate); - - NodeReference nodeReference = new NodeReference(); - nodeReference.setValue(properties.getProperty("irods.dataone.identifier")); - metadata.setOriginMemberNode(nodeReference); - metadata.setAuthoritativeMemberNode(nodeReference); - - } catch (Exception e) { - log.error("Cannot access iRODS object: {}", dataObject.getAbsolutePath()); - throw new ServiceFailure("1090", e.getMessage()); - } finally { - irodsAccessObjectFactory.closeSessionAndEatExceptions(); - } + // FIXME: add handle stuff + + /* + * + * try { irodsAccount = RestAuthUtils + * .getIRODSAccountFromBasicAuthValues(restConfiguration); + * + * dataObjectAO = irodsAccessObjectFactory + * .getDataObjectAO(irodsAccount); UniqueIdAOHandleImpl handleImpl = new + * UniqueIdAOHandleImpl( restConfiguration, irodsAccessObjectFactory); + * dataObject = handleImpl.getDataObjectFromIdentifier(id); + * + * } catch (Exception ex) { log.info("file does not exist"); throw new + * NotFound("1060", "No metadata could be found for given PID:" + + * id.getValue()); } + * + * + * try { String csum = dataObject.getChecksum(); if (csum == null) { + * log.info("checksum does not exist for file: {}", + * dataObject.getAbsolutePath()); // throw new NotFound("404", "1420"); + * } else { checksum.setValue(csum); checksum.setAlgorithm(properties + * .getProperty("irods.dataone.chksum-algorithm")); } + * + * String format = DataTypeUtils.getDataObjectFormatFromMetadata( + * irodsAccount, irodsAccessObjectFactory, dataObject); if (format == + * null) { format = getDataObjectMimeType(irodsAccount, dataObject); } + * metadata.setIdentifier(id); ObjectFormatIdentifier formatId = new + * ObjectFormatIdentifier(); formatId.setValue(format); + * metadata.setFormatId(formatId); + * + * Long dataSizeLong = new Long(dataObject.getDataSize()); String + * dataSizeStr = dataSizeLong.toString(); metadata.setSize(new + * BigInteger(dataSizeStr)); metadata.setChecksum(checksum); + * + * String dataOwner = "uid=" + dataObject.getDataOwnerName(); Subject + * submitter = new Subject(); submitter.setValue(dataOwner); + * metadata.setSubmitter(submitter); + * + * Subject rightsHolder = new Subject(); + * rightsHolder.setValue(dataOwner); + * metadata.setRightsHolder(rightsHolder); + * + * List permissions = dataObjectAO + * .listPermissionsForDataObject(dataObject.getAbsolutePath()); if + * (permissions != null) { AccessPolicy accessPolicy = new + * AccessPolicy(); for (UserFilePermission permission : permissions) { + * AccessRule rule = new AccessRule(); Subject subject = new Subject(); + * + * // in DataONE - anonymous translates to public // TODO: also may need + * to make translation for "public" to // "authenticatedUser" if + * (permission.getUserName().equals("anonymous")) { + * subject.setValue("public"); } else { subject.setValue("uid=" + + * permission.getUserName()); } rule.addSubject(subject); + * List d1Premissions = getD1Permission(permission); for + * (Permission d1Premission : d1Premissions) { + * rule.addPermission(d1Premission); } accessPolicy.addAllow(rule); } + * metadata.setAccessPolicy(accessPolicy); } + * + * ReplicationPolicy replicationPolicy = new ReplicationPolicy(); + * replicationPolicy.setReplicationAllowed(false); + * metadata.setReplicationPolicy(replicationPolicy); + * + * // Add support for obsoletes or obsoletedBy? + * + * // Use AVU epoch date // + * metadata.setDateUploaded(dataObject.getCreatedAt()); // + * metadata.setDateSysMetadataModified(dataObject.getUpdatedAt()); Date + * startDate = DataObjectMetadataUtils.getStartDateTime( + * irodsAccessObjectFactory, irodsAccount, dataObject); + * metadata.setDateSysMetadataModified(startDate); + * metadata.setDateUploaded(startDate); + * + * NodeReference nodeReference = new NodeReference(); + * nodeReference.setValue(properties + * .getProperty("irods.dataone.identifier")); + * metadata.setOriginMemberNode(nodeReference); + * metadata.setAuthoritativeMemberNode(nodeReference); + * + * } catch (Exception e) { log.error("Cannot access iRODS object: {}", + * dataObject.getAbsolutePath()); throw new ServiceFailure("1090", + * e.getMessage()); } finally { + * irodsAccessObjectFactory.closeSessionAndEatExceptions(); } + */ return metadata; } @@ -467,112 +465,97 @@ public SystemMetadata getSystemMetadata(Identifier id) public SystemMetadata getSystemMetadata(Session arg0, Identifier arg1) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { - throw new NotImplemented("1041", "this service has not been implemented"); + throw new NotImplemented("1041", + "this service has not been implemented"); } @Override - public ObjectList listObjects( - Date fromDate, - Date toDate, - ObjectFormatIdentifier formatId, - Boolean replicaStatus, - Integer start, - Integer count) throws - InvalidRequest, - InvalidToken, - NotAuthorized, - NotImplemented, - ServiceFailure { + public ObjectList listObjects(Date fromDate, Date toDate, + ObjectFormatIdentifier formatId, Boolean replicaStatus, + Integer start, Integer count) throws InvalidRequest, InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure { DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); List dataObjectList = new ArrayList(); List objectInfoList = new ArrayList(); ObjectList objectList = new ObjectList(); - //UniqueIdAOHandleImpl handleImpl; - UniqueIdAOHandleInMetadataImpl handleImpl; - - try { - //handleImpl = new UniqueIdAOHandleImpl(restConfiguration, irodsAccessObjectFactory); - handleImpl = new UniqueIdAOHandleInMetadataImpl(restConfiguration, irodsAccessObjectFactory); - - //dataObjectListResponse = handleImpl.getListOfDataoneExposedDataObjects( - dataObjectListResponse = handleImpl.getListOfDataoneExposedDataObjects( - fromDate, - toDate, - formatId, - replicaStatus, - start, - count); - } catch(Exception ex) { - log.info("{}", ex.toString()); - throw new ServiceFailure("1580", "Could not retrieve list of data objects"); - } - - dataObjectList = dataObjectListResponse.getDataObjects(); - - for (DataObject dObject : dataObjectList) { - - ObjectInfo oInfo = new ObjectInfo(); - - if (dObject.getChecksum() != null) { - Checksum checksum = new Checksum(); - checksum.setValue(dObject.getChecksum()); - checksum.setAlgorithm(properties.getProperty("irods.dataone.chksum-algorithm")); - oInfo.setChecksum(checksum); - } - - // probably should combine query for format and start date at some future refactor - IRODSAccount irodsAccount = null;; - String format = null; - try { - irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(restConfiguration); - format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, irodsAccessObjectFactory, dObject); - // use back up if no format stores in dataObject AVU - if (format == null) { - format = getDataObjectMimeType(irodsAccount, dObject); - } - } catch (Exception e1) { - log.error(e1.toString()); - log.error("cannot retrieve mime type for object:{} setting to application/octet-stream", - dObject.getAbsolutePath()); - format = "application/octet-stream"; - } - ObjectFormatIdentifier fId = new ObjectFormatIdentifier(); - fId.setValue(format); - oInfo.setFormatId(fId); - - //oInfo.setDateSysMetadataModified(dObject.getUpdatedAt()); - Date startDate = new Date(); - try { - startDate = DataObjectMetadataUtils.getStartDateTime(irodsAccessObjectFactory, irodsAccount, dObject); - } catch (Exception e1) { - log.error(e1.toString()); - log.error("cannot retrieve start date for object: {}", dObject.getAbsolutePath()); - } - oInfo.setDateSysMetadataModified(startDate); - - Identifier id; - try { - id = handleImpl.getIdentifierFromDataObject(dObject); - } catch (JargonException e) { - log.error("could not convert data object id to identifier: {}", e.toString()); - throw new ServiceFailure("1580", "Could not retrieve list of data objects"); - } - oInfo.setIdentifier(id); - - Long dataSizeLong = new Long(dObject.getDataSize()); - String dataSizeStr = dataSizeLong.toString(); - oInfo.setSize(new BigInteger(dataSizeStr)); - - objectInfoList.add(oInfo); - } + // UniqueIdAOHandleImpl handleImpl; + + // FIXME: handle stuff + + /* + * + * UniqueIdAOHandleInMetadataImpl handleImpl; + * + * try { // handleImpl = new UniqueIdAOHandleImpl(restConfiguration, // + * irodsAccessObjectFactory); handleImpl = new + * UniqueIdAOHandleInMetadataImpl(restConfiguration, + * irodsAccessObjectFactory); + * + * // dataObjectListResponse = // + * handleImpl.getListOfDataoneExposedDataObjects( dataObjectListResponse + * = handleImpl .getListOfDataoneExposedDataObjects(fromDate, toDate, + * formatId, replicaStatus, start, count); } catch (Exception ex) { + * log.info("{}", ex.toString()); throw new ServiceFailure("1580", + * "Could not retrieve list of data objects"); } + * + * dataObjectList = dataObjectListResponse.getDataObjects(); + * + * for (DataObject dObject : dataObjectList) { + * + * ObjectInfo oInfo = new ObjectInfo(); + * + * if (dObject.getChecksum() != null) { Checksum checksum = new + * Checksum(); checksum.setValue(dObject.getChecksum()); + * checksum.setAlgorithm(properties + * .getProperty("irods.dataone.chksum-algorithm")); + * oInfo.setChecksum(checksum); } + * + * // probably should combine query for format and start date at some // + * future refactor IRODSAccount irodsAccount = null; ; String format = + * null; try { irodsAccount = RestAuthUtils + * .getIRODSAccountFromBasicAuthValues(restConfiguration); format = + * DataTypeUtils.getDataObjectFormatFromMetadata( irodsAccount, + * irodsAccessObjectFactory, dObject); // use back up if no format + * stores in dataObject AVU if (format == null) { format = + * getDataObjectMimeType(irodsAccount, dObject); } } catch (Exception + * e1) { log.error(e1.toString()); log.error( + * "cannot retrieve mime type for object:{} setting to application/octet-stream" + * , dObject.getAbsolutePath()); format = "application/octet-stream"; } + * ObjectFormatIdentifier fId = new ObjectFormatIdentifier(); + * fId.setValue(format); oInfo.setFormatId(fId); + * + * // oInfo.setDateSysMetadataModified(dObject.getUpdatedAt()); Date + * startDate = new Date(); try { startDate = + * DataObjectMetadataUtils.getStartDateTime( irodsAccessObjectFactory, + * irodsAccount, dObject); } catch (Exception e1) { + * log.error(e1.toString()); + * log.error("cannot retrieve start date for object: {}", + * dObject.getAbsolutePath()); } + * oInfo.setDateSysMetadataModified(startDate); + * + * Identifier id; try { id = + * handleImpl.getIdentifierFromDataObject(dObject); } catch + * (JargonException e) { + * log.error("could not convert data object id to identifier: {}", + * e.toString()); throw new ServiceFailure("1580", + * "Could not retrieve list of data objects"); } + * oInfo.setIdentifier(id); + * + * Long dataSizeLong = new Long(dObject.getDataSize()); String + * dataSizeStr = dataSizeLong.toString(); oInfo.setSize(new + * BigInteger(dataSizeStr)); + * + * objectInfoList.add(oInfo); } + * + * objectList.setObjectInfoList(objectInfoList); + * objectList.setTotal(dataObjectListResponse.getTotal()); + * objectList.setCount(objectInfoList.size()); + * objectList.setStart(start); + * + * return objectList; + */ - objectList.setObjectInfoList(objectInfoList); - objectList.setTotal(dataObjectListResponse.getTotal()); - objectList.setCount(objectInfoList.size()); - objectList.setStart(start); - - return objectList; + return null; } @Override @@ -580,41 +563,42 @@ public ObjectList listObjects(Session arg0, Date arg1, Date arg2, ObjectFormatIdentifier arg3, Boolean arg4, Integer arg5, Integer arg6) throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { - throw new NotImplemented("1521", "this service has not been implemented"); + throw new NotImplemented("1521", + "this service has not been implemented"); } @Override public boolean synchronizationFailed(SynchronizationFailed syncFailed) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { - - Identifier pid = null; - - if (syncFailed.getPid() != null) { - pid = new Identifier(); - pid.setValue(syncFailed.getPid()); - } - else { - throw new ServiceFailure("2161", "The identifier cannot be null."); - } - - // check to make sure pid is valid - try { - UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl(restConfiguration, irodsAccessObjectFactory); - // just try to access the object to see if is there or not - handleImpl.getDataObjectFromIdentifier(pid); - } catch(Exception ex) { - throw new ServiceFailure("2161", "The identifier specified by " + - syncFailed.getPid() + " was not found on this node."); - } - - EventLogAOElasticSearchImpl eventLog = new EventLogAOElasticSearchImpl(irodsAccessObjectFactory, restConfiguration); - try { - eventLog.recordEvent(Event.SYNCHRONIZATION_FAILED, pid, syncFailed.getDescription()); - } catch (Exception e) { - log.error("failed to log synchronization failed event: {}", e.toString()); - throw new ServiceFailure("2161", "Failed to log Synchronization Failure event"); - } - + + // FIXME: fix handle stuff + + /* + * + * Identifier pid = null; + * + * if (syncFailed.getPid() != null) { pid = new Identifier(); + * pid.setValue(syncFailed.getPid()); } else { throw new + * ServiceFailure("2161", "The identifier cannot be null."); } + * + * // check to make sure pid is valid try { UniqueIdAOHandleImpl + * handleImpl = new UniqueIdAOHandleImpl( restConfiguration, + * irodsAccessObjectFactory); // just try to access the object to see if + * is there or not handleImpl.getDataObjectFromIdentifier(pid); } catch + * (Exception ex) { throw new ServiceFailure("2161", + * "The identifier specified by " + syncFailed.getPid() + + * " was not found on this node."); } + * + * EventLogAOElasticSearchImpl eventLog = new + * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, + * restConfiguration); try { + * eventLog.recordEvent(Event.SYNCHRONIZATION_FAILED, pid, + * syncFailed.getDescription()); } catch (Exception e) { + * log.error("failed to log synchronization failed event: {}", + * e.toString()); throw new ServiceFailure("2161", + * "Failed to log Synchronization Failure event"); } + */ + return true; } @@ -622,25 +606,27 @@ public boolean synchronizationFailed(SynchronizationFailed syncFailed) public boolean synchronizationFailed(Session arg0, SynchronizationFailed arg1) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { - throw new NotImplemented("2160", "this service has not been implemented"); + throw new NotImplemented("2160", + "this service has not been implemented"); } - - // need to return every DataONE permission implied by iRODS permissions i.e. - // write would require read and write to be listed as DataONE permissions and + + // need to return every DataONE permission implied by iRODS permissions i.e. + // write would require read and write to be listed as DataONE permissions + // and // own would include read, write, and changePermission private List getD1Permission(UserFilePermission p) { List permissions = new ArrayList(); FilePermissionEnum fpEnum = p.getFilePermissionEnum(); - switch(fpEnum) { + switch (fpEnum) { case READ: permissions.add(MNPermissionEnum.valueForDataOne(fpEnum)); break; - + case WRITE: permissions.add(Permission.READ); permissions.add(MNPermissionEnum.valueForDataOne(fpEnum)); break; - + case OWN: permissions.add(Permission.READ); permissions.add(Permission.WRITE); @@ -653,27 +639,26 @@ private List getD1Permission(UserFilePermission p) { return permissions; } - private BigInteger getSerialVersion() { // TODO: hardcode version to 1 for now Long verLong = new Long(1); String verStr = verLong.toString(); return new BigInteger(verStr); } - - private String getDataObjectMimeType(IRODSAccount irodsAccount, DataObject dataObject) - throws FileNotFoundException, JargonException { + + private String getDataObjectMimeType(IRODSAccount irodsAccount, + DataObject dataObject) throws FileNotFoundException, + JargonException { String mimeType = null; String filename = dataObject.getAbsolutePath(); log.info("file name is: {}", filename); - + DefaultDetector typeDetector = new DefaultDetector(); - IRODSFile irodsFile = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount) - .instanceIRODSFile(filename); + IRODSFile irodsFile = irodsAccessObjectFactory.getIRODSFileFactory( + irodsAccount).instanceIRODSFile(filename); IRODSFileInputStream irodsStream = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount) - .instanceIRODSFileInputStream(irodsFile); + .getIRODSFileFactory(irodsAccount) + .instanceIRODSFileInputStream(irodsFile); InputStream stream = new BufferedInputStream(irodsStream); Metadata metadata = new Metadata(); metadata.add(Metadata.RESOURCE_NAME_KEY, filename); @@ -683,32 +668,33 @@ private String getDataObjectMimeType(IRODSAccount irodsAccount, DataObject dataO type = typeDetector.detect(stream, metadata); } catch (IOException e) { log.error("detect failed: {}", e.toString()); - throw new FileNotFoundException("Cannot stream file in order to detect file type"); + throw new FileNotFoundException( + "Cannot stream file in order to detect file type"); } - - // if mime type is returned as "application/x-netcdf" change to + + // if mime type is returned as "application/x-netcdf" change to // DataONE accepted name: "netCDF-4" mimeType = type.toString(); if (mimeType.equals("application/x-netcdf")) { mimeType = "netCDF-4"; } - - + // data-profile stuff removed from jargon!!!!!!! - -// DataTypeResolutionService resolutionService = new DataTypeResolutionServiceImpl( -// irodsAccessObjectFactory, irodsAccount); -// DataProfileService dataProfileService = new DataProfileServiceImpl( -// irodsAccessObjectFactory, irodsAccount, resolutionService); -// -// @SuppressWarnings("unchecked") -// DataProfile dataProfile = dataProfileService.retrieveDataProfile(dataObject.getAbsolutePath()); -// mimeType = dataProfile.getMimeType(); - + + // DataTypeResolutionService resolutionService = new + // DataTypeResolutionServiceImpl( + // irodsAccessObjectFactory, irodsAccount); + // DataProfileService dataProfileService = new DataProfileServiceImpl( + // irodsAccessObjectFactory, irodsAccount, resolutionService); + // + // @SuppressWarnings("unchecked") + // DataProfile dataProfile = + // dataProfileService.retrieveDataProfile(dataObject.getAbsolutePath()); + // mimeType = dataProfile.getMimeType(); log.info("mime type is: {}", mimeType); return mimeType; - + } } From bc307982c816c885bb68df3778199b13726aa170 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 8 Feb 2017 09:28:40 -0500 Subject: [PATCH 11/88] #2 more cleanup --- dataone-node/pom.xml | 9 + .../dataone/id/DataObjectListResponse.java | 31 -- .../irods/jargon/dataone/id/UniqueIdAO.java | 72 ----- .../irods/jargon/dataone/id/package-info.java | 8 - .../jargon/dataone/tier1/MNReadImpl.java | 2 +- .../jargon/dataone/utils/RestVersion.java | 2 +- pid-service-handle-impl/pom.xml | 11 +- .../id/handle/UniqueIdAOHandleImpl.java | 297 +++++++++--------- .../src/main/lib/cnriutil.jar | Bin 0 -> 68965 bytes .../src/main/lib/handle.jar | Bin 0 -> 844979 bytes pom.xml | 8 +- 11 files changed, 177 insertions(+), 263 deletions(-) delete mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java delete mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java delete mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/id/package-info.java create mode 100644 pid-service-handle-impl/src/main/lib/cnriutil.jar create mode 100644 pid-service-handle-impl/src/main/lib/handle.jar diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 3713892..4b75e55 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -151,6 +151,15 @@ org.dataone d1_libclient_java + + org.springframework.boot + spring-boot-starter-web + + + org.irods + pid-service-api + ${project.version} + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java deleted file mode 100644 index f57d1a9..0000000 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/id/DataObjectListResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.irods.jargon.dataone.id; - -import java.util.List; - -import org.irods.jargon.core.pub.domain.DataObject; - -public class DataObjectListResponse { - - List dataObjects; - int total; - int count; - - public List getDataObjects() { - return dataObjects; - } - public void setDataObjects(List dataObjects) { - this.dataObjects = dataObjects; - } - public int getTotal() { - return total; - } - public void setTotal(int total) { - this.total = total; - } - public int getCount() { - return count; - } - public void setCount(int count) { - this.count = count; - } -} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java deleted file mode 100644 index 9c7fc86..0000000 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/id/UniqueIdAO.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.irods.jargon.dataone.id; - -import java.util.Date; -import java.util.List; - -import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; -import org.irods.jargon.core.exception.JargonException; -import org.irods.jargon.core.pub.domain.DataObject; - -// Access object for unique identifiers that are associated with iRODS Data Objects - -public interface UniqueIdAO { - - //These methods are intended for future support of DataONE MN tiers > 1 - //public Identifier createNewIdentifier(); - //public Identifier createNewIdentifier(String identifier); - //public void deleteIdentifier(String identifier); - - /** - * Returns a DataONE Identifier object for the iRODS Data Object specified - * - * @param dataObject - * DataObject of iRODS Data Object - * associated with the identifier to be returned. - * @throws JargonException - */ - public Identifier getIdentifierFromDataObject(DataObject dataObject) - throws JargonException; - - - /** - * Returns an iRODS Data Object for the DataONE Identifier object specified - * - * @param identifier - * Identifier associated with the iRODS Data Object - * to be returned. - * @throws JargonException - */ - public DataObject getDataObjectFromIdentifier(Identifier identifier) - throws JargonException; - - - - /** - * Returns a complete list of Unique Identifiers that are associated with - * iRODS objects that are exposed to DataONE - * - * @return List<Identifier> - * @throws JargonException - */ - public List getListOfDataoneExposedIdentifiers() - throws JargonException; - - - - /** - * Returns an iRODS Data Object for the DataONE Identifier object specified - * - * @return List<DataObject> - * @throws JargonException - */ - public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, - Date toDate, - ObjectFormatIdentifier formatId, - Boolean replicaStatus, - Integer start, - Integer count - ) throws JargonException; - -} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/id/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/id/package-info.java deleted file mode 100644 index 3a2f768..0000000 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/id/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * - */ -/** - * @author lisa - * - */ -package org.irods.jargon.dataone.id; \ No newline at end of file diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index 1071234..908be80 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -51,10 +51,10 @@ import org.irods.jargon.dataone.auth.RestAuthUtils; import org.irods.jargon.dataone.configuration.RestConfiguration; import org.irods.jargon.dataone.domain.MNPermissionEnum; -import org.irods.jargon.dataone.id.DataObjectListResponse; import org.irods.jargon.dataone.utils.DataObjectMetadataUtils; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.dataone.utils.PropertiesLoader; +import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 7b467cb..b691768 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-07T18:20:28Z"; + public static String BUILD_TIME="2017-02-08T14:28:11Z"; } diff --git a/pid-service-handle-impl/pom.xml b/pid-service-handle-impl/pom.xml index 6f7d051..f9c35af 100644 --- a/pid-service-handle-impl/pom.xml +++ b/pid-service-handle-impl/pom.xml @@ -3,6 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 pid-service-handle-impl + Handle PID server impl + org.irods dfc-dataone @@ -38,14 +40,17 @@ org.mockito mockito-all - + handle org.handle system 1.0.0 ${project.basedir}/src/main/lib/handle.jar - + + org.irods + pid-service-api + ${project.version} + - Handle PID server impl diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java index 3437f30..76486e1 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java @@ -3,29 +3,20 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.LinkedList; import java.util.List; -import java.util.PriorityQueue; import java.util.Properties; -import java.util.Queue; -import java.util.concurrent.LinkedBlockingQueue; -import net.handle.hdllib.HandleValue; - -import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.DataObjectAO; -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.JargonQueryException; -import org.irods.jargon.dataone.auth.RestAuthUtils; -import org.irods.jargon.dataone.configuration.RestConfiguration; -import org.irods.jargon.dataone.utils.DataTypeUtils; +import org.irods.jargon.core.service.AbstractJargonService; +import org.irods.jargon.pid.pidservice.DataObjectListResponse; +import org.irods.jargon.pid.pidservice.UniqueIdAO; //import org.irods.jargon.dataprofile.DataProfile; //import org.irods.jargon.dataprofile.DataProfileService; //import org.irods.jargon.dataprofile.DataProfileServiceImpl; @@ -34,166 +25,156 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +public class UniqueIdAOHandleImpl extends AbstractJargonService implements + UniqueIdAO { -public class UniqueIdAOHandleImpl implements UniqueIdAO { - - private final RestConfiguration restConfiguration; - private final IRODSAccessObjectFactory irodsAccessObjectFactory; private Properties properties; private String propertiesFilename = "d1client.properties"; private Logger log = LoggerFactory.getLogger(this.getClass()); - - public UniqueIdAOHandleImpl(RestConfiguration restConfiguration, - IRODSAccessObjectFactory irodsAccessObjectFactory) { - this.restConfiguration = restConfiguration; - this.irodsAccessObjectFactory = irodsAccessObjectFactory; - loadProperties(); - } - + @Override public DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException, FileNotFoundException { - + DataObject dataObject = null; - log.info("retrieving irods data object id from identifier: {}", identifier.getValue()); + log.info("retrieving irods data object id from identifier: {}", + identifier.getValue()); long dataObjectId = getDataObjectIdFromDataOneIdentifier(identifier); log.info("got id: {}", dataObjectId); - + if (dataObjectId < 0) { throw new FileNotFoundException(""); } - - try { - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(this.restConfiguration); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); + + try { + + DataObjectAO dataObjectAO = irodsAccessObjectFactory + .getDataObjectAO(irodsAccount); log.info("got dataObjectAO: {}", dataObjectAO.toString()); // Find iRODS object here from Identifier - dataObject = dataObjectAO.findById(new Long(dataObjectId).intValue()); + dataObject = dataObjectAO.findById(new Long(dataObjectId) + .intValue()); if (dataObject != null) { log.info("found iRODS file: {}", dataObject.getAbsolutePath()); - } - else { + } else { log.warn("did not find data object for id={}", dataObjectId); } - -// } catch (Exception e) { -// log.warn("Cannot access iRODS object for id={}", dataObjectId); -// throw e; - } finally { + + // } catch (Exception e) { + // log.warn("Cannot access iRODS object for id={}", dataObjectId); + // throw e; + } finally { irodsAccessObjectFactory.closeSessionAndEatExceptions(); } - + return dataObject; } @Override - public Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException { - + public Identifier getIdentifierFromDataObject(DataObject dataObject) + throws JargonException { + if (dataObject == null) { log.error("getIdentifierFromDataObject: dataObject is null"); throw new JargonException("dataObject is null"); } Identifier identifier = new Identifier(); - + String prefix = getHandlePrefix(); if (prefix == null) { log.error("getIdentifierFromDataObject: prefix is null"); throw new JargonException("prefix is null"); } String objectId = String.valueOf(dataObject.getId()); - + identifier.setValue(prefix + "/" + objectId); - + return identifier; } - + @Override public List getListOfDataoneExposedIdentifiers() throws JargonException { - + List identifiers = new ArrayList(); - - // retrieve properties to get list of current handles from + + // retrieve properties to get list of current handles from // handle server StringBuilder hdl = new StringBuilder(); - hdl.append(properties.getProperty("irods.dataone.handle.namingAuthority")); + hdl.append(properties + .getProperty("irods.dataone.handle.namingAuthority")); hdl.append("/"); hdl.append(properties.getProperty("irods.dataone.handle.prefix")); String authHandle = hdl.toString(); String authIndex = properties.getProperty("irods.dataone.handle.index"); - String privateKey = properties.getProperty("irods.dataone.handle.privateKeyPath"); - String namingAuthority = properties.getProperty("irods.dataone.handle.prefix"); - + String privateKey = properties + .getProperty("irods.dataone.handle.privateKeyPath"); + String namingAuthority = properties + .getProperty("irods.dataone.handle.prefix"); + log.info("config params for handle lister:"); log.info("authHandle: {}", authHandle); log.info("authIndex:{}", authIndex); log.info("privateKey: {}", privateKey); log.info("namingAuthority: {}", namingAuthority); - - //LinkedBlockingQueue> queue = new LinkedBlockingQueue>(); + + // LinkedBlockingQueue> queue = new + // LinkedBlockingQueue>(); LinkedList> queue = new LinkedList>(); - HandleListerRunnable hlThread = new HandleListerRunnable( - queue, - authHandle, - authIndex, - privateKey, - namingAuthority); - hlThread.run(); - log.info("continuing after call to run"); - - synchronized (queue) { - while (queue.isEmpty()) { - try { + HandleListerRunnable hlThread = new HandleListerRunnable(queue, + authHandle, authIndex, privateKey, namingAuthority); + hlThread.run(); + log.info("continuing after call to run"); + + synchronized (queue) { + while (queue.isEmpty()) { + try { queue.wait(); } catch (InterruptedException e) { log.warn("getListOfDataoneExposedIdentifiers: caught InterruptedException while waiting for queue"); } - } - } - - List handles = null; - if (! queue.isEmpty()) { - log.debug("listObjects: got list of Handle values"); - handles = queue.element(); - } - - if (handles != null) { - log.info("listObjects: got list of Handle values: {}", handles.toString()); - - for (String h : handles) { - Identifier id = new Identifier(); - id.setValue(h); - identifiers.add(id); - } - } - - log.info("returning identifiers: {}", identifiers); + } + } + + List handles = null; + if (!queue.isEmpty()) { + log.debug("listObjects: got list of Handle values"); + handles = queue.element(); + } + + if (handles != null) { + log.info("listObjects: got list of Handle values: {}", + handles.toString()); + + for (String h : handles) { + Identifier id = new Identifier(); + id.setValue(h); + identifiers.add(id); + } + } + + log.info("returning identifiers: {}", identifiers); return identifiers; } @Override public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, - Date toDate, - ObjectFormatIdentifier formatId, - Boolean replicaStatus, - Integer start, - Integer count - ) throws JargonException { - - //get complete list of exposed data objects + Date fromDate, Date toDate, ObjectFormatIdentifier formatId, + Boolean replicaStatus, Integer start, Integer count) + throws JargonException { + + // get complete list of exposed data objects // TODO: see if this can be done differently to just request list // using filter items DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); List dataObjectListTmp = new ArrayList(); List dataObjectListFinal = new ArrayList(); List ids = getListOfDataoneExposedIdentifiers(); - - log.info("finding list of data objects with list of {} identifiers", ids.size()); - + + log.info("finding list of data objects with list of {} identifiers", + ids.size()); + for (Identifier id : ids) { DataObject dataObject; try { @@ -202,41 +183,43 @@ public DataObjectListResponse getListOfDataoneExposedDataObjects( // just ignore this id dataObject = null; } - + if (dataObject != null) { Date modifiedDate = dataObject.getUpdatedAt(); - - if (matchesFromDate(fromDate, modifiedDate) && - matchesToDate(toDate, modifiedDate) && - //matchesFormatId(formatId, dataObject) && support not required - matchesReplicaStatus(replicaStatus)) { + + if (matchesFromDate(fromDate, modifiedDate) + && matchesToDate(toDate, modifiedDate) && + // matchesFormatId(formatId, dataObject) && support not + // required + matchesReplicaStatus(replicaStatus)) { dataObjectListTmp.add(dataObject); } - } + } } - //save total before filtering with start and count + // save total before filtering with start and count dataObjectListResponse.setTotal(dataObjectListTmp.size()); - + // now filter this list according to start and count if (dataObjectListTmp.size() > 0) { - DataObject[] dataObjectArray = - dataObjectListTmp.toArray(new DataObject[dataObjectListTmp.size()]); + DataObject[] dataObjectArray = dataObjectListTmp + .toArray(new DataObject[dataObjectListTmp.size()]); int end = start + count; - for (int i=start; i= dataObjectModDate.getTime()) { log.info("toDate : returning matches"); return true; } - + log.info("toDate : returning no match"); return false; } - - private boolean matchesFormatId(ObjectFormatIdentifier formatId, DataObject dataObject) - throws JargonException, JargonQueryException { - + + private boolean matchesFormatId(ObjectFormatIdentifier formatId, + DataObject dataObject) throws JargonException, JargonQueryException { + IRODSAccount irodsAccount = RestAuthUtils .getIRODSAccountFromBasicAuthValues(this.restConfiguration); - String dataFormat = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, irodsAccessObjectFactory, dataObject); - - if ((formatId.getValue() == null) || (formatId.getValue().equals(dataFormat))) { + String dataFormat = DataTypeUtils.getDataObjectFormatFromMetadata( + irodsAccount, irodsAccessObjectFactory, dataObject); + + if ((formatId.getValue() == null) + || (formatId.getValue().equals(dataFormat))) { return true; } return false; } - + private boolean matchesReplicaStatus(Boolean replicaStatus) { - + // replication is always set to false for now if (replicaStatus == null || replicaStatus == false) { log.info("replicastatus : returning matches"); return true; } - + log.info("toDate : returning no match"); return false; } + @Override + public org.irods.jargon.pid.pidservice.Identifier getIdentifierFromDataObject( + DataObject dataObject) throws JargonException { + // TODO Auto-generated method stub + return null; + } + + @Override + public DataObjectListResponse getListOfDataoneExposedDataObjects( + Date fromDate, Date toDate, + org.irods.jargon.pid.pidservice.ObjectFormatIdentifier formatId, + Boolean replicaStatus, Integer start, Integer count) + throws JargonException { + // TODO Auto-generated method stub + return null; + } + } diff --git a/pid-service-handle-impl/src/main/lib/cnriutil.jar b/pid-service-handle-impl/src/main/lib/cnriutil.jar new file mode 100644 index 0000000000000000000000000000000000000000..211a869300836cc873278b4120755aa100b3fffe GIT binary patch literal 68965 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 T{QX_X0_F}H$VTtJ|L^|+!>YH< literal 0 HcmV?d00001 diff --git a/pid-service-handle-impl/src/main/lib/handle.jar b/pid-service-handle-impl/src/main/lib/handle.jar new file mode 100644 index 0000000000000000000000000000000000000000..aed4710a6df7b7cdd17c6b1d39e664a57d01e30d GIT binary patch literal 844979 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

VoU^xg$XU(C|i!d!e8 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 aZJ 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

    13RcN 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≪;lQ7t1ft>H^(IpBy<=B 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 z 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.3.0 jar + + + org.springframework.boot + spring-boot-starter-web + 1.5.1.RELEASE + dataone-node pid-service-api event-service-api -pid-service-handle-impl + pid-service-handle-impl From 9fd4f9018a68f0b5a829265db826108e18f2ff79 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 8 Feb 2017 11:15:13 -0500 Subject: [PATCH 12/88] #2 refactoring of utils --- dataone-node/pom.xml | 9 +- .../jargon/dataone/utils/RestVersion.java | 2 +- dataone-utils/pom.xml | 49 +++ .../utils/DataObjectMetadataUtils.java | 0 .../jargon/dataone/utils/DataTypeUtils.java | 0 .../irods/jargon/dataone/utils/ISO8601.java | 0 .../dataone/utils/PropertiesLoader.java | 0 .../dataone/utils/RestTestingProperties.java | 0 .../jargon/dataone/utils/package-info.java | 0 pid-service-handle-impl/pom.xml | 5 + .../id/handle/UniqueIdAOHandleImpl.java | 23 +- .../UniqueIdAOHandleInMetadataImpl.java | 343 ++++++++---------- pom.xml | 1 + 13 files changed, 225 insertions(+), 207 deletions(-) create mode 100644 dataone-utils/pom.xml rename {dataone-node => dataone-utils}/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java (100%) rename {dataone-node => dataone-utils}/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java (100%) rename {dataone-node => dataone-utils}/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java (100%) rename {dataone-node => dataone-utils}/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java (100%) rename {dataone-node => dataone-utils}/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java (100%) rename {dataone-node => dataone-utils}/src/main/java/org/irods/jargon/dataone/utils/package-info.java (100%) diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 4b75e55..0f0a90d 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -143,10 +143,6 @@ elasticsearch 1.7.6 - - org.apache.tika - tika-core - org.dataone d1_libclient_java @@ -160,6 +156,11 @@ pid-service-api ${project.version} + + org.irods + dataone-utils + ${project.version} + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index b691768..7a18a0a 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-08T14:28:11Z"; + public static String BUILD_TIME="2017-02-08T16:14:12Z"; } diff --git a/dataone-utils/pom.xml b/dataone-utils/pom.xml new file mode 100644 index 0000000..068cefa --- /dev/null +++ b/dataone-utils/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + dataone-utils + + org.irods + dfc-dataone + 4.1.10.0-SNAPSHOT + + jar + DataONE utilities + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + org.apache.tika + tika-core + + + + + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java rename to dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java rename to dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java rename to dataone-utils/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java rename to dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java rename to dataone-utils/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/package-info.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/package-info.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/utils/package-info.java rename to dataone-utils/src/main/java/org/irods/jargon/dataone/utils/package-info.java diff --git a/pid-service-handle-impl/pom.xml b/pid-service-handle-impl/pom.xml index f9c35af..f6dc28f 100644 --- a/pid-service-handle-impl/pom.xml +++ b/pid-service-handle-impl/pom.xml @@ -52,5 +52,10 @@ pid-service-api ${project.version} + + org.irods + dataone-utils + ${project.version} + diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java index 76486e1..1f921ab 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java @@ -8,13 +8,15 @@ import java.util.List; import java.util.Properties; -import org.irods.jargon.core.connection.IRODSAccount; +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.DataObjectAO; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.core.service.AbstractJargonService; +import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.irods.jargon.pid.pidservice.UniqueIdAO; //import org.irods.jargon.dataprofile.DataProfile; @@ -302,8 +304,6 @@ private boolean matchesToDate(Date toDate, Date dataObjectModDate) { private boolean matchesFormatId(ObjectFormatIdentifier formatId, DataObject dataObject) throws JargonException, JargonQueryException { - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(this.restConfiguration); String dataFormat = DataTypeUtils.getDataObjectFormatFromMetadata( irodsAccount, irodsAccessObjectFactory, dataObject); @@ -326,21 +326,4 @@ private boolean matchesReplicaStatus(Boolean replicaStatus) { return false; } - @Override - public org.irods.jargon.pid.pidservice.Identifier getIdentifierFromDataObject( - DataObject dataObject) throws JargonException { - // TODO Auto-generated method stub - return null; - } - - @Override - public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, Date toDate, - org.irods.jargon.pid.pidservice.ObjectFormatIdentifier formatId, - Boolean replicaStatus, Integer start, Integer count) - throws JargonException { - // TODO Auto-generated method stub - return null; - } - } diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java index 9a3351a..2515af6 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java @@ -10,19 +10,17 @@ import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.ObjectFormatIdentifier; -import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.DataObjectAO; -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.AVUQueryElement; import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; import org.irods.jargon.core.query.AVUQueryOperatorEnum; import org.irods.jargon.core.query.JargonQueryException; -import org.irods.jargon.dataone.auth.RestAuthUtils; -import org.irods.jargon.dataone.configuration.RestConfiguration; -import org.irods.jargon.dataone.utils.DataTypeUtils; +import org.irods.jargon.core.service.AbstractJargonService; +import org.irods.jargon.pid.pidservice.DataObjectListResponse; +import org.irods.jargon.pid.pidservice.UniqueIdAO; //import org.irods.jargon.dataprofile.DataProfile; //import org.irods.jargon.dataprofile.DataProfileService; //import org.irods.jargon.dataprofile.DataProfileServiceImpl; @@ -31,187 +29,172 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +public class UniqueIdAOHandleInMetadataImpl extends AbstractJargonService + implements UniqueIdAO { -public class UniqueIdAOHandleInMetadataImpl implements UniqueIdAO { - - private final RestConfiguration restConfiguration; - private final IRODSAccessObjectFactory irodsAccessObjectFactory; private Properties properties; private String propertiesFilename = "d1client.properties"; private Logger log = LoggerFactory.getLogger(this.getClass()); - - public UniqueIdAOHandleInMetadataImpl(RestConfiguration restConfiguration, - IRODSAccessObjectFactory irodsAccessObjectFactory) { - this.restConfiguration = restConfiguration; - this.irodsAccessObjectFactory = irodsAccessObjectFactory; - loadProperties(); - } - + @Override public DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException, FileNotFoundException { - + DataObject dataObject = null; - log.info("retrieving irods data object id from identifier: {}", identifier.getValue()); + log.info("retrieving irods data object id from identifier: {}", + identifier.getValue()); long dataObjectId = getDataObjectIdFromDataOneIdentifier(identifier); log.info("got id: {}", dataObjectId); - + // DataObjectAO.findDomainByMetadataQuery // returns List - + if (dataObjectId < 0) { throw new FileNotFoundException(""); } - - try { - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(this.restConfiguration); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); + + try { + + DataObjectAO dataObjectAO = irodsAccessObjectFactory + .getDataObjectAO(irodsAccount); log.info("got dataObjectAO: {}", dataObjectAO.toString()); // Find iRODS object here from Identifier - dataObject = dataObjectAO.findById(new Long(dataObjectId).intValue()); + dataObject = dataObjectAO.findById(new Long(dataObjectId) + .intValue()); if (dataObject != null) { log.info("found iRODS file: {}", dataObject.getAbsolutePath()); - } - else { + } else { log.warn("did not find data object for id={}", dataObjectId); } - -// } catch (Exception e) { -// log.warn("Cannot access iRODS object for id={}", dataObjectId); -// throw e; - } finally { + + // } catch (Exception e) { + // log.warn("Cannot access iRODS object for id={}", dataObjectId); + // throw e; + } finally { irodsAccessObjectFactory.closeSessionAndEatExceptions(); } - + return dataObject; } @Override - public Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException { - + public Identifier getIdentifierFromDataObject(DataObject dataObject) + throws JargonException { + if (dataObject == null) { log.error("getIdentifierFromDataObject: dataObject is null"); throw new JargonException("dataObject is null"); } Identifier identifier = new Identifier(); - + String prefix = getHandlePrefix(); if (prefix == null) { log.error("getIdentifierFromDataObject: prefix is null"); throw new JargonException("prefix is null"); } String objectId = String.valueOf(dataObject.getId()); - + identifier.setValue(prefix + "/" + objectId); - + return identifier; } - + @Override public List getListOfDataoneExposedIdentifiers() throws JargonException { - + AVUQueryElement avuQuery1 = null; AVUQueryElement avuQuery2 = null; - - String handleAttr = properties.getProperty("irods.dataone.publish_entity_metadata_attr"); - String handleValue = properties.getProperty("irods.dataone.publish_entity_metadata_value"); - + + String handleAttr = properties + .getProperty("irods.dataone.publish_entity_metadata_attr"); + String handleValue = properties + .getProperty("irods.dataone.publish_entity_metadata_value"); + List identifiers = new ArrayList(); try { avuQuery1 = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, - handleAttr); - - avuQuery2 = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, - AVUQueryOperatorEnum.EQUAL, - handleValue); - + AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + handleAttr); + + avuQuery2 = AVUQueryElement + .instanceForValueQuery(AVUQueryPart.VALUE, + AVUQueryOperatorEnum.EQUAL, handleValue); + } catch (JargonQueryException e) { log.error("getListOfDataoneExposedIdentifiers: failed to create AVU query elements"); return identifiers; } - - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(this.restConfiguration); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); + + DataObjectAO dataObjectAO = irodsAccessObjectFactory + .getDataObjectAO(irodsAccount); List dataObjects = new ArrayList(); try { - dataObjects = dataObjectAO.findDomainByMetadataQuery(Arrays.asList(avuQuery1, avuQuery2)); + dataObjects = dataObjectAO.findDomainByMetadataQuery(Arrays.asList( + avuQuery1, avuQuery2)); } catch (JargonQueryException e) { log.error("getListOfDataoneExposedIdentifiers: failed to execute AVU query"); return identifiers; } - + // restrict start date for now to 2/10/16 - Date afterDate = new Date(Long.parseLong("1455062400") * 1000); - for(DataObject dataObject : dataObjects) { - if(dataObject.getCreatedAt().after(afterDate)) { + Date afterDate = new Date(Long.parseLong("1455062400") * 1000); + for (DataObject dataObject : dataObjects) { + if (dataObject.getCreatedAt().after(afterDate)) { identifiers.add(getIdentifierFromDataObject(dataObject)); } } - + log.info("returning identifiers: {}", identifiers); return identifiers; } - + @Override public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, - Date toDate, - ObjectFormatIdentifier formatId, - Boolean replicaStatus, - Integer start, - Integer count - ) throws JargonException { - + Date fromDate, Date toDate, ObjectFormatIdentifier formatId, + Boolean replicaStatus, Integer start, Integer count) + throws JargonException { + int total = 0; - - DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); - - List avuQueryList = createAVUQueryElementList(fromDate, toDate, formatId); - - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(this.restConfiguration); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); + + DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); + + List avuQueryList = createAVUQueryElementList( + fromDate, toDate, formatId); + + DataObjectAO dataObjectAO = irodsAccessObjectFactory + .getDataObjectAO(irodsAccount); List dataObjects = new ArrayList(); - + try { - dataObjects = dataObjectAO.findDomainByMetadataQuery(avuQueryList, start); + dataObjects = dataObjectAO.findDomainByMetadataQuery(avuQueryList, + start); // save original size of set returned - total = dataObjects.size(); + total = dataObjects.size(); } catch (JargonQueryException e) { log.error("test_getListOfDataoneExposedDataObjects: failed to execute AVU query"); return dataObjectListResponse; } - + // truncate list if count is specified and it is less than the total List finalDataObjects = new ArrayList(); if ((count >= 0) && (count < total)) { finalDataObjects = dataObjects.subList(0, count); - } - else { + } else { finalDataObjects = dataObjects; } - + dataObjectListResponse.setTotal(total); - dataObjectListResponse.count = finalDataObjects.size(); + dataObjectListResponse.setCount(finalDataObjects.size()); dataObjectListResponse.setDataObjects(finalDataObjects); - + return dataObjectListResponse; } - - + public long getDataObjectIdFromDataOneIdentifier(Identifier pid) { - int idIdx = pid.getValue().indexOf("/")+1; + int idIdx = pid.getValue().indexOf("/") + 1; long dataObjectId; try { dataObjectId = Long.parseLong(pid.getValue().substring(idIdx)); @@ -219,29 +202,33 @@ public long getDataObjectIdFromDataOneIdentifier(Identifier pid) { // set to catch illegal object identifiers for iRODS MN dataObjectId = -1; } - - log.info("getDataObjectIdFromDataOneIdentifier: returning data object id: {}", dataObjectId); - return dataObjectId; + + log.info( + "getDataObjectIdFromDataOneIdentifier: returning data object id: {}", + dataObjectId); + return dataObjectId; } - + public String getHandlePrefix() throws JargonException { String prefix = null; - + prefix = properties.getProperty("irods.dataone.handle.prefix"); - + return prefix; } - + private void loadProperties() { this.properties = new Properties(); InputStream input = null; - input = getClass().getClassLoader().getResourceAsStream(this.propertiesFilename); + input = getClass().getClassLoader().getResourceAsStream( + this.propertiesFilename); // load a properties file try { this.properties.load(input); } catch (IOException e) { - log.error("Cannot load Member Node properties file: {}", this.propertiesFilename); + log.error("Cannot load Member Node properties file: {}", + this.propertiesFilename); log.error("IOException: {}", e.getStackTrace()); this.properties = new Properties(); } finally { @@ -254,126 +241,118 @@ private void loadProperties() { } } } - - - private List createAVUQueryElementList( - Date fromDate, - Date toDate, - ObjectFormatIdentifier formatId) { + + private List createAVUQueryElementList(Date fromDate, + Date toDate, ObjectFormatIdentifier formatId) { // TODO: probably should move these to properties String dateAttr = "StartDateTime"; String formatAttr = "Format"; List avuQueryList = new ArrayList(); - String handleAttr = properties.getProperty("irods.dataone.publish_entity_metadata_attr"); - String handleValue = properties.getProperty("irods.dataone.publish_entity_metadata_value"); - + String handleAttr = properties + .getProperty("irods.dataone.publish_entity_metadata_attr"); + String handleValue = properties + .getProperty("irods.dataone.publish_entity_metadata_value"); + AVUQueryElement avuQuery; try { // DataOne exposed query avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, handleAttr); avuQueryList.add(avuQuery); - - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, - AVUQueryOperatorEnum.EQUAL, - handleValue); + + avuQuery = AVUQueryElement + .instanceForValueQuery(AVUQueryPart.VALUE, + AVUQueryOperatorEnum.EQUAL, handleValue); avuQueryList.add(avuQuery); - + // handle any date queries // restrict start date for now to 2/17/16 00:00:01 : 1455667201 - // 3-23-16 Update - now changed earliest data to 3/23/16 00:00:01 : 1458691201 - // 3-31-16 Update - now changed earliest data to 3/28/16 00:00:01 GMT : 1459123201 + // 3-23-16 Update - now changed earliest data to 3/23/16 00:00:01 : + // 1458691201 + // 3-31-16 Update - now changed earliest data to 3/28/16 00:00:01 + // GMT : 1459123201 long newFromDate; - if(fromDate != null) { - newFromDate = java.lang.Math.max(fromDate.getTime()/1000, Long.parseLong("1459123201")); - } - else { + if (fromDate != null) { + newFromDate = java.lang.Math.max(fromDate.getTime() / 1000, + Long.parseLong("1459123201")); + } else { newFromDate = Long.parseLong("1459123201"); } - + // fromDate query avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, dateAttr); avuQueryList.add(avuQuery); - + avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, - AVUQueryOperatorEnum.GREATER_OR_EQUAL, + AVUQueryPart.VALUE, AVUQueryOperatorEnum.GREATER_OR_EQUAL, Long.toString(newFromDate)); avuQueryList.add(avuQuery); - + // toDate query - if ((toDate != null) && ((toDate.getTime()/1000) >= newFromDate)) { + if ((toDate != null) && ((toDate.getTime() / 1000) >= newFromDate)) { avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, dateAttr); avuQueryList.add(avuQuery); - + avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, - AVUQueryOperatorEnum.LESS_THAN, - Long.toString(toDate.getTime()/1000)); + AVUQueryPart.VALUE, AVUQueryOperatorEnum.LESS_THAN, + Long.toString(toDate.getTime() / 1000)); avuQueryList.add(avuQuery); - + } - - -// if ((toDate != null) && (toDate.getTime() >= newFromDate)) { -// avuQuery = AVUQueryElement.instanceForValueQuery( -// AVUQueryPart.ATTRIBUTE, -// AVUQueryOperatorEnum.EQUAL, -// dateAttr); -// avuQueryList.add(avuQuery); -// -// avuQuery = AVUQueryElement.instanceForValueQuery( -// AVUQueryPart.VALUE, -// AVUQueryOperatorEnum.BETWEEN, -// Long.toString(toDate.getTime()/1000)); -// avuQueryList.add(avuQuery); -// -// } -// else { -// avuQuery = AVUQueryElement.instanceForValueQuery( -// AVUQueryPart.ATTRIBUTE, -// AVUQueryOperatorEnum.EQUAL, -// dateAttr); -// avuQueryList.add(avuQuery); -// -// avuQuery = AVUQueryElement.instanceForValueQuery( -// AVUQueryPart.VALUE, -// AVUQueryOperatorEnum.GREATER_OR_EQUAL, -// Long.toString(newFromDate)); -// avuQueryList.add(avuQuery); -// -// } - + + // if ((toDate != null) && (toDate.getTime() >= newFromDate)) { + // avuQuery = AVUQueryElement.instanceForValueQuery( + // AVUQueryPart.ATTRIBUTE, + // AVUQueryOperatorEnum.EQUAL, + // dateAttr); + // avuQueryList.add(avuQuery); + // + // avuQuery = AVUQueryElement.instanceForValueQuery( + // AVUQueryPart.VALUE, + // AVUQueryOperatorEnum.BETWEEN, + // Long.toString(toDate.getTime()/1000)); + // avuQueryList.add(avuQuery); + // + // } + // else { + // avuQuery = AVUQueryElement.instanceForValueQuery( + // AVUQueryPart.ATTRIBUTE, + // AVUQueryOperatorEnum.EQUAL, + // dateAttr); + // avuQueryList.add(avuQuery); + // + // avuQuery = AVUQueryElement.instanceForValueQuery( + // AVUQueryPart.VALUE, + // AVUQueryOperatorEnum.GREATER_OR_EQUAL, + // Long.toString(newFromDate)); + // avuQueryList.add(avuQuery); + // + // } + // handle data format query if ((formatId != null) && (formatId.getValue() != null)) { avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, formatAttr); avuQueryList.add(avuQuery); - + avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, - AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.VALUE, AVUQueryOperatorEnum.EQUAL, formatId.getValue()); avuQueryList.add(avuQuery); - + } } catch (JargonQueryException e) { log.error("createAVUQueryElementList: failed to construct AVU query"); return avuQueryList; } - + return avuQueryList; } diff --git a/pom.xml b/pom.xml index 88b821e..5beca86 100644 --- a/pom.xml +++ b/pom.xml @@ -69,5 +69,6 @@ pid-service-api event-service-api pid-service-handle-impl + dataone-utils From 5e5c17d9ea7c5d467edf3764c0dd7e847ce10238 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 8 Feb 2017 11:16:13 -0500 Subject: [PATCH 13/88] #2 merge --- .../main/java/org/irods/jargon/dataone/utils/RestVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 7a18a0a..e754773 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-08T16:14:12Z"; + public static String BUILD_TIME="2017-02-08T16:15:53Z"; } From 01c6bc855660536622727cac244b90091fc11146 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 8 Feb 2017 12:51:43 -0500 Subject: [PATCH 14/88] #2 adding spring boot cruft --- dataone-node/pom.xml | 28 +++++++++----- .../irods/jargon/dataone/app/DataOneBoot.java | 38 +++++++++++++++++++ .../dataone/app/DataOneJaxrsApplication.java | 21 ++++++++++ .../jargon/dataone/app/package-info.java | 9 +++++ .../jargon/dataone/utils/RestVersion.java | 2 +- pom.xml | 8 +--- 6 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java create mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneJaxrsApplication.java create mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/app/package-info.java diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 0f0a90d..508cfef 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -9,7 +9,7 @@ 4.1.10.0-SNAPSHOT war - DataOne node + DataONE Node javax.inject @@ -138,19 +138,10 @@ org.springframework spring-beans - - org.elasticsearch - elasticsearch - 1.7.6 - org.dataone d1_libclient_java - - org.springframework.boot - spring-boot-starter-web - org.irods pid-service-api @@ -161,6 +152,11 @@ dataone-utils ${project.version} + + org.springframework.boot + spring-boot-starter-web + 1.5.1.RELEASE + @@ -228,6 +224,18 @@ + + org.springframework.boot + spring-boot-maven-plugin + 1.5.1.RELEASE + + + + repackage + + + + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java new file mode 100644 index 0000000..df355bc --- /dev/null +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java @@ -0,0 +1,38 @@ +/** + * + */ +package org.irods.jargon.dataone.app; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +/** + * DataONE embedded container boot and app assemblies + * + * @author mconway + * + */ + +public class DataOneBoot extends SpringBootServletInitializer { + + public static void main(String[] args) { + SpringApplication.run(DataOneBoot.class, args); + } + + /* + * (non-Javadoc) + * + * @see + * org.springframework.boot.web.support.SpringBootServletInitializer#onStartup + * (javax.servlet.ServletContext) + */ + @Override + public void onStartup(ServletContext servletContext) + throws ServletException { + super.onStartup(servletContext); + } + +} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneJaxrsApplication.java b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneJaxrsApplication.java new file mode 100644 index 0000000..a5a326c --- /dev/null +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneJaxrsApplication.java @@ -0,0 +1,21 @@ +/** + * + */ +package org.irods.jargon.dataone.app; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +import org.springframework.stereotype.Component; + +/** + * JAXRS application for dataone + * + * @author mconway + * + */ +@Component +@ApplicationPath("/dataone-irods/") +public class DataOneJaxrsApplication extends Application { + +} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/app/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/app/package-info.java new file mode 100644 index 0000000..d0bbac9 --- /dev/null +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/app/package-info.java @@ -0,0 +1,9 @@ +/** + * + */ +/** + * App layer for member node for dynamic discovery of plugins and spring boot + * @author mconway + * + */ +package org.irods.jargon.dataone.app; \ No newline at end of file diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index e754773..6a115f7 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-08T16:15:53Z"; + public static String BUILD_TIME="2017-02-08T17:51:10Z"; } diff --git a/pom.xml b/pom.xml index 5beca86..73f8847 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.1.10.0-SNAPSHOT pom - dfc-dataone + DFC DataONE Adapter Framework DataONE Member Node service and supporting libraries https://code.renci.org/gf/project/dfc-dataone/ @@ -56,12 +56,6 @@ 2.3.0 jar - - - org.springframework.boot - spring-boot-starter-web - 1.5.1.RELEASE - From 9c5e99546cf96529a7ee82a1ebeb2ff24b7fd32f Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 8 Feb 2017 14:24:26 -0500 Subject: [PATCH 15/88] #2 spring boot will now start --- dataone-node/pom.xml | 9 ++++----- ...neJaxrsApplication.java => DataOneApp.java} | 13 ++----------- .../irods/jargon/dataone/app/DataOneBoot.java | 18 ++---------------- .../jargon/dataone/utils/RestVersion.java | 2 +- 4 files changed, 9 insertions(+), 33 deletions(-) rename dataone-node/src/main/java/org/irods/jargon/dataone/app/{DataOneJaxrsApplication.java => DataOneApp.java} (50%) diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 508cfef..fef3df4 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -52,8 +52,7 @@ javax.servlet - servlet-api - provided + javax.servlet-api org.springframework @@ -153,9 +152,9 @@ ${project.version} - org.springframework.boot - spring-boot-starter-web - 1.5.1.RELEASE + org.irods.jargon.springboot + resteasy-spring-boot-starter + ${project.version} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneJaxrsApplication.java b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneApp.java similarity index 50% rename from dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneJaxrsApplication.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneApp.java index a5a326c..802e207 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneJaxrsApplication.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneApp.java @@ -1,6 +1,3 @@ -/** - * - */ package org.irods.jargon.dataone.app; import javax.ws.rs.ApplicationPath; @@ -8,14 +5,8 @@ import org.springframework.stereotype.Component; -/** - * JAXRS application for dataone - * - * @author mconway - * - */ @Component -@ApplicationPath("/dataone-irods/") -public class DataOneJaxrsApplication extends Application { +@ApplicationPath("/dataone-node/") +public class DataOneApp extends Application { } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java index df355bc..be5c4b1 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java @@ -3,10 +3,8 @@ */ package org.irods.jargon.dataone.app; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; - import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.support.SpringBootServletInitializer; /** @@ -16,23 +14,11 @@ * */ +@SpringBootApplication public class DataOneBoot extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(DataOneBoot.class, args); } - /* - * (non-Javadoc) - * - * @see - * org.springframework.boot.web.support.SpringBootServletInitializer#onStartup - * (javax.servlet.ServletContext) - */ - @Override - public void onStartup(ServletContext servletContext) - throws ServletException { - super.onStartup(servletContext); - } - } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 6a115f7..1995f42 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-08T17:51:10Z"; + public static String BUILD_TIME="2017-02-08T19:24:00Z"; } From 0437ad4da0e4dd73e9b9b51a9fbd1ed03ee2854f Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 8 Feb 2017 14:26:24 -0500 Subject: [PATCH 16/88] #2 spring boot will now start --- dataone-node/README.md | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/dataone-node/README.md b/dataone-node/README.md index 20ae9d9..df225f6 100644 --- a/dataone-node/README.md +++ b/dataone-node/README.md @@ -1,44 +1,24 @@ -# Project: Jargon-core API +# Project: DataONE Node #### Date: #### Release Version: -#### git tag: 4.1.10.1-RC2 -#### Developer: Mike Conway - DICE +#### git tag: +#### Developer: Lisa Stillwell - RENCI, Mike Conway - DFC/RENCI ## News -4.1.10 Release compatability supporting issue 225: https://github.com/DICE-UNC/jargon/issues/225 - -This includes support for pooling of iRODS connections targeting REST, WebDav, Cloud Browser - -======= - -Please go to [[https://github.com/DICE-UNC/jargon]] for the latest news and info. - -Jargon-core consists of the following libraries - -* jargon-core - base libraries, implementation of the iRODS protocol -* jargon-data-utils - additional functionality for dealing with iRODS data, such as building trees, storing information in iRODS on behalf of applications, and doing diffs between local and iRODS -* jargon-user-tagging - code for using free tagging and other metadata metaphors on top of iRODS -* jargon-user-profile - allows management of user profile and related configuration data in a user home directory -* jargon-ticket - support for ticket processing -* jargon-httpstream - stream http content into iRODS via Jargon -* jargon-ruleservice - support for running and managing rules from interfaces ## Requirements -* Jargon depends on Java 1.8+ -* Jargon is built using Apache Maven2, see POM for dependencies -* Jargon supports iRODS 3.0 through iRODS 3.3.1 community, as well as iRODS 4.2.0 consortium +* Depends on Java 1.8+ +* Built using Apache Maven2, see POM for dependencies +* Supports iRODS 3.0 through iRODS 3.3.1 community, as well as iRODS 4.2.0 consortium -## Libraries +## Running -Jargon-core uses Maven for dependency management. See the pom.xml file for references to various dependencies. +``` +mvn spring-boot:run -Note that the following bug and feature requests are logged in GForge with related commit information [[https://github.com/DICE-UNC/jargon/issues]] +``` ## Changes - -#### Add object pooling protocol manager #225 - -Test addition of commons-pool support for the protocol manager (this is considered experimental at this point) From 2cd56be6d366877150c469c86b4b7a3581bff648 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 17 Feb 2017 16:13:58 -0500 Subject: [PATCH 17/88] #2 cleanup though handle stuff wont build yet --- dataone-node/pom.xml | 8 ++------ .../java/org/irods/jargon/dataone/utils/RestVersion.java | 4 ++-- dataone-utils/pom.xml | 2 +- event-service-api/pom.xml | 2 +- pid-service-api/pom.xml | 2 +- pid-service-handle-impl/pom.xml | 5 ++--- pom.xml | 2 +- 7 files changed, 10 insertions(+), 15 deletions(-) diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index fef3df4..82e7d7d 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -6,7 +6,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT war DataONE Node @@ -25,10 +25,6 @@ org.jboss.resteasy resteasy-jaxrs - - org.jboss.resteasy - resteasy-jaxb-provider - org.jboss.resteasy resteasy-jackson-provider @@ -154,7 +150,7 @@ org.irods.jargon.springboot resteasy-spring-boot-starter - ${project.version} + 4.1.10.0-SNAPSHOT diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 1995f42..3478d2c 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { - public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-08T19:24:00Z"; + public static String VERSION="4.2.1.0-SNAPSHOT"; + public static String BUILD_TIME="2017-02-17T21:12:45Z"; } diff --git a/dataone-utils/pom.xml b/dataone-utils/pom.xml index 068cefa..03a6c5a 100644 --- a/dataone-utils/pom.xml +++ b/dataone-utils/pom.xml @@ -6,7 +6,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT jar DataONE utilities diff --git a/event-service-api/pom.xml b/event-service-api/pom.xml index f3b6761..ee4dcc4 100644 --- a/event-service-api/pom.xml +++ b/event-service-api/pom.xml @@ -6,7 +6,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT jar Event service API diff --git a/pid-service-api/pom.xml b/pid-service-api/pom.xml index b52911e..204ff00 100644 --- a/pid-service-api/pom.xml +++ b/pid-service-api/pom.xml @@ -6,7 +6,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT jar PID service API diff --git a/pid-service-handle-impl/pom.xml b/pid-service-handle-impl/pom.xml index f6dc28f..084cdee 100644 --- a/pid-service-handle-impl/pom.xml +++ b/pid-service-handle-impl/pom.xml @@ -3,12 +3,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 pid-service-handle-impl - Handle PID server impl - + Handle PID server impl org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT jar diff --git a/pom.xml b/pom.xml index 73f8847..70b82c8 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.irods jargon-pom - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT pom DFC DataONE Adapter Framework From 1a7ff992055fb29698d64661798ea63b0e376caa Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 17 Feb 2017 16:20:01 -0500 Subject: [PATCH 18/88] #2 ran some cleanups and updated codebase for newer jargon --- .../jargon/dataone/IrodsDataoneVersion.java | 5 +- .../jargon/dataone/MemberNodeService.java | 41 +-- .../irods/jargon/dataone/app/DataOneBoot.java | 6 +- .../jargon/dataone/app/package-info.java | 2 +- .../jargon/dataone/auth/BasicAuthFilter.java | 20 +- .../auth/DefaultHttpClientAndContext.java | 4 +- .../jargon/dataone/auth/RestAuthUtils.java | 32 +-- .../jargon/dataone/auth/package-info.java | 2 +- .../configuration/RestConfiguration.java | 21 +- .../dataone/configuration/package-info.java | 2 +- .../context/SpringApplicationContext.java | 11 +- .../jargon/dataone/context/package-info.java | 2 +- .../jargon/dataone/domain/MNAccessPolicy.java | 16 +- .../jargon/dataone/domain/MNChecksum.java | 48 ++-- .../irods/jargon/dataone/domain/MNError.java | 133 +++++---- .../irods/jargon/dataone/domain/MNLog.java | 38 +-- .../jargon/dataone/domain/MNLogEntry.java | 105 +++---- .../irods/jargon/dataone/domain/MNNode.java | 240 ++++++++-------- .../jargon/dataone/domain/MNObjectInfo.java | 62 +++-- .../jargon/dataone/domain/MNObjectList.java | 55 ++-- .../dataone/domain/MNPermissionEnum.java | 38 +-- .../irods/jargon/dataone/domain/MNPing.java | 15 +- .../dataone/domain/MNReplicationPolicy.java | 10 +- .../jargon/dataone/domain/MNSchedule.java | 163 ++++++----- .../jargon/dataone/domain/MNService.java | 42 +-- .../dataone/domain/MNSynchronization.java | 47 ++-- .../dataone/domain/MNSystemMetadata.java | 169 +++++------ .../jargon/dataone/domain/ServerInfo.java | 23 +- .../jargon/dataone/domain/package-info.java | 14 +- .../jargon/dataone/events/EventLogAO.java | 21 +- .../jargon/dataone/events/EventsEnum.java | 58 ++-- .../jargon/dataone/events/package-info.java | 2 +- .../dataone/exceptions/ExceptionUtils.java | 78 +++--- .../exceptions/NotFoundExceptionMapper.java | 14 +- .../dataone/exceptions/package-info.java | 2 +- .../irods/jargon/dataone/package-info.java | 2 +- .../jargon/dataone/tier1/MNCoreImpl.java | 32 +-- .../jargon/dataone/tier1/MNReadImpl.java | 218 +++++++-------- .../jargon/dataone/tier1/package-info.java | 2 +- .../jargon/dataone/utils/RestVersion.java | 5 +- .../jargon/rest/service/package-info.java | 2 +- .../utils/DataObjectMetadataUtils.java | 39 +-- .../jargon/dataone/utils/DataTypeUtils.java | 77 ++--- .../irods/jargon/dataone/utils/ISO8601.java | 170 +++++------ .../dataone/utils/PropertiesLoader.java | 25 +- .../dataone/utils/RestTestingProperties.java | 6 +- .../jargon/dataone/utils/package-info.java | 2 +- .../id/handle/HandleListerRunnable.java | 263 +++++++++--------- .../id/handle/UniqueIdAOHandleImpl.java | 39 +-- .../UniqueIdAOHandleInMetadataImpl.java | 62 +++-- .../dataone/id/handle/package-info.java | 2 +- 51 files changed, 1239 insertions(+), 1248 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java index fc0922e..e707956 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/IrodsDataoneVersion.java @@ -1,5 +1,6 @@ package org.irods.jargon.dataone; + public final class IrodsDataoneVersion { - public static String VERSION="0.0.1-SNAPSHOT"; - public static String BUILD_TIME="20131014-0959"; + public static String VERSION = "0.0.1-SNAPSHOT"; + public static String BUILD_TIME = "20131014-0959"; } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java index d1f000d..bce5b09 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java @@ -89,7 +89,7 @@ public class MemberNodeService { // public Response handlePing(@HeaderParam("Authorization") final String // authorization) public Response handlePing() throws NotImplemented, ServiceFailure, - InsufficientResources, JargonException { + InsufficientResources, JargonException { // if (authorization == null || authorization.isEmpty()) { // throw new IllegalArgumentException("null or empty authorization"); @@ -139,7 +139,7 @@ public MNNode handleGetCapabilities() throws NotImplemented, ServiceFailure { @Produces(MediaType.TEXT_XML) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) public MNNode handleDefaultGetCapabilities() throws NotImplemented, - ServiceFailure { + ServiceFailure { MNNode nodeCapabilities = handleGetCapabilities(); @@ -152,14 +152,14 @@ public MNNode handleDefaultGetCapabilities() throws NotImplemented, @Produces(MediaType.TEXT_XML) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) public MNLog handleGetLogRecords( - @QueryParam("fromDate") String fromDateStr, - @QueryParam("toDate") String toDateStr, - @QueryParam("event") String event, - @QueryParam("pidFilter") String pidFilter, - @DefaultValue("0") @QueryParam("start") int start, - @DefaultValue("500") @QueryParam("count") int count) - throws NotImplemented, ServiceFailure, NotAuthorized, - InvalidRequest, InvalidToken { + @QueryParam("fromDate") final String fromDateStr, + @QueryParam("toDate") final String toDateStr, + @QueryParam("event") final String event, + @QueryParam("pidFilter") final String pidFilter, + @DefaultValue("0") @QueryParam("start") final int start, + @DefaultValue("500") @QueryParam("count") final int count) + throws NotImplemented, ServiceFailure, NotAuthorized, + InvalidRequest, InvalidToken { logger.info("/log request: fromData={} toDate={}", fromDateStr, toDateStr); @@ -232,8 +232,8 @@ public void handleRead(@PathParam("id") final String pid, public MNChecksum handleGetChecksum( @PathParam("id") final String pid, @DefaultValue("MD5") @QueryParam("checksumAlgorithm") final String algorithm) - throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, - NotImplemented, InvalidRequest { + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, + NotImplemented, InvalidRequest { MNChecksum mnChecksum = new MNChecksum(); @@ -275,7 +275,7 @@ public void handleReplica(@PathParam("id") final String pid, // FIXME: add log stuff /* - * + * * // now log the event EventLogAOElasticSearchImpl eventLog = new * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, * restConfiguration); try { eventLog.recordEvent(Event.REPLICATE, id, @@ -292,8 +292,8 @@ public void handleReplica(@PathParam("id") final String pid, public MNSystemMetadata handleGetSystemMetadata( @PathParam("id") final String pid) // @Context final HttpServletResponse response) - throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, - NotImplemented, InvalidRequest { + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, + NotImplemented, InvalidRequest { MNSystemMetadata mnSystemMetadata = new MNSystemMetadata(); @@ -314,7 +314,7 @@ public MNSystemMetadata handleGetSystemMetadata( @Produces(MediaType.TEXT_XML) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) public Response handleDescribe(@PathParam("id") final String pid) - // @Context final HttpServletResponse response) + // @Context final HttpServletResponse response) throws NotAuthorized, NotImplemented, ServiceFailure, NotFound, InvalidToken { @@ -374,8 +374,9 @@ public Response handleDescribe(@PathParam("id") final String pid) @Produces(MediaType.TEXT_XML) @Consumes(MediaType.MULTIPART_FORM_DATA) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public Response handleSynchronizationFailed(MultipartFormDataInput input) - throws NotAuthorized, NotImplemented, ServiceFailure, InvalidToken { + public Response handleSynchronizationFailed( + final MultipartFormDataInput input) throws NotAuthorized, + NotImplemented, ServiceFailure, InvalidToken { Map> uploadForm = input.getFormDataMap(); List inputParts = uploadForm.get("message"); @@ -426,8 +427,8 @@ public MNObjectList handleListObjects( @QueryParam("replicaStatus") final Boolean replicaStatus, @DefaultValue("0") @QueryParam("start") final Integer start, @DefaultValue("500") @QueryParam("count") final Integer count) - throws InvalidToken, ServiceFailure, NotAuthorized, InvalidRequest, - NotImplemented { + throws InvalidToken, ServiceFailure, NotAuthorized, InvalidRequest, + NotImplemented { MNObjectList mnObjectList = new MNObjectList(); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java index be5c4b1..f055ffa 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java @@ -1,5 +1,5 @@ /** - * + * */ package org.irods.jargon.dataone.app; @@ -9,7 +9,7 @@ /** * DataONE embedded container boot and app assemblies - * + * * @author mconway * */ @@ -17,7 +17,7 @@ @SpringBootApplication public class DataOneBoot extends SpringBootServletInitializer { - public static void main(String[] args) { + public static void main(final String[] args) { SpringApplication.run(DataOneBoot.class, args); } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/app/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/app/package-info.java index d0bbac9..b4a2a8d 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/app/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/app/package-info.java @@ -1,5 +1,5 @@ /** - * + * */ /** * App layer for member node for dynamic discovery of plugins and spring boot diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java index d0f407a..765c23e 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/BasicAuthFilter.java @@ -1,5 +1,5 @@ /** - * + * */ package org.irods.jargon.dataone.auth; @@ -26,9 +26,9 @@ /** * Servlet filter implements anonymous auth - * + * * @author Lisa Stillwell - RENCI (www.renci.org) - * + * */ @Named public class BasicAuthFilter implements Filter { @@ -40,14 +40,14 @@ public class BasicAuthFilter implements Filter { private IRODSAccessObjectFactory irodsAccessObjectFactory; /** - * + * */ public BasicAuthFilter() { } /* * (non-Javadoc) - * + * * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */ @Override @@ -57,14 +57,14 @@ public void init(final FilterConfig filterConfig) throws ServletException { /* * (non-Javadoc) - * + * * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, * javax.servlet.ServletResponse, javax.servlet.FilterChain) */ @Override public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) - throws IOException, ServletException { + throws IOException, ServletException { log.info("doFilter()"); @@ -83,11 +83,11 @@ public void doFilter(final ServletRequest request, log.info("authResponse:{}", authResponse); log.info("success!"); - + chain.doFilter(httpRequest, httpResponse); return; - } catch (JargonException e) { + } catch (JargonException e) { log.warn("auth exception", e); sendAuthError(httpResponse); return; @@ -106,7 +106,7 @@ private void sendAuthError(final HttpServletResponse httpResponse) /* * (non-Javadoc) - * + * * @see javax.servlet.Filter#destroy() */ @Override diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java index b2964d4..b5b00fe 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/DefaultHttpClientAndContext.java @@ -1,5 +1,5 @@ /** - * + * */ package org.irods.jargon.dataone.auth; @@ -8,7 +8,7 @@ /** * @author Mike Conway - DICE (www.irods.org) - * + * */ public class DefaultHttpClientAndContext { private DefaultHttpClient httpClient; diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java index 9e8ef30..30d58a1 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/RestAuthUtils.java @@ -1,11 +1,10 @@ /** - * + * */ package org.irods.jargon.dataone.auth; import java.util.Properties; -import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; @@ -26,16 +25,15 @@ /** * @author Lisa Stillwell - RENCI (www.renci.org) - * + * */ public class RestAuthUtils { private static Logger log = LoggerFactory.getLogger(RestAuthUtils.class); /** - * from anonymous build an iRODS - * account - * + * from anonymous build an iRODS account + * * @param restConfiguration * @return * @throws JargonException @@ -49,18 +47,16 @@ public static IRODSAccount getIRODSAccountFromBasicAuthValues( throw new IllegalArgumentException("null restConfiguration"); } -// return IRODSAccount.instanceForAnonymous( -// restConfiguration.getIrodsHost(), -// restConfiguration.getIrodsPort(), -// "", -// restConfiguration.getIrodsZone(), -// restConfiguration.getDefaultStorageResource()); - return IRODSAccount.instance( - restConfiguration.getIrodsHost(), + // return IRODSAccount.instanceForAnonymous( + // restConfiguration.getIrodsHost(), + // restConfiguration.getIrodsPort(), + // "", + // restConfiguration.getIrodsZone(), + // restConfiguration.getDefaultStorageResource()); + return IRODSAccount.instance(restConfiguration.getIrodsHost(), restConfiguration.getIrodsPort(), restConfiguration.getIrodsUserName(), - restConfiguration.getIrodsUserPswd(), - "", + restConfiguration.getIrodsUserPswd(), "", restConfiguration.getIrodsZone(), restConfiguration.getDefaultStorageResource()); @@ -68,7 +64,7 @@ public static IRODSAccount getIRODSAccountFromBasicAuthValues( /** * Return boilerplate http client for testing that uses basic auth - * + * * @param irodsAccount * @param testingProperties * @return @@ -76,7 +72,7 @@ public static IRODSAccount getIRODSAccountFromBasicAuthValues( */ public static DefaultHttpClientAndContext httpClientSetup( final IRODSAccount irodsAccount, final Properties testingProperties) - throws TestingUtilsException { + throws TestingUtilsException { if (irodsAccount == null) { throw new IllegalArgumentException("null irodsAccount"); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/auth/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/package-info.java index bee7346..8f50f9e 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/auth/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/auth/package-info.java @@ -1,6 +1,6 @@ /** * Implementation of the DataONE REST API - * + * * @author Lisa Stillwell - RENCI - UNC, Chapel Hill (www.renci.org) * */ diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java index b448572..8453586 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java @@ -2,9 +2,9 @@ /** * Pojo containing configuration information - * + * * @author Mike Conway - DICE (www.irods.org) - * + * */ public class RestConfiguration { @@ -18,7 +18,7 @@ public class RestConfiguration { private String publicKeyAbsPath = ""; private String irodsUserName; private String irodsUserPswd; - + private String handlePrefix = "11333/"; /** @@ -113,7 +113,8 @@ public boolean isSmimeEncryptAdminFunctions() { * @param smimeEncryptAdminFunctions * the smimeEncryptAdminFunctions to set */ - public void setSmimeEncryptAdminFunctions(boolean smimeEncryptAdminFunctions) { + public void setSmimeEncryptAdminFunctions( + final boolean smimeEncryptAdminFunctions) { this.smimeEncryptAdminFunctions = smimeEncryptAdminFunctions; } @@ -128,7 +129,7 @@ public String getPrivateCertAbsPath() { * @param privateCertAbsPath * the privateCertAbsPath to set */ - public void setPrivateCertAbsPath(String privateCertAbsPath) { + public void setPrivateCertAbsPath(final String privateCertAbsPath) { this.privateCertAbsPath = privateCertAbsPath; } @@ -143,7 +144,7 @@ public String getPublicKeyAbsPath() { * @param publicKeyAbsPath * the publicKeyAbsPath to set */ - public void setPublicKeyAbsPath(String publicKeyAbsPath) { + public void setPublicKeyAbsPath(final String publicKeyAbsPath) { this.publicKeyAbsPath = publicKeyAbsPath; } @@ -151,7 +152,7 @@ public String getWebInterfaceURL() { return webInterfaceURL; } - public void setWebInterfaceURL(String webInterfaceURL) { + public void setWebInterfaceURL(final String webInterfaceURL) { this.webInterfaceURL = webInterfaceURL; } @@ -159,7 +160,7 @@ public String getIrodsUserName() { return irodsUserName; } - public void setIrodsUserName(String irodsUserName) { + public void setIrodsUserName(final String irodsUserName) { this.irodsUserName = irodsUserName; } @@ -167,10 +168,8 @@ public String getIrodsUserPswd() { return irodsUserPswd; } - public void setIrodsUserPswd(String irodsUserPswd) { + public void setIrodsUserPswd(final String irodsUserPswd) { this.irodsUserPswd = irodsUserPswd; } - } - diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java index 0abfb66..4d9c60a 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java @@ -1,6 +1,6 @@ /** * Implementation of the DataONE REST API - * + * * @author Lisa Stillwell - RENCI - UNC, Chapel Hill (www.renci.org) * */ diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java b/dataone-node/src/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java index b3b61da..6575b3f 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/context/SpringApplicationContext.java @@ -9,16 +9,17 @@ public class SpringApplicationContext implements ApplicationContextAware { private static ApplicationContext appContext; // Private constructor prevents instantiation from other classes - private SpringApplicationContext() {} - + private SpringApplicationContext() { + } + @Override - public void setApplicationContext(ApplicationContext applicationContext) - throws BeansException { + public void setApplicationContext( + final ApplicationContext applicationContext) throws BeansException { appContext = applicationContext; } - public static Object getBean(String beanName) { + public static Object getBean(final String beanName) { return appContext.getBean(beanName); } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/context/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/context/package-info.java index f37755a..74cacec 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/context/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/context/package-info.java @@ -1,6 +1,6 @@ /** * Implementation of the DataONE REST API - * + * * @author Lisa Stillwell - RENCI - UNC, Chapel Hill (www.renci.org) * */ diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java index 1eb6447..9691408 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNAccessPolicy.java @@ -5,22 +5,22 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; -@XmlType(propOrder={"subject","permission"}) +@XmlType(propOrder = { "subject", "permission" }) public class MNAccessPolicy { - + private String subject; // MNSubject type? private List permission; - + public MNAccessPolicy() { - + } - + @XmlElement(name = "permission") public List getPermission() { return permission; } - - public void setPermission(List p) { + + public void setPermission(final List p) { permission = p; } @@ -28,7 +28,7 @@ public String getSubject() { return subject; } - public void setSubject(String subject) { + public void setSubject(final String subject) { this.subject = subject; } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNChecksum.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNChecksum.java index 32a07b2..c945de4 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNChecksum.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNChecksum.java @@ -8,44 +8,46 @@ @XmlRootElement(name = "checksum") public class MNChecksum { - + @XmlAttribute private String algorithm; - + @XmlValue private String value; - + public MNChecksum() { - - } - -// public String getValue() { -// return value; -// } - public void setValue(String value) { + + } + + // public String getValue() { + // return value; + // } + public void setValue(final String value) { this.value = value; } -// public String getAlgorithm() { -// return algorithm; -// } - public void setAlgorithm(String algorithm) { + + // public String getAlgorithm() { + // return algorithm; + // } + public void setAlgorithm(final String algorithm) { this.algorithm = algorithm; } - - public void copy(Checksum checksum) { - + + public void copy(final Checksum checksum) { + if (checksum == null) { - throw new IllegalArgumentException("MNChecksum::copy - Checksum is null"); + throw new IllegalArgumentException( + "MNChecksum::copy - Checksum is null"); } - + if (checksum.getValue() != null) { - this.value = checksum.getValue(); + value = checksum.getValue(); } - + if (checksum.getAlgorithm() != null) { - this.algorithm = checksum.getAlgorithm(); + algorithm = checksum.getAlgorithm(); } - + } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNError.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNError.java index 8af2a62..161508c 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNError.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNError.java @@ -1,79 +1,78 @@ package org.irods.jargon.dataone.domain; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAccessType; import org.dataone.service.exceptions.SynchronizationFailed; @XmlRootElement(name = "error") @XmlAccessorType(XmlAccessType.FIELD) public class MNError { - - @XmlAttribute - private String detailCode; - @XmlAttribute - private String errorCode; - @XmlAttribute - private String name; - @XmlAttribute - private String pid; - @XmlElement - private String description; - - public MNError() { - } - - public String getDetailCode() { - return detailCode; - } - - public void setDetailCode(String detailCode) { - this.detailCode = detailCode; - } - - public String getErrorCode() { - return errorCode; - } - - public void setErrorCode(String errorCode) { - this.errorCode = errorCode; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getPid() { - return pid; - } - - public void setPid(String pid) { - this.pid = pid; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public SynchronizationFailed copyToSynchronizationFailed() { - SynchronizationFailed syncFailed = new SynchronizationFailed( - this.detailCode, - this.description); - - syncFailed.setPid(this.pid); - - return syncFailed; - - } + + @XmlAttribute + private String detailCode; + @XmlAttribute + private String errorCode; + @XmlAttribute + private String name; + @XmlAttribute + private String pid; + @XmlElement + private String description; + + public MNError() { + } + + public String getDetailCode() { + return detailCode; + } + + public void setDetailCode(final String detailCode) { + this.detailCode = detailCode; + } + + public String getErrorCode() { + return errorCode; + } + + public void setErrorCode(final String errorCode) { + this.errorCode = errorCode; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getPid() { + return pid; + } + + public void setPid(final String pid) { + this.pid = pid; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public SynchronizationFailed copyToSynchronizationFailed() { + SynchronizationFailed syncFailed = new SynchronizationFailed( + detailCode, description); + + syncFailed.setPid(pid); + + return syncFailed; + + } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLog.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLog.java index 77a6e13..9510bc9 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLog.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLog.java @@ -3,51 +3,51 @@ import java.util.ArrayList; import java.util.List; -import org.dataone.service.types.v1.Log; -import org.dataone.service.types.v1.LogEntry; - import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; +import org.dataone.service.types.v1.Log; +import org.dataone.service.types.v1.LogEntry; + @XmlRootElement(name = "log") public class MNLog { @XmlAttribute private String count; - + @XmlAttribute private String start; - - @XmlAttribute + + @XmlAttribute private String total; - + private List logEntry; public List getLogEntry() { return logEntry; } - public void setLogEntry(List logEntry) { + public void setLogEntry(final List logEntry) { this.logEntry = logEntry; } - - public void copy(Log log) { - + + public void copy(final Log log) { + if (log == null) { throw new IllegalArgumentException("MNLogy::copy - Log is null"); } - - this.count = String.valueOf(log.getCount()); - this.start = String.valueOf(log.getStart()); - this.total = String.valueOf(log.getTotal()); - + + count = String.valueOf(log.getCount()); + start = String.valueOf(log.getStart()); + total = String.valueOf(log.getTotal()); + if (log.getLogEntryList() != null) { List logEntryList = log.getLogEntryList(); - this.logEntry = new ArrayList(); - + logEntry = new ArrayList(); + for (LogEntry l : logEntryList) { MNLogEntry mnLogEntry = new MNLogEntry(); mnLogEntry.copy(l); - this.logEntry.add(mnLogEntry); + logEntry.add(mnLogEntry); } } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java index 49dab47..d631608 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNLogEntry.java @@ -1,18 +1,15 @@ package org.irods.jargon.dataone.domain; -import java.util.Date; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlType; import org.dataone.service.types.v1.LogEntry; import org.irods.jargon.dataone.utils.ISO8601; //@XmlAccessorType(XmlAccessType.NONE) -@XmlType(propOrder={"entryId","identifier","ipAddress","userAgent","subject","event","dateLogged","nodeIdentifier"}) +@XmlType(propOrder = { "entryId", "identifier", "ipAddress", "userAgent", + "subject", "event", "dateLogged", "nodeIdentifier" }) public class MNLogEntry { - + private String entryId; private String dateLogged; private String event; @@ -21,110 +18,118 @@ public class MNLogEntry { private String ipAddress; private String userAgent; private String subject; - + public String getEntryId() { return entryId; } - public void setEntryId(String entryId) { + + public void setEntryId(final String entryId) { this.entryId = entryId; } - + public String getDateLogged() { return dateLogged; } - public void setDateLogged(String dateLogged) { + + public void setDateLogged(final String dateLogged) { this.dateLogged = dateLogged; } - + public String getEvent() { return event; } - public void setEvent(String event) { + + public void setEvent(final String event) { this.event = event; } - + public String getIdentifier() { return identifier; } - public void setIdentifier(String identifier) { + + public void setIdentifier(final String identifier) { this.identifier = identifier; } - + public String getNodeIdentifier() { return nodeIdentifier; } - public void setNodeIdentifier(String nodeIdentifier) { + + public void setNodeIdentifier(final String nodeIdentifier) { this.nodeIdentifier = nodeIdentifier; } - + public String getIpAddress() { return ipAddress; } - public void setIpAddress(String ipAddress) { + + public void setIpAddress(final String ipAddress) { this.ipAddress = ipAddress; } - + public String getUserAgent() { return userAgent; } - public void setUserAgent(String userAgent) { + + public void setUserAgent(final String userAgent) { this.userAgent = userAgent; } - + public String getSubject() { return subject; } - public void setSubject(String subject) { + + public void setSubject(final String subject) { this.subject = subject; } - - public void copy(LogEntry logEntry) { - + + public void copy(final LogEntry logEntry) { + if (logEntry == null) { - throw new IllegalArgumentException("MNLogEntry::copy - LogEntry is null"); + throw new IllegalArgumentException( + "MNLogEntry::copy - LogEntry is null"); } - + if (logEntry.getEntryId() != null) { - this.entryId = logEntry.getEntryId(); + entryId = logEntry.getEntryId(); } - + if (logEntry.getDateLogged() != null) { - this.dateLogged = ISO8601.convertToGMTString(logEntry.getDateLogged()); + dateLogged = ISO8601.convertToGMTString(logEntry.getDateLogged()); } - + if (logEntry.getEvent() != null) { - this.event = logEntry.getEvent().xmlValue(); + event = logEntry.getEvent().xmlValue(); } - + if (logEntry.getIdentifier() != null) { - this.identifier = logEntry.getIdentifier().getValue(); + identifier = logEntry.getIdentifier().getValue(); } - + if (logEntry.getNodeIdentifier() != null) { - this.nodeIdentifier = logEntry.getNodeIdentifier().getValue(); + nodeIdentifier = logEntry.getNodeIdentifier().getValue(); } - + if (logEntry.getIpAddress() != null) { - this.ipAddress = logEntry.getIpAddress(); + ipAddress = logEntry.getIpAddress(); } - + else { // need to use empty string to make this tag show up - this.ipAddress = new String(); + ipAddress = new String(); } - + if (logEntry.getUserAgent() != null) { - this.userAgent = logEntry.getUserAgent(); - } - else { + userAgent = logEntry.getUserAgent(); + } else { // need to use empty string to make this tag show up - this.userAgent = new String(); + userAgent = new String(); } - + if (logEntry.getSubject() != null) { - this.subject = logEntry.getSubject().getValue(); - } - + subject = logEntry.getSubject().getValue(); + } + } - + } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java index 7046c3d..2705c44 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java @@ -1,4 +1,3 @@ - package org.irods.jargon.dataone.domain; import java.io.IOException; @@ -24,67 +23,67 @@ import org.slf4j.LoggerFactory; @XmlRootElement(name = "node") -@XmlType(propOrder={"identifier","name","description","baseURL", - "services","synchronization","ping","subject","contactSubject"}) +@XmlType(propOrder = { "identifier", "name", "description", "baseURL", + "services", "synchronization", "ping", "subject", "contactSubject" }) public class MNNode { - + private final String serviceKey = "irods.dataone.service."; private final String serviceKeyName = ".name"; - + @XmlAttribute private String replicate; - + @XmlAttribute private String synchronize; - - @XmlAttribute + + @XmlAttribute private String type; - + @XmlAttribute private String state; - + private String identifier; // MN NodeReference type private String name; private String description; private String baseURL; private List services; private MNSynchronization synchronization; -// private NodeReplicationPolicy nodeReplicationPolicy; + // private NodeReplicationPolicy nodeReplicationPolicy; private MNPing ping; private List subject; private List contactSubject; - + private Logger log = LoggerFactory.getLogger(this.getClass()); - + public MNNode() { initializeProperties(); } - + private void initializeProperties() { Properties prop = new Properties(); InputStream input = null; - + try { String filename = "d1client.properties"; input = getClass().getClassLoader().getResourceAsStream(filename); - + // load a properties file prop.load(input); - - this.replicate = prop.getProperty("irods.dataone.replicate"); - this.synchronize = prop.getProperty("irods.dataone.synchronize"); - this.type = prop.getProperty("irods.dataone.type"); - //TODO: make sure proper exceptions are caught and handled - - this.identifier = prop.getProperty("irods.dataone.identifier"); - this.name = prop.getProperty("irods.dataone.name"); - this.description = prop.getProperty("irods.dataone.description"); - this.baseURL = prop.getProperty("irods.dataone.baseurl"); - this.services = initServices(prop); - this.synchronization = initSychronization(prop); -// this.subject = initSubjects(prop); -// this.contactSubject = initContactSubjects(prop); - + + replicate = prop.getProperty("irods.dataone.replicate"); + synchronize = prop.getProperty("irods.dataone.synchronize"); + type = prop.getProperty("irods.dataone.type"); + // TODO: make sure proper exceptions are caught and handled + + identifier = prop.getProperty("irods.dataone.identifier"); + name = prop.getProperty("irods.dataone.name"); + description = prop.getProperty("irods.dataone.description"); + baseURL = prop.getProperty("irods.dataone.baseurl"); + services = initServices(prop); + synchronization = initSychronization(prop); + // this.subject = initSubjects(prop); + // this.contactSubject = initContactSubjects(prop); + } catch (IOException ex) { ex.printStackTrace(); } finally { @@ -97,207 +96,218 @@ private void initializeProperties() { } } } - - private List initContactSubjects(Properties prop) { + + private List initContactSubjects(final Properties prop) { // TODO Auto-generated method stub return null; } - private List initSubjects(Properties prop) { + private List initSubjects(final Properties prop) { // TODO Auto-generated method stub return null; } - private MNSynchronization initSychronization(Properties prop) { + private MNSynchronization initSychronization(final Properties prop) { MNSynchronization mnSynchronization = new MNSynchronization(); - + return mnSynchronization; } - private List initServices(Properties prop) { + private List initServices(final Properties prop) { List services = new ArrayList(); - + Enumeration keys = prop.propertyNames(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); - if((key.startsWith(this.serviceKey)) && (key.endsWith(this.serviceKeyName))) { + if ((key.startsWith(serviceKey)) && (key.endsWith(serviceKeyName))) { String serviceName = prop.getProperty(key); MNService service = new MNService(); service.setName(serviceName); - String isServiceAvailableKey = this.serviceKey + serviceName.toLowerCase(); - String isServiceAvailableValue = prop.getProperty(isServiceAvailableKey); - service.setAvailable(Boolean.parseBoolean(isServiceAvailableValue)); + String isServiceAvailableKey = serviceKey + + serviceName.toLowerCase(); + String isServiceAvailableValue = prop + .getProperty(isServiceAvailableKey); + service.setAvailable(Boolean + .parseBoolean(isServiceAvailableValue)); String verKey = isServiceAvailableKey + ".version"; service.setVersion(prop.getProperty(verKey)); services.add(service); } } - + return services; } - //public NodeReference getIdentifier() { + // public NodeReference getIdentifier() { public String getIdentifier() { return identifier; } - public void setIdentifier(String identifier) { + + public void setIdentifier(final String identifier) { this.identifier = identifier; } - + public String getName() { return name; } - public void setName(String name) { + + public void setName(final String name) { this.name = name; } - + public String getDescription() { return description; } - public void setDescription(String description) { + + public void setDescription(final String description) { this.description = description; } - + public String getBaseURL() { return baseURL; } - public void setBaseURL(String baseURL) { + + public void setBaseURL(final String baseURL) { this.baseURL = baseURL; } - + @XmlElementWrapper(name = "services") @XmlElement(name = "service") public List getServices() { return services; } - public void setServices(List services) { + + public void setServices(final List services) { this.services = services; } - + public MNSynchronization getSynchronization() { return synchronization; } - public void setSynchronization(MNSynchronization synchronization) { + + public void setSynchronization(final MNSynchronization synchronization) { this.synchronization = synchronization; } - + public MNPing getPing() { return ping; } - public void setPing(MNPing ping) { + + public void setPing(final MNPing ping) { this.ping = ping; } - -// public MNSubject getSubject() { -// return subject; -// } -// public void setSubject(MNSubject subject) { -// this.subject = subject; -// } -// -// public MNSubject getContactSubject() { -// return contactSubject; -// } -// public void setContactSubject(MNSubject contactSubject) { -// this.contactSubject = contactSubject; -// } - + + // public MNSubject getSubject() { + // return subject; + // } + // public void setSubject(MNSubject subject) { + // this.subject = subject; + // } + // + // public MNSubject getContactSubject() { + // return contactSubject; + // } + // public void setContactSubject(MNSubject contactSubject) { + // this.contactSubject = contactSubject; + // } + public List getSubject() { return subject; } - public void setSubject(List subject) { + + public void setSubject(final List subject) { this.subject = subject; } - - + public List getContactSubject() { return contactSubject; } - public void setContactSubject(List contactSubject) { + + public void setContactSubject(final List contactSubject) { this.contactSubject = contactSubject; } - -// public NodeReplicationPolicy getNodeReplicationPolicy() { -// return nodeReplicationPolicy; -// } -// -// public void setNodeReplicationPolicy(NodeReplicationPolicy nodeReplicationPolicy) { -// this.nodeReplicationPolicy = nodeReplicationPolicy; -// } - - - public void copy(Node node) { - + + // public NodeReplicationPolicy getNodeReplicationPolicy() { + // return nodeReplicationPolicy; + // } + // + // public void setNodeReplicationPolicy(NodeReplicationPolicy + // nodeReplicationPolicy) { + // this.nodeReplicationPolicy = nodeReplicationPolicy; + // } + + public void copy(final Node node) { + if (node == null) { throw new IllegalArgumentException("MNNode::copy - Node is null"); } - - this.replicate = Boolean.toString(node.isReplicate()); - this.synchronize = Boolean.toString(node.isSynchronize()); - + + replicate = Boolean.toString(node.isReplicate()); + synchronize = Boolean.toString(node.isSynchronize()); + if (node.getType() != null) { - this.type = node.getType().name(); + type = node.getType().name(); } - + if (node.getState() != null) { - this.state = node.getState().xmlValue(); + state = node.getState().xmlValue(); } - + if (node.getIdentifier() != null) { - this.identifier = node.getIdentifier().getValue(); + identifier = node.getIdentifier().getValue(); } - + if (node.getName() != null) { - this.name = node.getName(); + name = node.getName(); } - + if (node.getDescription() != null) { - this.description = node.getDescription(); + description = node.getDescription(); } - + if (node.getBaseURL() != null) { - this.baseURL = node.getBaseURL(); + baseURL = node.getBaseURL(); } - + if (node.getServices() != null) { Services services = node.getServices(); List serviceList = services.getServiceList(); this.services = new ArrayList(); - + for (Service s : serviceList) { MNService mnService = new MNService(); mnService.copy(s); this.services.add(mnService); } } - + if (node.getSynchronization() != null) { Synchronization synch = node.getSynchronization(); - this.synchronization = new MNSynchronization(); - this.synchronization.copy(synch); + synchronization = new MNSynchronization(); + synchronization.copy(synch); } - + if (node.getPing() != null) { Ping ping = node.getPing(); this.ping = new MNPing(); - this.ping.copy(ping); + this.ping.copy(ping); } - + if (node.getSubjectList() != null) { List subjectList = node.getSubjectList(); - this.subject = new ArrayList(); + subject = new ArrayList(); for (Subject s : subjectList) { - this.subject.add(s.getValue()); + subject.add(s.getValue()); } } if (node.getContactSubjectList() != null) { List subjectList = node.getContactSubjectList(); - this.contactSubject = new ArrayList(); + contactSubject = new ArrayList(); for (Subject s : subjectList) { - this.contactSubject.add(s.getValue()); + contactSubject.add(s.getValue()); } } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java index 8d262ac..3bf06a6 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectInfo.java @@ -1,81 +1,91 @@ package org.irods.jargon.dataone.domain; -import java.util.Date; - import javax.xml.bind.annotation.XmlType; import org.dataone.service.types.v1.Checksum; import org.dataone.service.types.v1.ObjectInfo; import org.irods.jargon.dataone.utils.ISO8601; -@XmlType(propOrder={"identifier","formatId","checksum","dateSysMetadataModified","size"}) +@XmlType(propOrder = { "identifier", "formatId", "checksum", + "dateSysMetadataModified", "size" }) public class MNObjectInfo { - + private String identifier; private String formatId; private MNChecksum checksum; private String dateSysMetadataModified; private long size; - + public String getIdentifier() { return identifier; } - public void setIdentifier(String identifier) { + + public void setIdentifier(final String identifier) { this.identifier = identifier; } + public String getFormatId() { return formatId; } - public void setFormatId(String formatId) { + + public void setFormatId(final String formatId) { this.formatId = formatId; } + public MNChecksum getChecksum() { return checksum; } - public void setChecksum(MNChecksum checksum) { + + public void setChecksum(final MNChecksum checksum) { this.checksum = checksum; } + public String getDateSysMetadataModified() { return dateSysMetadataModified; } - public void setDateSysMetadataModified(String dateSysMetadataModified) { + + public void setDateSysMetadataModified(final String dateSysMetadataModified) { this.dateSysMetadataModified = dateSysMetadataModified; } + public long getSize() { return size; } - public void setSize(long size) { + + public void setSize(final long size) { this.size = size; } - - public void copy(ObjectInfo objectInfo){ - + + public void copy(final ObjectInfo objectInfo) { + if (objectInfo == null) { - throw new IllegalArgumentException("MNObjectInfo::copy - ObjectInfo is null"); + throw new IllegalArgumentException( + "MNObjectInfo::copy - ObjectInfo is null"); } - + if (objectInfo.getIdentifier() != null) { - this.identifier = objectInfo.getIdentifier().getValue(); + identifier = objectInfo.getIdentifier().getValue(); } - + if (objectInfo.getFormatId() != null) { - this.formatId = objectInfo.getFormatId().getValue(); + formatId = objectInfo.getFormatId().getValue(); } - + if (objectInfo.getChecksum() != null) { Checksum newChecksum = objectInfo.getChecksum(); - this.checksum = new MNChecksum(); - this.checksum.copy(newChecksum); + checksum = new MNChecksum(); + checksum.copy(newChecksum); } - + if (objectInfo.getDateSysMetadataModified() != null) { - this.dateSysMetadataModified = ISO8601.convertToGMTString(objectInfo.getDateSysMetadataModified()); + dateSysMetadataModified = ISO8601.convertToGMTString(objectInfo + .getDateSysMetadataModified()); } - + if (objectInfo.getSize() != null) { - this.size = objectInfo.getSize().longValue(); + size = objectInfo.getSize().longValue(); } - + } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectList.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectList.java index 57f72d1..f5b84b8 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectList.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNObjectList.java @@ -11,59 +11,60 @@ @XmlRootElement(name = "objectList") public class MNObjectList { - + @XmlAttribute private int count; - + @XmlAttribute private int start; - + @XmlAttribute private int total; - + private List objectInfo; - - public void setCnt(int cnt) { - this.count = cnt; + + public void setCnt(final int cnt) { + count = cnt; } - - public void setStrt(int strt) { - this.start = strt; + + public void setStrt(final int strt) { + start = strt; } - - public void setTot(int tot) { - this.total = tot; + + public void setTot(final int tot) { + total = tot; } public List getObjectInfo() { return objectInfo; } - public void setObjectInfo(List objectInfo) { + public void setObjectInfo(final List objectInfo) { this.objectInfo = objectInfo; } - - public void copy(ObjectList objectList) { - + + public void copy(final ObjectList objectList) { + if (objectList == null) { - throw new IllegalArgumentException("MNObjectList::copy - ObjectList is null"); + throw new IllegalArgumentException( + "MNObjectList::copy - ObjectList is null"); } - - this.count = objectList.getCount(); - this.start = objectList.getStart(); - this.total = objectList.getTotal(); - + + count = objectList.getCount(); + start = objectList.getStart(); + total = objectList.getTotal(); + if (objectList.getObjectInfoList() != null) { List newObjectInfoList = objectList.getObjectInfoList(); - this.objectInfo = new ArrayList(); - + objectInfo = new ArrayList(); + for (ObjectInfo oi : newObjectInfoList) { MNObjectInfo mnObjectInfo = new MNObjectInfo(); mnObjectInfo.copy(oi); - this.objectInfo.add(mnObjectInfo); + objectInfo.add(mnObjectInfo); } } - + } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java index 0e17917..af07579 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPermissionEnum.java @@ -4,34 +4,36 @@ import org.irods.jargon.core.protovalues.FilePermissionEnum; public enum MNPermissionEnum { - READ("read", FilePermissionEnum.READ, Permission.READ), - WRITE("write", FilePermissionEnum.WRITE, Permission.WRITE), - CHANGE("changePermission", FilePermissionEnum.OWN, Permission.CHANGE_PERMISSION); - + READ("read", FilePermissionEnum.READ, Permission.READ), WRITE("write", + FilePermissionEnum.WRITE, Permission.WRITE), CHANGE( + "changePermission", FilePermissionEnum.OWN, + Permission.CHANGE_PERMISSION); + private String permission; private FilePermissionEnum irodsPermissionEnum; private Permission dataOnePermissionEnum; - - private MNPermissionEnum(String p, FilePermissionEnum i, Permission d) { - this.permission = p; - this.irodsPermissionEnum = i; - this.dataOnePermissionEnum = d; + + private MNPermissionEnum(final String p, final FilePermissionEnum i, + final Permission d) { + permission = p; + irodsPermissionEnum = i; + dataOnePermissionEnum = d; } - + public String getPermission() { return permission; } - + public FilePermissionEnum getIrodsPermissionEnum() { return irodsPermissionEnum; } - + public Permission getDataOnePermissionEnum() { return dataOnePermissionEnum; } - + public static MNPermissionEnum valueForWeb(final Permission p) { - switch(p) { + switch (p) { case READ: return MNPermissionEnum.READ; case WRITE: @@ -42,9 +44,9 @@ public static MNPermissionEnum valueForWeb(final Permission p) { return MNPermissionEnum.READ; } } - + public static FilePermissionEnum valueForIrods(final Permission p) { - switch(p) { + switch (p) { case READ: return FilePermissionEnum.READ; case WRITE: @@ -55,9 +57,9 @@ public static FilePermissionEnum valueForIrods(final Permission p) { return FilePermissionEnum.READ; } } - + public static Permission valueForDataOne(final FilePermissionEnum p) { - switch(p) { + switch (p) { case READ: return Permission.READ; case WRITE: diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPing.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPing.java index 04eb302..f9e505a 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPing.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNPing.java @@ -8,25 +8,26 @@ @XmlAccessorType(XmlAccessType.NONE) public class MNPing { - + @XmlAttribute private boolean success; public boolean getSuccess() { return success; } - public void setSuccess(boolean success) { + + public void setSuccess(final boolean success) { this.success = success; } - - public void copy(Ping ping) { - + + public void copy(final Ping ping) { + if (ping == null) { throw new IllegalArgumentException("MNPing::copy - Ping is null"); } - + if (ping.getSuccess() != null) { - this.success = ping.getSuccess().booleanValue(); + success = ping.getSuccess().booleanValue(); } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java index de3d658..05b8cf5 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNReplicationPolicy.java @@ -3,15 +3,15 @@ import javax.xml.bind.annotation.XmlAttribute; public class MNReplicationPolicy { - + @XmlAttribute private boolean replicationAllowed; - + public MNReplicationPolicy() { - + } - - public void setReplicationAllowed(boolean flag) { + + public void setReplicationAllowed(final boolean flag) { replicationAllowed = flag; } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java index 9fb005a..623d955 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java @@ -1,6 +1,5 @@ package org.irods.jargon.dataone.domain; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; @@ -13,7 +12,7 @@ @XmlAccessorType(XmlAccessType.NONE) public class MNSchedule { - + @XmlAttribute private String hour; @XmlAttribute @@ -28,31 +27,31 @@ public class MNSchedule { private String wday; @XmlAttribute private String year; - + public MNSchedule() { initializeProperties(); } - + private void initializeProperties() { Properties prop = new Properties(); InputStream input = null; - + try { - + String filename = "d1client.properties"; input = getClass().getClassLoader().getResourceAsStream(filename); - + // load a properties file prop.load(input); - - this.hour = prop.getProperty("irods.dataone.sync.schedule.hour"); - this.mday = prop.getProperty("irods.dataone.sync.schedule.mday"); - this.min = prop.getProperty("irods.dataone.sync.schedule.min"); - this.mon = prop.getProperty("irods.dataone.sync.schedule.mon"); - this.sec = prop.getProperty("irods.dataone.sync.schedule.sec"); - this.wday = prop.getProperty("irods.dataone.sync.schedule.wday"); - this.year = prop.getProperty("irods.dataone.sync.schedule.year"); - + + hour = prop.getProperty("irods.dataone.sync.schedule.hour"); + mday = prop.getProperty("irods.dataone.sync.schedule.mday"); + min = prop.getProperty("irods.dataone.sync.schedule.min"); + mon = prop.getProperty("irods.dataone.sync.schedule.mon"); + sec = prop.getProperty("irods.dataone.sync.schedule.sec"); + wday = prop.getProperty("irods.dataone.sync.schedule.wday"); + year = prop.getProperty("irods.dataone.sync.schedule.year"); + } catch (IOException ex) { ex.printStackTrace(); } finally { @@ -65,89 +64,89 @@ private void initializeProperties() { } } } -// public String getHour() { -// return hour; -// } -// public void setHour(String hour) { -// this.hour = hour; -// } -// -// public String getMday() { -// return mday; -// } -// public void setMday(String mday) { -// this.mday = mday; -// } -// -// public String getMin() { -// return min; -// } -// public void setMin(String min) { -// this.min = min; -// } -// -// public String getMon() { -// return mon; -// } -// public void setMon(String mon) { -// this.mon = mon; -// } -// -// public String getSec() { -// return sec; -// } -// public void setSec(String sec) { -// this.sec = sec; -// } -// -// public String getWday() { -// return wday; -// } -// public void setWday(String wday) { -// this.wday = wday; -// } -// -// public String getYear() { -// return year; -// } -// public void setYear(String year) { -// this.year = year; -// } - - - public void copy(Schedule s) { - + + // public String getHour() { + // return hour; + // } + // public void setHour(String hour) { + // this.hour = hour; + // } + // + // public String getMday() { + // return mday; + // } + // public void setMday(String mday) { + // this.mday = mday; + // } + // + // public String getMin() { + // return min; + // } + // public void setMin(String min) { + // this.min = min; + // } + // + // public String getMon() { + // return mon; + // } + // public void setMon(String mon) { + // this.mon = mon; + // } + // + // public String getSec() { + // return sec; + // } + // public void setSec(String sec) { + // this.sec = sec; + // } + // + // public String getWday() { + // return wday; + // } + // public void setWday(String wday) { + // this.wday = wday; + // } + // + // public String getYear() { + // return year; + // } + // public void setYear(String year) { + // this.year = year; + // } + + public void copy(final Schedule s) { + if (s == null) { return; // TODO: log something here? } - + if (s.getHour() != null) { - this.hour = s.getHour(); + hour = s.getHour(); } - + if (s.getMday() != null) { - this.mday = s.getMday(); + mday = s.getMday(); } - + if (s.getMin() != null) { - this.min = s.getMin(); + min = s.getMin(); } - + if (s.getMon() != null) { - this.mon = s.getMon(); + mon = s.getMon(); } - + if (s.getSec() != null) { - this.sec = s.getSec(); + sec = s.getSec(); } - + if (s.getWday() != null) { - this.wday = s.getWday(); + wday = s.getWday(); } - + if (s.getYear() != null) { - this.year = s.getYear(); + year = s.getYear(); } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNService.java index 4e59ffd..d08dd1c 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNService.java @@ -1,61 +1,61 @@ package org.irods.jargon.dataone.domain; -import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; import org.dataone.service.types.v1.Service; @XmlAccessorType(XmlAccessType.NONE) public class MNService { - + @XmlAttribute private String name; @XmlAttribute private String version; @XmlAttribute private boolean available; - + public String getName() { return name; } - - public void setName(String name) { + + public void setName(final String name) { this.name = name; } - + public String getVersion() { return version; } - - public void setVersion(String version) { + + public void setVersion(final String version) { this.version = version; } - + public boolean isAvailable() { return available; } - - public void setAvailable(boolean available) { + + public void setAvailable(final boolean available) { this.available = available; } - - public void copy(Service service) { + + public void copy(final Service service) { if (service == null) { - throw new IllegalArgumentException("MNService::copy - Service is null"); + throw new IllegalArgumentException( + "MNService::copy - Service is null"); } - + if (service.getName() != null) { - this.name = service.getName(); + name = service.getName(); } - + if (service.getVersion() != null) { - this.version = service.getVersion(); + version = service.getVersion(); } - + if (service.getAvailable() != null) { - this.available = service.getAvailable().booleanValue(); + available = service.getAvailable().booleanValue(); } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java index 8e87450..9e8a42e 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSynchronization.java @@ -1,33 +1,27 @@ package org.irods.jargon.dataone.domain; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - import javax.xml.bind.annotation.XmlType; import org.dataone.service.types.v1.Schedule; -import org.dataone.service.types.v1.Service; -import org.dataone.service.types.v1.Services; import org.dataone.service.types.v1.Synchronization; import org.irods.jargon.dataone.utils.ISO8601; -@XmlType(propOrder={"schedule","lastHarvested","lastCompleteHarvest"}) +@XmlType(propOrder = { "schedule", "lastHarvested", "lastCompleteHarvest" }) public class MNSynchronization { - + private String lastHarvested; private String lastCompleteHarvest; private MNSchedule schedule; - + public MNSynchronization() { - this.schedule = new MNSchedule(); + schedule = new MNSchedule(); } - + public String getLastHarvested() { return lastHarvested; } - public void setLastHarvested(String lastHarvested) { + public void setLastHarvested(final String lastHarvested) { this.lastHarvested = lastHarvested; } @@ -35,7 +29,7 @@ public String getLastCompleteHarvest() { return lastCompleteHarvest; } - public void setLastCompleteHarvest(String lastCompleteHarvest) { + public void setLastCompleteHarvest(final String lastCompleteHarvest) { this.lastCompleteHarvest = lastCompleteHarvest; } @@ -43,28 +37,31 @@ public MNSchedule getSchedule() { return schedule; } - public void setSchedule(MNSchedule schedule) { + public void setSchedule(final MNSchedule schedule) { this.schedule = schedule; } - - public void copy(Synchronization synch) { - + + public void copy(final Synchronization synch) { + if (synch == null) { - throw new IllegalArgumentException("MNSynchronization::copy - Synchronization is null"); + throw new IllegalArgumentException( + "MNSynchronization::copy - Synchronization is null"); } - + if (synch.getLastHarvested() != null) { - this.lastHarvested = ISO8601.convertToGMTString(synch.getLastHarvested()); + lastHarvested = ISO8601 + .convertToGMTString(synch.getLastHarvested()); } - + if (synch.getLastCompleteHarvest() != null) { - this.lastCompleteHarvest = ISO8601.convertToGMTString(synch.getLastCompleteHarvest()); + lastCompleteHarvest = ISO8601.convertToGMTString(synch + .getLastCompleteHarvest()); } - + if (synch.getSchedule() != null) { Schedule s = synch.getSchedule(); - this.schedule = new MNSchedule(); - this.schedule.copy(s); + schedule = new MNSchedule(); + schedule.copy(s); } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java index 480a780..1d0d6d1 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSystemMetadata.java @@ -1,7 +1,6 @@ package org.irods.jargon.dataone.domain; import java.util.ArrayList; -import java.util.Date; import java.util.List; import javax.xml.bind.annotation.XmlElement; @@ -13,16 +12,13 @@ import org.dataone.service.types.v1.Permission; import org.dataone.service.types.v1.SystemMetadata; import org.irods.jargon.dataone.utils.ISO8601; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @XmlRootElement(name = "systemMetadata") -@XmlType(propOrder={"serialVersion","identifier","formatId","size", - "checksum","submitter","rightsHolder","accessPolicy", - "replicationPolicy","obsoletes","obsoletedBy","archived", - "dateUploaded","dateSysMetadataModified","originMemberNode", - "authoritativeMemberNode"}) - +@XmlType(propOrder = { "serialVersion", "identifier", "formatId", "size", + "checksum", "submitter", "rightsHolder", "accessPolicy", + "replicationPolicy", "obsoletes", "obsoletedBy", "archived", + "dateUploaded", "dateSysMetadataModified", "originMemberNode", + "authoritativeMemberNode" }) public class MNSystemMetadata { private long serialVersion; @@ -30,8 +26,8 @@ public class MNSystemMetadata { private String formatId; private long size; private MNChecksum checksum; -// private MNSubject submitter; NOTE: a Subject is just a string -// private MNSubject rightsHolder; + // private MNSubject submitter; NOTE: a Subject is just a string + // private MNSubject rightsHolder; private String submitter; private String rightsHolder; private List accessPolicy; @@ -43,210 +39,180 @@ public class MNSystemMetadata { private String dateSysMetadataModified; private String originMemberNode; private String authoritativeMemberNode; - + public MNSystemMetadata() { - + } - - + @XmlElementWrapper(name = "accessPolicy") @XmlElement(name = "allow") public List getAccessPolicy() { return accessPolicy; } - - public void setAccessPolicy(List ap) { - this.accessPolicy = ap; - } + public void setAccessPolicy(final List ap) { + accessPolicy = ap; + } public long getSerialVersion() { return serialVersion; } - - public void setSerialVersion(long serialVersion) { + public void setSerialVersion(final long serialVersion) { this.serialVersion = serialVersion; } - public String getIdentifier() { return identifier; } - - public void setIdentifier(String identifier) { + public void setIdentifier(final String identifier) { this.identifier = identifier; } - public String getFormatId() { return formatId; } - - public void setFormatId(String formatId) { + public void setFormatId(final String formatId) { this.formatId = formatId; } - public long getSize() { return size; } - - public void setSize(long size) { + public void setSize(final long size) { this.size = size; } - public MNChecksum getChecksum() { return checksum; } - - public void setChecksum(MNChecksum checksum) { + public void setChecksum(final MNChecksum checksum) { this.checksum = checksum; } - public String getSubmitter() { return submitter; } - - public void setSubmitter(String submitter) { + public void setSubmitter(final String submitter) { this.submitter = submitter; } - public String getRightsHolder() { return rightsHolder; } - - public void setRightsHolder(String rightsHolder) { + public void setRightsHolder(final String rightsHolder) { this.rightsHolder = rightsHolder; } - public MNReplicationPolicy getReplicationPolicy() { return replicationPolicy; } - - public void setReplicationPolicy(MNReplicationPolicy replicationPolicy) { + public void setReplicationPolicy(final MNReplicationPolicy replicationPolicy) { this.replicationPolicy = replicationPolicy; } - public String getObsoletes() { return obsoletes; } - - public void setObsoletes(String obsoletes) { + public void setObsoletes(final String obsoletes) { this.obsoletes = obsoletes; } - public String getObsoletedBy() { return obsoletedBy; } - - public void setObsoletedBy(String obsoletedBy) { + public void setObsoletedBy(final String obsoletedBy) { this.obsoletedBy = obsoletedBy; } - public boolean isArchived() { return archived; } - - public void setArchived(boolean archived) { + public void setArchived(final boolean archived) { this.archived = archived; } - public String getDateUploaded() { return dateUploaded; } - - public void setDateUploaded(String dateUploaded) { + public void setDateUploaded(final String dateUploaded) { this.dateUploaded = dateUploaded; } - public String getDateSysMetadataModified() { return dateSysMetadataModified; } - - public void setDateSysMetadataModified(String dateSysMetadataModified) { + public void setDateSysMetadataModified(final String dateSysMetadataModified) { this.dateSysMetadataModified = dateSysMetadataModified; } - public String getOriginMemberNode() { return originMemberNode; } - - public void setOriginMemberNode(String originMemberNode) { + public void setOriginMemberNode(final String originMemberNode) { this.originMemberNode = originMemberNode; } - public String getAuthoritativeMemberNode() { return authoritativeMemberNode; } - - public void setAuthoritativeMemberNode(String authoritativeMemberNode) { + public void setAuthoritativeMemberNode(final String authoritativeMemberNode) { this.authoritativeMemberNode = authoritativeMemberNode; } - - public void copy(SystemMetadata metadata) { + public void copy(final SystemMetadata metadata) { if (metadata == null) { - throw new IllegalArgumentException("MNSystemMetadata::copy - SystemMetadata is null"); + throw new IllegalArgumentException( + "MNSystemMetadata::copy - SystemMetadata is null"); } - + if (metadata.getSerialVersion() != null) { - this.serialVersion = metadata.getSerialVersion().longValue(); + serialVersion = metadata.getSerialVersion().longValue(); } - + if (metadata.getIdentifier() != null) { - this.identifier = metadata.getIdentifier().getValue(); + identifier = metadata.getIdentifier().getValue(); } - + if (metadata.getFormatId() != null) { - this.formatId = metadata.getFormatId().getValue(); + formatId = metadata.getFormatId().getValue(); } - + if (metadata.getSize() != null) { - this.size = metadata.getSize().longValue(); + size = metadata.getSize().longValue(); } - + if (metadata.getChecksum() != null) { MNChecksum checksum = new MNChecksum(); checksum.setValue(metadata.getChecksum().getValue()); checksum.setAlgorithm(metadata.getChecksum().getAlgorithm()); this.checksum = checksum; } - + if (metadata.getSubmitter() != null) { - this.submitter = metadata.getSubmitter().getValue(); + submitter = metadata.getSubmitter().getValue(); } - + if (metadata.getRightsHolder() != null) { - this.rightsHolder = metadata.getRightsHolder().getValue(); + rightsHolder = metadata.getRightsHolder().getValue(); } - - if ((metadata.getAccessPolicy() != null) && (metadata.getAccessPolicy().sizeAllowList()) > 0) { + + if ((metadata.getAccessPolicy() != null) + && (metadata.getAccessPolicy().sizeAllowList()) > 0) { List accessPolicies = new ArrayList(); for (AccessRule rule : metadata.getAccessPolicy().getAllowList()) { MNAccessPolicy policy = new MNAccessPolicy(); @@ -258,38 +224,41 @@ public void copy(SystemMetadata metadata) { policy.setPermission(permissions); accessPolicies.add(policy); } - this.accessPolicy = accessPolicies; + accessPolicy = accessPolicies; } - + if (metadata.getReplicationPolicy() != null) { - this.replicationPolicy = new MNReplicationPolicy(); - this.replicationPolicy.setReplicationAllowed(metadata.getReplicationPolicy().getReplicationAllowed()); + replicationPolicy = new MNReplicationPolicy(); + replicationPolicy.setReplicationAllowed(metadata + .getReplicationPolicy().getReplicationAllowed()); } - + if (metadata.getObsoletes() != null) { - this.obsoletes = metadata.getObsoletes().getValue(); + obsoletes = metadata.getObsoletes().getValue(); } - + if (metadata.getObsoletedBy() != null) { - this.obsoletedBy = metadata.getObsoletedBy().getValue(); + obsoletedBy = metadata.getObsoletedBy().getValue(); } if (metadata.getArchived() != null) { - this.archived = metadata.getArchived(); + archived = metadata.getArchived(); } - - this.dateUploaded = ISO8601.convertToGMTString(metadata.getDateUploaded()); - this.dateSysMetadataModified = ISO8601.convertToGMTString(metadata.getDateSysMetadataModified()); - + + dateUploaded = ISO8601.convertToGMTString(metadata.getDateUploaded()); + dateSysMetadataModified = ISO8601.convertToGMTString(metadata + .getDateSysMetadataModified()); + if (metadata.getOriginMemberNode() != null) { - this.originMemberNode = metadata.getOriginMemberNode().getValue(); + originMemberNode = metadata.getOriginMemberNode().getValue(); } - + if (metadata.getAuthoritativeMemberNode() != null) { - this.authoritativeMemberNode = metadata.getAuthoritativeMemberNode().getValue(); - } - + authoritativeMemberNode = metadata.getAuthoritativeMemberNode() + .getValue(); + } + return; } - + } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/ServerInfo.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/ServerInfo.java index a25c1b0..f3caf59 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/ServerInfo.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/ServerInfo.java @@ -1,5 +1,5 @@ /** - * + * */ package org.irods.jargon.dataone.domain; @@ -8,15 +8,14 @@ import javax.xml.bind.annotation.XmlRootElement; import org.irods.jargon.core.connection.IRODSServerProperties.IcatEnabled; -import org.jboss.resteasy.annotations.providers.jaxb.json.BadgerFish; /** * Information about the server for representation as XML or JSON - * + * * @author Mike Conway - DICE (www.irods.org) */ @XmlRootElement(name = "serverInfo") -//@BadgerFish +// @BadgerFish public class ServerInfo { private Date initializeDate = new Date(); @@ -26,7 +25,7 @@ public class ServerInfo { private String apiVersion = ""; private String rodsZone = ""; /** - * + * */ private long currentServerTime = 0; @@ -34,7 +33,7 @@ public Date getInitializeDate() { return initializeDate; } - public void setInitializeDate(Date initializeDate) { + public void setInitializeDate(final Date initializeDate) { this.initializeDate = initializeDate; } @@ -42,7 +41,7 @@ public IcatEnabled getIcatEnabled() { return icatEnabled; } - public void setIcatEnabled(IcatEnabled icatEnabled) { + public void setIcatEnabled(final IcatEnabled icatEnabled) { this.icatEnabled = icatEnabled; } @@ -50,7 +49,7 @@ public int getServerBootTime() { return serverBootTime; } - public void setServerBootTime(int serverBootTime) { + public void setServerBootTime(final int serverBootTime) { this.serverBootTime = serverBootTime; } @@ -58,7 +57,7 @@ public String getRelVersion() { return relVersion; } - public void setRelVersion(String relVersion) { + public void setRelVersion(final String relVersion) { this.relVersion = relVersion; } @@ -66,7 +65,7 @@ public String getApiVersion() { return apiVersion; } - public void setApiVersion(String apiVersion) { + public void setApiVersion(final String apiVersion) { this.apiVersion = apiVersion; } @@ -74,7 +73,7 @@ public String getRodsZone() { return rodsZone; } - public void setRodsZone(String rodsZone) { + public void setRodsZone(final String rodsZone) { this.rodsZone = rodsZone; } @@ -82,7 +81,7 @@ public long getCurrentServerTime() { return currentServerTime; } - public void setCurrentServerTime(long currentServerTime) { + public void setCurrentServerTime(final long currentServerTime) { this.currentServerTime = currentServerTime; } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/package-info.java index d3b966f..c0ac441 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/package-info.java @@ -1,18 +1,14 @@ /** - * + * */ /** * @author lisa * */ -@XmlSchema( - namespace = "http://ns.dataone.org/service/types/v1", - elementFormDefault = XmlNsForm.UNQUALIFIED, - xmlns = { - @XmlNs(namespaceURI = "http://ns.dataone.org/service/types/v1", prefix = "d1") - } -) +@XmlSchema(namespace = "http://ns.dataone.org/service/types/v1", elementFormDefault = XmlNsForm.UNQUALIFIED, xmlns = { @XmlNs(namespaceURI = "http://ns.dataone.org/service/types/v1", prefix = "d1") }) package org.irods.jargon.dataone.domain; -import javax.xml.bind.annotation.XmlSchema; + import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; +import javax.xml.bind.annotation.XmlSchema; + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java b/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java index 4ca3cfc..726d9d6 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java @@ -6,21 +6,22 @@ import org.dataone.service.types.v1.Event; import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.Log; -import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.exception.InvalidArgumentException; +import org.irods.jargon.core.exception.JargonException; -// implements access to the iRODS event log +// implements access to the iRODS event log public interface EventLogAO { - + // retrieve list of logEntry (events) - //log?[fromDate={fromDate}][&toDate={toDate}][&event={event}][&pidFilter={pidFilter}][&start={start}][&count={count}] + // log?[fromDate={fromDate}][&toDate={toDate}][&event={event}][&pidFilter={pidFilter}][&start={start}][&count={count}] // use elastic search api to retrieve events - public Log getLogs(Date fromDate, Date toDate, EventsEnum event, String pidFilter, int startIdx, int count); - - + public Log getLogs(Date fromDate, Date toDate, EventsEnum event, + String pidFilter, int startIdx, int count); + // execute rule to add event to databook event log - // sendAccess("synch_failure", user name, data object identifier, timestamp in seconds, short description); - public void recordEvent(Event event, Identifier id, String description) - throws InvalidArgumentException, JargonException, ServiceFailure; + // sendAccess("synch_failure", user name, data object identifier, timestamp + // in seconds, short description); + public void recordEvent(Event event, Identifier id, String description) + throws InvalidArgumentException, JargonException, ServiceFailure; } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java b/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java index 143ef20..6bd4019 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java @@ -4,39 +4,37 @@ // Use this class to convert iRODS/Databook type events to DataONE events public enum EventsEnum { - FAILED(Event.REPLICATION_FAILED, "failed"), - CREATE(Event.CREATE, "put"), - READ(Event.READ, "get"), - UPDATE(Event.UPDATE, "overwrite"), - DELETE(Event.DELETE, "delete"), - REPLICATE(Event.REPLICATE, "replicate"), - SYNCHRONIZATION_FAILED(Event.SYNCHRONIZATION_FAILED, "synch_failure"),; - //REPLICATION_FAILED(),; not supported yet - + FAILED(Event.REPLICATION_FAILED, "failed"), CREATE(Event.CREATE, "put"), READ( + Event.READ, "get"), UPDATE(Event.UPDATE, "overwrite"), DELETE( + Event.DELETE, "delete"), REPLICATE(Event.REPLICATE, "replicate"), SYNCHRONIZATION_FAILED( + Event.SYNCHRONIZATION_FAILED, "synch_failure"), ; + // REPLICATION_FAILED(),; not supported yet + private String databookEvent; - private Event dataoneEvent; - - EventsEnum(Event dataoneEvent, String databookEvent) { + private Event dataoneEvent; + + EventsEnum(final Event dataoneEvent, final String databookEvent) { this.databookEvent = databookEvent; this.dataoneEvent = dataoneEvent; } - public Event getDataoneEvent() { return dataoneEvent; } - public void setDataoneEvent(Event dataoneEvent) { + + public void setDataoneEvent(final Event dataoneEvent) { this.dataoneEvent = dataoneEvent; } public String getDatabookEvent() { return databookEvent; } - public void setDatabookEvent(String databookEvent) { + + public void setDatabookEvent(final String databookEvent) { this.databookEvent = databookEvent; } - - public static EventsEnum valueOfFromDataOne(Event e) { + + public static EventsEnum valueOfFromDataOne(final Event e) { switch (e) { case CREATE: return CREATE; @@ -50,29 +48,31 @@ public static EventsEnum valueOfFromDataOne(Event e) { return REPLICATE; case SYNCHRONIZATION_FAILED: return SYNCHRONIZATION_FAILED; - //case REPLICATION_FAILED: not supported yet + // case REPLICATION_FAILED: not supported yet default: return READ; } } - - public static EventsEnum valueOfFromDatabook(String e) { - if (e.equals("put") || e.equals("data object put")) + + public static EventsEnum valueOfFromDatabook(final String e) { + if (e.equals("put") || e.equals("data object put")) { return CREATE; - else if (e.equals("get") || e.equals("data object get")) + } else if (e.equals("get") || e.equals("data object get")) { return READ; - else if (e.equals("overwrite") || e.equals("data object overwrite")) + } else if (e.equals("overwrite") || e.equals("data object overwrite")) { return UPDATE; - else if (e.equals("delete") || e.equals("data object delete")) + } else if (e.equals("delete") || e.equals("data object delete")) { return DELETE; - else if (e.equals("replicate") || e.equals("data object replicate")) + } else if (e.equals("replicate") || e.equals("data object replicate")) { return REPLICATE; - else if (e.equals("synch_failure") || e.equals("data object synch_failure")) + } else if (e.equals("synch_failure") + || e.equals("data object synch_failure")) { return SYNCHRONIZATION_FAILED; - //else if (e.equals("?")) - //return REPLICATION_FAILED; not supported yet - else + // else if (e.equals("?")) + // return REPLICATION_FAILED; not supported yet + } else { return FAILED; + } } } \ No newline at end of file diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/events/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/events/package-info.java index 9234856..ccfc78b 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/events/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/events/package-info.java @@ -1,5 +1,5 @@ /** - * + * */ /** * @author lisa diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java index 9e9eb50..08cabc7 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/ExceptionUtils.java @@ -17,56 +17,60 @@ import org.w3c.dom.Element; public class ExceptionUtils { - + private Logger log = LoggerFactory.getLogger(this.getClass()); - - public static String getNotFoundXmlForObjectId(String pid, String detailCode, String description) { - + + public static String getNotFoundXmlForObjectId(final String pid, + final String detailCode, final String description) { + final String name = "NotFound"; final String errorCode = "404"; - + DocumentBuilder documentBuilder; try { - documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + documentBuilder = DocumentBuilderFactory.newInstance() + .newDocumentBuilder(); } catch (ParserConfigurationException e) { return e.getMessage(); } catch (FactoryConfigurationError e) { return e.getMessage(); } Document dom = documentBuilder.newDocument(); - // create the root node of the dom - Element errorNode = dom.createElement("error"); - - errorNode.setAttribute("name", name); - errorNode.setAttribute("detailCode", detailCode); - errorNode.setAttribute("errorCode", errorCode); + // create the root node of the dom + Element errorNode = dom.createElement("error"); + + errorNode.setAttribute("name", name); + errorNode.setAttribute("detailCode", detailCode); + errorNode.setAttribute("errorCode", errorCode); + + Element desc = dom.createElement("description"); + desc.appendChild(dom.createTextNode(description)); - Element desc = dom.createElement("description"); - desc.appendChild(dom.createTextNode(description)); - - dom.appendChild(errorNode); - errorNode.appendChild(desc); + dom.appendChild(errorNode); + errorNode.appendChild(desc); - try { - return domToString(dom); - } catch (Exception ex) { -// log.error(ex.getMessage()); - return ex.getMessage(); - } + try { + return domToString(dom); + } catch (Exception ex) { + // log.error(ex.getMessage()); + return ex.getMessage(); + } + } + + private static String domToString(final Document document) throws Exception { + String result = null; + StringWriter strWtr = new StringWriter(); + TransformerFactory transformerFactory = TransformerFactory + .newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + + if (document != null) { + StreamResult strResult = new StreamResult(strWtr); + transformer.transform(new DOMSource(document.getDocumentElement()), + strResult); + result = strResult.getWriter().toString(); + } + return result; } - - private static String domToString(Document document) throws Exception { - String result = null; - StringWriter strWtr = new StringWriter(); - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - - if (document != null) { - StreamResult strResult = new StreamResult(strWtr); - transformer.transform(new DOMSource(document.getDocumentElement()), strResult); - result = strResult.getWriter().toString(); - } - return result; - } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java index dd4d845..f2329c6 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/NotFoundExceptionMapper.java @@ -11,13 +11,15 @@ public class NotFoundExceptionMapper implements ExceptionMapper { @Override - public Response toResponse(NotFound ex) { + public Response toResponse(final NotFound ex) { + + return Response + .status(Response.Status.NOT_FOUND) + .header("Vary", "Accept-Encoding") + .entity(ExceptionUtils.getNotFoundXmlForObjectId(ex.getPid(), + ex.getDetail_code(), ex.getDescription())) + .type(MediaType.TEXT_XML).build(); - return Response.status(Response.Status.NOT_FOUND) - .header("Vary", "Accept-Encoding") - .entity(ExceptionUtils.getNotFoundXmlForObjectId(ex.getPid(), ex.getDetail_code(), ex.getDescription())) - .type(MediaType.TEXT_XML).build(); - } } \ No newline at end of file diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/package-info.java index a4de564..4977184 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/exceptions/package-info.java @@ -1,5 +1,5 @@ /** - * + * */ /** * @author lisa diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/package-info.java index 697de24..f919f76 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/package-info.java @@ -1,6 +1,6 @@ /** * Implementation of the DataONE REST API - * + * * @author Lisa Stillwell - RENCI - UNC, Chapel Hill (www.renci.org) * */ diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java index 29d7867..27fd762 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java @@ -37,8 +37,8 @@ public class MNCoreImpl implements MNCore { // private final MNCoreModel mnCoreModel; - public MNCoreImpl(IRODSAccessObjectFactory irodsAccessObjectFactory, - RestConfiguration restConfiguration) { + public MNCoreImpl(final IRODSAccessObjectFactory irodsAccessObjectFactory, + final RestConfiguration restConfiguration) { this.irodsAccessObjectFactory = irodsAccessObjectFactory; this.restConfiguration = restConfiguration; @@ -48,7 +48,7 @@ public MNCoreImpl(IRODSAccessObjectFactory irodsAccessObjectFactory, @Override public Date ping() throws NotImplemented, ServiceFailure, - InsufficientResources { + InsufficientResources { try { IRODSAccount irodsAccount = RestAuthUtils @@ -69,23 +69,21 @@ public Date ping() throws NotImplemented, ServiceFailure, } @Override - public Log getLogRecords(Date fromDate, Date toDate, Event event, - String pidFilter, Integer startIdx, Integer count) - throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, - ServiceFailure { + public Log getLogRecords(final Date fromDate, final Date toDate, + final Event event, final String pidFilter, final Integer startIdx, + final Integer count) throws InvalidRequest, InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure { Log d1log = new Log(); - EventsEnum newEvent = null; - log.info("getLogRecords: elasticsearch implementation"); if (event != null) { - newEvent = EventsEnum.valueOfFromDataOne(event); + EventsEnum.valueOfFromDataOne(event); } // FIXME: add log stuff /* - * + * * EventLogAOElasticSearchImpl eventLogAO = new * EventLogAOElasticSearchImpl(irodsAccessObjectFactory, * restConfiguration); try { d1log = eventLogAO.getLogs(fromDate, @@ -112,8 +110,7 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { EnvironmentalInfoAO environmentalInfoAO = irodsAccessObjectFactory .getEnvironmentalInfoAO(irodsAccount); - long bootTime = environmentalInfoAO.getIRODSServerProperties() - .getServerBootTime(); + environmentalInfoAO.getIRODSServerProperties().getServerBootTime(); } catch (Exception e) { log.error("getCapabilities: iRODS server is not running"); @@ -156,10 +153,11 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { } @Override - public Log getLogRecords(Session session, Date date1, Date date2, - Event event, String s, Integer integer1, Integer integer2) - throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, - ServiceFailure { + public Log getLogRecords(final Session session, final Date date1, + final Date date2, final Event event, final String s, + final Integer integer1, final Integer integer2) + throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, + ServiceFailure { throw new NotImplemented("1461", "Authenticated getLogRecords not implemented"); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index 908be80..c44c0f0 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -3,7 +3,6 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; @@ -13,6 +12,7 @@ import org.apache.tika.detect.DefaultDetector; import org.apache.tika.metadata.Metadata; +import org.apache.tika.metadata.TikaMetadataKeys; import org.apache.tika.mime.MediaType; import org.dataone.service.exceptions.InsufficientResources; import org.dataone.service.exceptions.InvalidRequest; @@ -36,7 +36,6 @@ import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.protovalues.FilePermissionEnum; -import org.irods.jargon.core.pub.DataObjectAO; import org.irods.jargon.core.pub.IRODSAccessObjectFactory; //import org.irods.jargon.dataprofile.DataProfileService; //import org.irods.jargon.dataprofile.DataTypeResolutionService; @@ -67,16 +66,16 @@ public class MNReadImpl implements MNRead { private PropertiesLoader properties = new PropertiesLoader(); - public MNReadImpl(IRODSAccessObjectFactory irodsAccessObjectFactory, - RestConfiguration restConfiguration) { + public MNReadImpl(final IRODSAccessObjectFactory irodsAccessObjectFactory, + final RestConfiguration restConfiguration) { this.irodsAccessObjectFactory = irodsAccessObjectFactory; this.restConfiguration = restConfiguration; } @Override - public DescribeResponse describe(Identifier id) throws InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure, NotFound { + public DescribeResponse describe(final Identifier id) throws InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure, NotFound { if (id == null || id.getValue().isEmpty()) { log.error("id is null or empty"); @@ -152,28 +151,21 @@ public DescribeResponse describe(Identifier id) throws InvalidToken, } @Override - public DescribeResponse describe(Session arg0, Identifier arg1) + public DescribeResponse describe(final Session arg0, final Identifier arg1) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { throw new NotImplemented("1361", "this service has not been implemented"); } - public void streamObject(HttpServletResponse response, Identifier id) - throws ServiceFailure, NotFound { - - IRODSFileInputStream stream = null; - OutputStream output = null; - int contentLength = 0; - String path = new String(); - DataObject dataObject = new DataObject(); - IRODSAccount irodsAccount; - IRODSFile irodsFile; + public void streamObject(final HttpServletResponse response, + final Identifier id) throws ServiceFailure, NotFound { + new String(); + new DataObject(); // first try and find data object for this id try { - irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(restConfiguration); + RestAuthUtils.getIRODSAccountFromBasicAuthValues(restConfiguration); // FIXME: add handle factory and lookup @@ -184,7 +176,7 @@ public void streamObject(HttpServletResponse response, Identifier id) * dataObject.getAbsolutePath(); irodsFile = * irodsAccessObjectFactory.getIRODSFileFactory( * irodsAccount).instanceIRODSFile(path); - * + * * if (!irodsFile.exists()) { log.info("file does not exist"); throw * new NotFound("1020", * "No data object could be found for given PID:" + id.getValue()); @@ -198,35 +190,35 @@ public void streamObject(HttpServletResponse response, Identifier id) } /* - * + * * // now try and stream it try { - * + * * stream = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount) * .instanceIRODSFileInputStream(irodsFile); // TODO: need to catch and * return appropriate exceptions here for no // permission - * + * * contentLength = (int) irodsFile.length(); * log.info("contentLength={}", contentLength); - * + * * response.setContentType("application/octet-stream"); * response.setHeader("Content-Disposition", "attachment;filename=" + * dataObject.getDataName()); response.setContentLength(contentLength); * // response.addHeader("Vary", "Accept-Encoding"); * log.info("reponse: {}", response.toString()); - * + * * output = new BufferedOutputStream(response.getOutputStream()); - * + * * // Stream2StreamAO stream2StreamAO = getIrodsAccessObjectFactory() // * .getStream2StreamAO(irodsAccount); // * stream2StreamAO.streamToStreamCopyUsingStandardIO(input, output); - * + * * int readBytes = 0; byte[] buffer = new byte[4096]; - * + * * while ((readBytes = stream.read(buffer, 0, 4096)) != -1) { // * log.info("readBytes={}", readBytes); output.write(buffer, 0, * readBytes); } output.flush(); if (stream != null) stream.close(); if * (output != null) output.close(); - * + * * } catch (Exception e) { log.error("Cannot stream iRODS object: {}", * path); throw new ServiceFailure("1030", * "unable to stream iRODS data object"); } finally { @@ -236,9 +228,9 @@ public void streamObject(HttpServletResponse response, Identifier id) } @Override - public IRODSFileInputStream get(Identifier id) throws InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure, NotFound, - InsufficientResources { + public IRODSFileInputStream get(final Identifier id) throws InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure, NotFound, + InsufficientResources { // TODO: Not sure how to implement this properly - used streamObject // method instead @@ -280,15 +272,15 @@ public IRODSFileInputStream get(Identifier id) throws InvalidToken, } @Override - public InputStream get(Session arg0, Identifier arg1) throws InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure, NotFound, - InsufficientResources { + public InputStream get(final Session arg0, final Identifier arg1) + throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, + NotFound, InsufficientResources { throw new NotImplemented("1001", "this service has not been implemented"); } @Override - public Checksum getChecksum(Identifier id, String algorithm) + public Checksum getChecksum(final Identifier id, final String algorithm) throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { @@ -300,16 +292,16 @@ public Checksum getChecksum(Identifier id, String algorithm) throw new NotFound("1420", "invalid checksum algorithm provided"); } - DataObject dataObject = new DataObject(); + new DataObject(); Checksum checksum = new Checksum(); /* * try { - * + * * // FIXME: need to add handle stuff - * - * - * + * + * + * * UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl( * restConfiguration, irodsAccessObjectFactory); dataObject = * handleImpl.getDataObjectFromIdentifier(id); String csum = @@ -319,7 +311,7 @@ public Checksum getChecksum(Identifier id, String algorithm) * "Checksum does not exist for data object id provided"); } * checksum.setValue(csum); checksum.setAlgorithm(properties * .getProperty("irods.dataone.chksum-algorithm")); - * + * * } catch (FileNotFoundException nf) { * log.error("Cannot access iRODS object: {}", * dataObject.getAbsolutePath()); throw new NotFound("1410", @@ -333,23 +325,23 @@ public Checksum getChecksum(Identifier id, String algorithm) } @Override - public Checksum getChecksum(Session arg0, Identifier arg1, String arg2) - throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, - ServiceFailure, NotFound { + public Checksum getChecksum(final Session arg0, final Identifier arg1, + final String arg2) throws InvalidRequest, InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure, NotFound { throw new NotImplemented("1401", "this service has not been implemented"); } @Override - public InputStream getReplica(Identifier arg0) throws InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure, NotFound, - InsufficientResources { + public InputStream getReplica(final Identifier arg0) throws InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure, NotFound, + InsufficientResources { // This is implemented in streamObject return null; } @Override - public InputStream getReplica(Session arg0, Identifier arg1) + public InputStream getReplica(final Session arg0, final Identifier arg1) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound, InsufficientResources { throw new NotImplemented("2180", @@ -357,72 +349,70 @@ public InputStream getReplica(Session arg0, Identifier arg1) } @Override - public SystemMetadata getSystemMetadata(Identifier id) throws InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure, NotFound { + public SystemMetadata getSystemMetadata(final Identifier id) + throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, + NotFound { if (id == null || id.getValue().isEmpty()) { throw new InvalidToken("1402", "invalid iRODS data object id"); } - DataObject dataObject = new DataObject(); + new DataObject(); SystemMetadata metadata = new SystemMetadata(); - IRODSAccount irodsAccount; - DataObjectAO dataObjectAO; - // TODO: hardcode version to 1 for now metadata.setSerialVersion(getSerialVersion()); - Checksum checksum = new Checksum(); + new Checksum(); // first try and find data object for this id // FIXME: add handle stuff /* - * + * * try { irodsAccount = RestAuthUtils * .getIRODSAccountFromBasicAuthValues(restConfiguration); - * + * * dataObjectAO = irodsAccessObjectFactory * .getDataObjectAO(irodsAccount); UniqueIdAOHandleImpl handleImpl = new * UniqueIdAOHandleImpl( restConfiguration, irodsAccessObjectFactory); * dataObject = handleImpl.getDataObjectFromIdentifier(id); - * + * * } catch (Exception ex) { log.info("file does not exist"); throw new * NotFound("1060", "No metadata could be found for given PID:" + * id.getValue()); } - * - * + * + * * try { String csum = dataObject.getChecksum(); if (csum == null) { * log.info("checksum does not exist for file: {}", * dataObject.getAbsolutePath()); // throw new NotFound("404", "1420"); * } else { checksum.setValue(csum); checksum.setAlgorithm(properties * .getProperty("irods.dataone.chksum-algorithm")); } - * + * * String format = DataTypeUtils.getDataObjectFormatFromMetadata( * irodsAccount, irodsAccessObjectFactory, dataObject); if (format == * null) { format = getDataObjectMimeType(irodsAccount, dataObject); } * metadata.setIdentifier(id); ObjectFormatIdentifier formatId = new * ObjectFormatIdentifier(); formatId.setValue(format); * metadata.setFormatId(formatId); - * + * * Long dataSizeLong = new Long(dataObject.getDataSize()); String * dataSizeStr = dataSizeLong.toString(); metadata.setSize(new * BigInteger(dataSizeStr)); metadata.setChecksum(checksum); - * + * * String dataOwner = "uid=" + dataObject.getDataOwnerName(); Subject * submitter = new Subject(); submitter.setValue(dataOwner); * metadata.setSubmitter(submitter); - * + * * Subject rightsHolder = new Subject(); * rightsHolder.setValue(dataOwner); * metadata.setRightsHolder(rightsHolder); - * + * * List permissions = dataObjectAO * .listPermissionsForDataObject(dataObject.getAbsolutePath()); if * (permissions != null) { AccessPolicy accessPolicy = new * AccessPolicy(); for (UserFilePermission permission : permissions) { * AccessRule rule = new AccessRule(); Subject subject = new Subject(); - * + * * // in DataONE - anonymous translates to public // TODO: also may need * to make translation for "public" to // "authenticatedUser" if * (permission.getUserName().equals("anonymous")) { @@ -432,13 +422,13 @@ public SystemMetadata getSystemMetadata(Identifier id) throws InvalidToken, * (Permission d1Premission : d1Premissions) { * rule.addPermission(d1Premission); } accessPolicy.addAllow(rule); } * metadata.setAccessPolicy(accessPolicy); } - * + * * ReplicationPolicy replicationPolicy = new ReplicationPolicy(); * replicationPolicy.setReplicationAllowed(false); * metadata.setReplicationPolicy(replicationPolicy); - * + * * // Add support for obsoletes or obsoletedBy? - * + * * // Use AVU epoch date // * metadata.setDateUploaded(dataObject.getCreatedAt()); // * metadata.setDateSysMetadataModified(dataObject.getUpdatedAt()); Date @@ -446,13 +436,13 @@ public SystemMetadata getSystemMetadata(Identifier id) throws InvalidToken, * irodsAccessObjectFactory, irodsAccount, dataObject); * metadata.setDateSysMetadataModified(startDate); * metadata.setDateUploaded(startDate); - * + * * NodeReference nodeReference = new NodeReference(); * nodeReference.setValue(properties * .getProperty("irods.dataone.identifier")); * metadata.setOriginMemberNode(nodeReference); * metadata.setAuthoritativeMemberNode(nodeReference); - * + * * } catch (Exception e) { log.error("Cannot access iRODS object: {}", * dataObject.getAbsolutePath()); throw new ServiceFailure("1090", * e.getMessage()); } finally { @@ -462,54 +452,53 @@ public SystemMetadata getSystemMetadata(Identifier id) throws InvalidToken, } @Override - public SystemMetadata getSystemMetadata(Session arg0, Identifier arg1) - throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, - NotFound { + public SystemMetadata getSystemMetadata(final Session arg0, + final Identifier arg1) throws InvalidToken, NotAuthorized, + NotImplemented, ServiceFailure, NotFound { throw new NotImplemented("1041", "this service has not been implemented"); } @Override - public ObjectList listObjects(Date fromDate, Date toDate, - ObjectFormatIdentifier formatId, Boolean replicaStatus, - Integer start, Integer count) throws InvalidRequest, InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure { - DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); - List dataObjectList = new ArrayList(); - List objectInfoList = new ArrayList(); - ObjectList objectList = new ObjectList(); - // UniqueIdAOHandleImpl handleImpl; + public ObjectList listObjects(final Date fromDate, final Date toDate, + final ObjectFormatIdentifier formatId, final Boolean replicaStatus, + final Integer start, final Integer count) throws InvalidRequest, + InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { + new DataObjectListResponse(); + new ArrayList(); + new ArrayList(); + new ObjectList(); // FIXME: handle stuff /* - * + * * UniqueIdAOHandleInMetadataImpl handleImpl; - * + * * try { // handleImpl = new UniqueIdAOHandleImpl(restConfiguration, // * irodsAccessObjectFactory); handleImpl = new * UniqueIdAOHandleInMetadataImpl(restConfiguration, * irodsAccessObjectFactory); - * + * * // dataObjectListResponse = // * handleImpl.getListOfDataoneExposedDataObjects( dataObjectListResponse * = handleImpl .getListOfDataoneExposedDataObjects(fromDate, toDate, * formatId, replicaStatus, start, count); } catch (Exception ex) { * log.info("{}", ex.toString()); throw new ServiceFailure("1580", * "Could not retrieve list of data objects"); } - * + * * dataObjectList = dataObjectListResponse.getDataObjects(); - * + * * for (DataObject dObject : dataObjectList) { - * + * * ObjectInfo oInfo = new ObjectInfo(); - * + * * if (dObject.getChecksum() != null) { Checksum checksum = new * Checksum(); checksum.setValue(dObject.getChecksum()); * checksum.setAlgorithm(properties * .getProperty("irods.dataone.chksum-algorithm")); * oInfo.setChecksum(checksum); } - * + * * // probably should combine query for format and start date at some // * future refactor IRODSAccount irodsAccount = null; ; String format = * null; try { irodsAccount = RestAuthUtils @@ -523,7 +512,7 @@ public ObjectList listObjects(Date fromDate, Date toDate, * , dObject.getAbsolutePath()); format = "application/octet-stream"; } * ObjectFormatIdentifier fId = new ObjectFormatIdentifier(); * fId.setValue(format); oInfo.setFormatId(fId); - * + * * // oInfo.setDateSysMetadataModified(dObject.getUpdatedAt()); Date * startDate = new Date(); try { startDate = * DataObjectMetadataUtils.getStartDateTime( irodsAccessObjectFactory, @@ -532,7 +521,7 @@ public ObjectList listObjects(Date fromDate, Date toDate, * log.error("cannot retrieve start date for object: {}", * dObject.getAbsolutePath()); } * oInfo.setDateSysMetadataModified(startDate); - * + * * Identifier id; try { id = * handleImpl.getIdentifierFromDataObject(dObject); } catch * (JargonException e) { @@ -540,18 +529,18 @@ public ObjectList listObjects(Date fromDate, Date toDate, * e.toString()); throw new ServiceFailure("1580", * "Could not retrieve list of data objects"); } * oInfo.setIdentifier(id); - * + * * Long dataSizeLong = new Long(dObject.getDataSize()); String * dataSizeStr = dataSizeLong.toString(); oInfo.setSize(new * BigInteger(dataSizeStr)); - * + * * objectInfoList.add(oInfo); } - * + * * objectList.setObjectInfoList(objectInfoList); * objectList.setTotal(dataObjectListResponse.getTotal()); * objectList.setCount(objectInfoList.size()); * objectList.setStart(start); - * + * * return objectList; */ @@ -559,28 +548,29 @@ public ObjectList listObjects(Date fromDate, Date toDate, } @Override - public ObjectList listObjects(Session arg0, Date arg1, Date arg2, - ObjectFormatIdentifier arg3, Boolean arg4, Integer arg5, - Integer arg6) throws InvalidRequest, InvalidToken, NotAuthorized, - NotImplemented, ServiceFailure { + public ObjectList listObjects(final Session arg0, final Date arg1, + final Date arg2, final ObjectFormatIdentifier arg3, + final Boolean arg4, final Integer arg5, final Integer arg6) + throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, + ServiceFailure { throw new NotImplemented("1521", "this service has not been implemented"); } @Override - public boolean synchronizationFailed(SynchronizationFailed syncFailed) + public boolean synchronizationFailed(final SynchronizationFailed syncFailed) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { // FIXME: fix handle stuff /* - * + * * Identifier pid = null; - * + * * if (syncFailed.getPid() != null) { pid = new Identifier(); * pid.setValue(syncFailed.getPid()); } else { throw new * ServiceFailure("2161", "The identifier cannot be null."); } - * + * * // check to make sure pid is valid try { UniqueIdAOHandleImpl * handleImpl = new UniqueIdAOHandleImpl( restConfiguration, * irodsAccessObjectFactory); // just try to access the object to see if @@ -588,7 +578,7 @@ public boolean synchronizationFailed(SynchronizationFailed syncFailed) * (Exception ex) { throw new ServiceFailure("2161", * "The identifier specified by " + syncFailed.getPid() + * " was not found on this node."); } - * + * * EventLogAOElasticSearchImpl eventLog = new * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, * restConfiguration); try { @@ -603,9 +593,9 @@ public boolean synchronizationFailed(SynchronizationFailed syncFailed) } @Override - public boolean synchronizationFailed(Session arg0, - SynchronizationFailed arg1) throws InvalidToken, NotAuthorized, - NotImplemented, ServiceFailure { + public boolean synchronizationFailed(final Session arg0, + final SynchronizationFailed arg1) throws InvalidToken, + NotAuthorized, NotImplemented, ServiceFailure { throw new NotImplemented("2160", "this service has not been implemented"); } @@ -614,7 +604,7 @@ public boolean synchronizationFailed(Session arg0, // write would require read and write to be listed as DataONE permissions // and // own would include read, write, and changePermission - private List getD1Permission(UserFilePermission p) { + private List getD1Permission(final UserFilePermission p) { List permissions = new ArrayList(); FilePermissionEnum fpEnum = p.getFilePermissionEnum(); switch (fpEnum) { @@ -646,8 +636,8 @@ private BigInteger getSerialVersion() { return new BigInteger(verStr); } - private String getDataObjectMimeType(IRODSAccount irodsAccount, - DataObject dataObject) throws FileNotFoundException, + private String getDataObjectMimeType(final IRODSAccount irodsAccount, + final DataObject dataObject) throws FileNotFoundException, JargonException { String mimeType = null; String filename = dataObject.getAbsolutePath(); @@ -661,7 +651,7 @@ private String getDataObjectMimeType(IRODSAccount irodsAccount, .instanceIRODSFileInputStream(irodsFile); InputStream stream = new BufferedInputStream(irodsStream); Metadata metadata = new Metadata(); - metadata.add(Metadata.RESOURCE_NAME_KEY, filename); + metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, filename); MediaType type; try { diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/package-info.java index 91bf3d0..fe87484 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/package-info.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/package-info.java @@ -1,6 +1,6 @@ /** * Implementation of the DataONE REST API - * + * * @author Lisa Stillwell - RENCI - UNC, Chapel Hill (www.renci.org) * */ diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 3478d2c..f6ae297 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,6 @@ package org.irods.jargon.dataone.utils; + public final class RestVersion { - public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-17T21:12:45Z"; + public static String VERSION = "4.2.1.0-SNAPSHOT"; + public static String BUILD_TIME = "2017-02-17T21:14:37Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/rest/service/package-info.java b/dataone-node/src/test/java/org/irods/jargon/rest/service/package-info.java index 4d62544..6034811 100644 --- a/dataone-node/src/test/java/org/irods/jargon/rest/service/package-info.java +++ b/dataone-node/src/test/java/org/irods/jargon/rest/service/package-info.java @@ -1,6 +1,6 @@ /** * Various services used by the REST command classes, providing things like persistance, environmental and contextual info - * + * * @author Mike Conway - DICE (www.irods.org) * */ diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java index a40fa1e..e1c4e1a 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java @@ -10,34 +10,35 @@ import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.AVUQueryElement; -import org.irods.jargon.core.query.AVUQueryOperatorEnum; import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.core.query.MetaDataAndDomainData; +import org.irods.jargon.core.query.QueryConditionOperators; public class DataObjectMetadataUtils { - + static public Date getStartDateTime( - IRODSAccessObjectFactory irodsAccessObjectFactory, - IRODSAccount irodsAccount, - DataObject dObject) - throws JargonQueryException, JargonException { - - long epoch=0; + final IRODSAccessObjectFactory irodsAccessObjectFactory, + final IRODSAccount irodsAccount, final DataObject dObject) + throws JargonQueryException, JargonException { + + long epoch = 0; AVUQueryElement avuQuery = null; List avuQueryList = new ArrayList(); List metadataAndDomainDataList = new ArrayList(); String dateAttr = "StartDateTime"; - - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, - dateAttr); + + avuQuery = AVUQueryElement + .instanceForValueQuery(AVUQueryPart.ATTRIBUTE, + QueryConditionOperators.EQUAL, dateAttr); avuQueryList.add(avuQuery); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - - metadataAndDomainDataList = dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, dObject.getAbsolutePath()); + + DataObjectAO dataObjectAO = irodsAccessObjectFactory + .getDataObjectAO(irodsAccount); + + metadataAndDomainDataList = dataObjectAO + .findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, + dObject.getAbsolutePath()); String value = null; for (MetaDataAndDomainData data : metadataAndDomainDataList) { value = data.getAvuValue(); @@ -46,8 +47,8 @@ static public Date getStartDateTime( } epoch = Long.parseLong(value); // need to convert it 2 milliseconds for Java date - Date theDate = new Date(epoch*1000); - + Date theDate = new Date(epoch * 1000); + return theDate; } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java index 4f8a5b0..f4c4838 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java @@ -8,6 +8,7 @@ import org.apache.tika.detect.DefaultDetector; import org.apache.tika.metadata.Metadata; +import org.apache.tika.metadata.TikaMetadataKeys; import org.apache.tika.mime.MediaType; import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.FileNotFoundException; @@ -18,79 +19,79 @@ import org.irods.jargon.core.pub.io.IRODSFile; import org.irods.jargon.core.pub.io.IRODSFileInputStream; import org.irods.jargon.core.query.AVUQueryElement; -import org.irods.jargon.core.query.AVUQueryOperatorEnum; +import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.core.query.MetaDataAndDomainData; -import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; +import org.irods.jargon.core.query.QueryConditionOperators; public class DataTypeUtils { - - public static String getDataObjectMimeType(IRODSAccount irodsAccount, - IRODSAccessObjectFactory irodsAccessObjectFactory, - DataObject dataObject) - throws FileNotFoundException, JargonException { + + public static String getDataObjectMimeType(final IRODSAccount irodsAccount, + final IRODSAccessObjectFactory irodsAccessObjectFactory, + final DataObject dataObject) throws FileNotFoundException, + JargonException { String mimeType = null; String filename = dataObject.getAbsolutePath(); - + DefaultDetector typeDetector = new DefaultDetector(); - IRODSFile irodsFile = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount) - .instanceIRODSFile(filename); + IRODSFile irodsFile = irodsAccessObjectFactory.getIRODSFileFactory( + irodsAccount).instanceIRODSFile(filename); IRODSFileInputStream irodsStream = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount) - .instanceIRODSFileInputStream(irodsFile); + .getIRODSFileFactory(irodsAccount) + .instanceIRODSFileInputStream(irodsFile); InputStream stream = new BufferedInputStream(irodsStream); Metadata metadata = new Metadata(); - metadata.add(Metadata.RESOURCE_NAME_KEY, filename); - + metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, filename); + MediaType type; try { type = typeDetector.detect(stream, metadata); } catch (IOException e) { - throw new FileNotFoundException("Cannot stream file in order to detect file type"); + throw new FileNotFoundException( + "Cannot stream file in order to detect file type"); } - - // if mime type is returned as "application/x-netcdf" change to + + // if mime type is returned as "application/x-netcdf" change to // DataONE accepted name: "netCDF-4" mimeType = type.toString(); if (mimeType.equals("application/x-netcdf")) { mimeType = "netCDF-4"; } - + return mimeType; - + } - - public static String getDataObjectFormatFromMetadata(IRODSAccount irodsAccount, - IRODSAccessObjectFactory irodsAccessObjectFactory, - DataObject dataObject) - throws FileNotFoundException, JargonException, JargonQueryException { - + + public static String getDataObjectFormatFromMetadata( + final IRODSAccount irodsAccount, + final IRODSAccessObjectFactory irodsAccessObjectFactory, + final DataObject dataObject) throws FileNotFoundException, + JargonException, JargonQueryException { + String dataFormat = null; String formatAttr = "Format"; List avuQueryList = new ArrayList(); - + AVUQueryElement avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, formatAttr); avuQueryList.add(avuQuery); - - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - //List result = dataObjectAO.findMetadataValuesForDataObject(dataObject.getAbsolutePath()); - List result = - dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery( - avuQueryList, + + DataObjectAO dataObjectAO = irodsAccessObjectFactory + .getDataObjectAO(irodsAccount); + // List result = + // dataObjectAO.findMetadataValuesForDataObject(dataObject.getAbsolutePath()); + List result = dataObjectAO + .findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, dataObject.getAbsolutePath()); - + for (MetaDataAndDomainData metadata : result) { if (metadata.getAvuAttribute().equals("Format")) { dataFormat = metadata.getAvuValue(); break; } } - + return dataFormat; } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java index fe5f2ae..1bb1e0a 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/ISO8601.java @@ -1,9 +1,8 @@ package org.irods.jargon.dataone.utils; - +import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.text.DateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -13,93 +12,98 @@ import org.slf4j.LoggerFactory; public final class ISO8601 { - + private Logger logger = LoggerFactory.getLogger(this.getClass()); - - /** Transform Calendar to ISO 8601 string. */ - public static String fromCalendar(final Calendar calendar) { - Date date = calendar.getTime(); - String formatted = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") - .format(date); - // add ":" to timezone offset, like this 2013-10-10T13:13:23.000-04:00 - return formatted.substring(0, 26) + ":" + formatted.substring(26); - } - - /** Get current date and time formatted as ISO 8601 string. */ - public static String now() { - return fromCalendar(GregorianCalendar.getInstance()); - } - - /** Transform ISO 8601 string to Calendar. */ - // have to handle this: 2016-04-12T18:18:00+00:00 - // and this 2016-04-12T18:18:00.000+00:00 - // and this 2016-04-12T18:18:00.001 - // and this 2016-04-12T18:18:00 - // and this 2016-04-12T18:18:00+00:00 - // etc - public static Calendar toCalendar(final String iso8601string) - throws ParseException { - Calendar calendar = GregorianCalendar.getInstance(); - String s = iso8601string; - - // add the GMT timezone default, if it is not explicitly specified - if ((!iso8601string.contains("+")) && (!iso8601string.contains("-"))) { - // GMT is default - s = s + "+0000"; - } - else { - // need to remove ":" from timezone, if there - int len = s.length(); - if (s.charAt(len-3) == ':') { - try { - s = s.substring(0, len-3) + s.substring(len-2); // to get rid of the ":" - } catch (IndexOutOfBoundsException e) { - throw new ParseException("Invalid length", 0); - } - } - } - - Date date; - // check for milliseconds extension - if (s.contains(".")) { - date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(s); - } - else { - date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s); - } - - calendar.setTime(date); - return calendar; - } - - public static Date convertToGMT(Date date) { - Date gmtDate = null; - - DateFormat gmtFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); - TimeZone gmtTime = TimeZone.getTimeZone("GMT"); - gmtFormat.setTimeZone(gmtTime); - String gmtStr = gmtFormat.format(date); - try { + + /** Transform Calendar to ISO 8601 string. */ + public static String fromCalendar(final Calendar calendar) { + Date date = calendar.getTime(); + String formatted = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") + .format(date); + // add ":" to timezone offset, like this 2013-10-10T13:13:23.000-04:00 + return formatted.substring(0, 26) + ":" + formatted.substring(26); + } + + /** Get current date and time formatted as ISO 8601 string. */ + public static String now() { + return fromCalendar(Calendar.getInstance()); + } + + /** Transform ISO 8601 string to Calendar. */ + // have to handle this: 2016-04-12T18:18:00+00:00 + // and this 2016-04-12T18:18:00.000+00:00 + // and this 2016-04-12T18:18:00.001 + // and this 2016-04-12T18:18:00 + // and this 2016-04-12T18:18:00+00:00 + // etc + public static Calendar toCalendar(final String iso8601string) + throws ParseException { + Calendar calendar = Calendar.getInstance(); + String s = iso8601string; + + // add the GMT timezone default, if it is not explicitly specified + if ((!iso8601string.contains("+")) && (!iso8601string.contains("-"))) { + // GMT is default + s = s + "+0000"; + } else { + // need to remove ":" from timezone, if there + int len = s.length(); + if (s.charAt(len - 3) == ':') { + try { + s = s.substring(0, len - 3) + s.substring(len - 2); // to + // get + // rid + // of + // the + // ":" + } catch (IndexOutOfBoundsException e) { + throw new ParseException("Invalid length", 0); + } + } + } + + Date date; + // check for milliseconds extension + if (s.contains(".")) { + date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(s); + } else { + date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s); + } + + calendar.setTime(date); + return calendar; + } + + public static Date convertToGMT(final Date date) { + Date gmtDate = null; + + DateFormat gmtFormat = new SimpleDateFormat( + "yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + TimeZone gmtTime = TimeZone.getTimeZone("GMT"); + gmtFormat.setTimeZone(gmtTime); + String gmtStr = gmtFormat.format(date); + try { gmtDate = gmtFormat.parse(gmtStr); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } - - return gmtDate; - } - - public static String convertToGMTString(Date date) { - - DateFormat gmtFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS+"); - TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); - gmtFormat.setTimeZone(gmtTimeZone); - Calendar calendar = new GregorianCalendar(); + + return gmtDate; + } + + public static String convertToGMTString(final Date date) { + + DateFormat gmtFormat = new SimpleDateFormat( + "yyyy-MM-dd'T'HH:mm:ss.SSS+"); + TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); + gmtFormat.setTimeZone(gmtTimeZone); + Calendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.setTimeZone(gmtTimeZone); - String dateStr = gmtFormat.format(calendar.getTime()); - dateStr += "00:00"; - - return dateStr; - } + String dateStr = gmtFormat.format(calendar.getTime()); + dateStr += "00:00"; + + return dateStr; + } } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java index 9d325dd..88e5dd0 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java @@ -8,25 +8,27 @@ import org.slf4j.LoggerFactory; public class PropertiesLoader { - + private Properties properties; - + private String propertiesFilename = "d1client.properties"; private Logger log = LoggerFactory.getLogger(this.getClass()); - + public PropertiesLoader() { - - this.properties = new Properties(); + + properties = new Properties(); InputStream input = null; - input = getClass().getClassLoader().getResourceAsStream(this.propertiesFilename); + input = getClass().getClassLoader().getResourceAsStream( + propertiesFilename); // load a properties file try { - this.properties.load(input); + properties.load(input); } catch (IOException e) { - log.error("Cannot load Member Node properties file: {}", this.propertiesFilename); + log.error("Cannot load Member Node properties file: {}", + propertiesFilename); log.error("IOException: {}", e.getStackTrace()); - this.properties = new Properties(); + properties = new Properties(); } finally { if (input != null) { try { @@ -37,9 +39,8 @@ public PropertiesLoader() { } } } - - - public String getProperty(String key) { + + public String getProperty(final String key) { return properties.getProperty(key); } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java index 1b20269..51436f4 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/RestTestingProperties.java @@ -1,13 +1,13 @@ /** - * + * */ package org.irods.jargon.dataone.utils; /** * Handy properties used in testing these services - * + * * @author Mike Conway - DICE (www.irods.org) - * + * */ public class RestTestingProperties { public static final String REST_PORT_PROPERTY = "test.rest.port"; diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/package-info.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/package-info.java index 5abd5e2..5484dc5 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/package-info.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/package-info.java @@ -1,6 +1,6 @@ /** * Implementation of the DataONE REST API - * + * * @author Lisa Stillwell - RENCI - UNC, Chapel Hill (www.renci.org) * */ diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/HandleListerRunnable.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/HandleListerRunnable.java index 5fb460b..47acfbf 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/HandleListerRunnable.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/HandleListerRunnable.java @@ -1,19 +1,12 @@ package org.irods.jargon.dataone.id.handle; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.net.URL; import java.security.PrivateKey; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import java.util.Queue; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import net.handle.hdllib.AbstractMessage; import net.handle.hdllib.AbstractResponse; @@ -28,156 +21,158 @@ import net.handle.hdllib.SiteInfo; import net.handle.hdllib.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + // ./hdl-list -s 0.NA/11333 300 ../../svr_1/admpriv.bin 11333 public class HandleListerRunnable implements Runnable, ResponseMessageCallback { - - + HandleResolver resolver = new HandleResolver(); private final String authHandle; private final String authIndex; private final String privateKey; private final String namingAuthority; boolean showValues = true; - //private Queue> results; + // private Queue> results; private LinkedList> results; private final List handles; private Logger log = LoggerFactory.getLogger(this.getClass()); public HandleListerRunnable( - //Queue> queue, - LinkedList> queue, - String authHandle, - String authIndex, - String privateKey, - String namingAuthority) { - + // Queue> queue, + final LinkedList> queue, final String authHandle, + final String authIndex, final String privateKey, + final String namingAuthority) { + // TODO: check for valid args here log.info("in HandleListerRunnable"); - this.results = queue; + results = queue; this.authHandle = authHandle; this.authIndex = authIndex; this.privateKey = privateKey; this.namingAuthority = namingAuthority; - this.handles = new ArrayList(); - -// byte[] key = null; -// FileInputStream fs = null; -// //InputStream fs = null; -// try { -// //fs = getClass().getClassLoader().getResourceAsStream(this.privateKey); -// File f = new File(this.privateKey); -// fs = new FileInputStream(f); -// key = new byte[(int)f.length()]; -// int n=0; -// while(n(); + + // byte[] key = null; + // FileInputStream fs = null; + // //InputStream fs = null; + // try { + // //fs = + // getClass().getClassLoader().getResourceAsStream(this.privateKey); + // File f = new File(this.privateKey); + // fs = new FileInputStream(f); + // key = new byte[(int)f.length()]; + // int n=0; + // while(n getHandles() { -// return this.handles; -// } + key = Util.decrypt(key, secKey); + privkey = Util.getPrivateKeyFromBytes(key, 0); + } catch (Throwable t) { + System.err.println("Can't load private key in " + this.privateKey + + ": " + t); + System.exit(-1); + } + + ResolutionRequest resReq = new ResolutionRequest( + Util.encodeString(this.namingAuthority), null, null, null); + log.info("finding local sites for {}", resReq); + SiteInfo sites[] = null; + try { + sites = resolver.findLocalSites(resReq); + } catch (HandleException e) { + log.error( + "HandleLister: encountered exception while finding local server sites: {}", + e.getMessage()); + } + + PublicKeyAuthenticationInfo auth = new PublicKeyAuthenticationInfo( + Util.encodeString(this.authHandle), Integer.valueOf( + this.authIndex).intValue(), privkey); + ListHandlesRequest req = new ListHandlesRequest( + Util.getZeroNAHandle(Util.encodeString(this.namingAuthority)), + auth); + // send a list-handles request to each server in the site + for (ServerInfo server : sites[0].servers) { + try { + resolver.sendRequestToServer(req, sites[0], server, this); + } catch (Throwable t) { + log.error("HandleLister: error sending request to server: {}", + t.getMessage()); + } + } + } + + @Override + public void handleResponse(final AbstractResponse response) { + + resolver.traceMessages = false; + + log.info("got callback, response: {}", response.toString()); + + if (response instanceof ListHandlesResponse) { + try { + ListHandlesResponse lhResp = (ListHandlesResponse) response; + byte handleArray[][] = lhResp.handles; + for (byte[] element : handleArray) { + String sHandle = Util.decodeString(element); + log.info("extracted handle: {}", sHandle); + handles.add(sHandle); + } + } catch (Exception e) { + log.error("Error: {}", e.getMessage()); + // e.printStackTrace(System.err); + } + + } else if (response.responseCode != AbstractMessage.RC_AUTHENTICATION_NEEDED) { + log.error("handleResponse: retrieval of handle list failed: {}", + response.toString()); + } + } + + @Override + public void run() { + log.info("in HandleListerRunnable run, handles: {}", handles.toString()); + synchronized (results) { + results.add(handles); + results.notify(); + } + } + + // public List getHandles() { + // return this.handles; + // } } diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java index 1f921ab..ac92fac 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java @@ -28,14 +28,14 @@ import org.slf4j.LoggerFactory; public class UniqueIdAOHandleImpl extends AbstractJargonService implements - UniqueIdAO { +UniqueIdAO { private Properties properties; private String propertiesFilename = "d1client.properties"; private Logger log = LoggerFactory.getLogger(this.getClass()); @Override - public DataObject getDataObjectFromIdentifier(Identifier identifier) + public DataObject getDataObjectFromIdentifier(final Identifier identifier) throws JargonException, FileNotFoundException { DataObject dataObject = null; @@ -55,7 +55,7 @@ public DataObject getDataObjectFromIdentifier(Identifier identifier) log.info("got dataObjectAO: {}", dataObjectAO.toString()); // Find iRODS object here from Identifier dataObject = dataObjectAO.findById(new Long(dataObjectId) - .intValue()); + .intValue()); if (dataObject != null) { log.info("found iRODS file: {}", dataObject.getAbsolutePath()); } else { @@ -73,7 +73,7 @@ public DataObject getDataObjectFromIdentifier(Identifier identifier) } @Override - public Identifier getIdentifierFromDataObject(DataObject dataObject) + public Identifier getIdentifierFromDataObject(final DataObject dataObject) throws JargonException { if (dataObject == null) { @@ -162,9 +162,9 @@ public List getListOfDataoneExposedIdentifiers() @Override public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, Date toDate, ObjectFormatIdentifier formatId, - Boolean replicaStatus, Integer start, Integer count) - throws JargonException { + final Date fromDate, final Date toDate, + final ObjectFormatIdentifier formatId, final Boolean replicaStatus, + final Integer start, final Integer count) throws JargonException { // get complete list of exposed data objects // TODO: see if this can be done differently to just request list @@ -219,7 +219,7 @@ && matchesToDate(toDate, modifiedDate) && return dataObjectListResponse; } - public long getDataObjectIdFromDataOneIdentifier(Identifier pid) { + public long getDataObjectIdFromDataOneIdentifier(final Identifier pid) { int idIdx = pid.getValue().indexOf("/") + 1; long dataObjectId; @@ -245,19 +245,19 @@ public String getHandlePrefix() throws JargonException { } private void loadProperties() { - this.properties = new Properties(); + properties = new Properties(); InputStream input = null; input = getClass().getClassLoader().getResourceAsStream( - this.propertiesFilename); + propertiesFilename); // load a properties file try { - this.properties.load(input); + properties.load(input); } catch (IOException e) { log.error("Cannot load Member Node properties file: {}", - this.propertiesFilename); + propertiesFilename); log.error("IOException: {}", e.getStackTrace()); - this.properties = new Properties(); + properties = new Properties(); } finally { if (input != null) { try { @@ -269,7 +269,8 @@ private void loadProperties() { } } - private boolean matchesFromDate(Date fromDate, Date dataObjectModDate) { + private boolean matchesFromDate(final Date fromDate, + final Date dataObjectModDate) { if (fromDate == null || fromDate.getTime() <= 0) { log.info("fromDate : returning matches"); @@ -285,7 +286,8 @@ private boolean matchesFromDate(Date fromDate, Date dataObjectModDate) { return false; } - private boolean matchesToDate(Date toDate, Date dataObjectModDate) { + private boolean matchesToDate(final Date toDate, + final Date dataObjectModDate) { if (toDate == null || toDate.getTime() <= 0) { log.info("toDate : returning matches"); @@ -301,8 +303,9 @@ private boolean matchesToDate(Date toDate, Date dataObjectModDate) { return false; } - private boolean matchesFormatId(ObjectFormatIdentifier formatId, - DataObject dataObject) throws JargonException, JargonQueryException { + private boolean matchesFormatId(final ObjectFormatIdentifier formatId, + final DataObject dataObject) throws JargonException, + JargonQueryException { String dataFormat = DataTypeUtils.getDataObjectFormatFromMetadata( irodsAccount, irodsAccessObjectFactory, dataObject); @@ -314,7 +317,7 @@ private boolean matchesFormatId(ObjectFormatIdentifier formatId, return false; } - private boolean matchesReplicaStatus(Boolean replicaStatus) { + private boolean matchesReplicaStatus(final Boolean replicaStatus) { // replication is always set to false for now if (replicaStatus == null || replicaStatus == false) { diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java index 2515af6..e384162 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java @@ -16,8 +16,8 @@ import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.AVUQueryElement; import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; -import org.irods.jargon.core.query.AVUQueryOperatorEnum; import org.irods.jargon.core.query.JargonQueryException; +import org.irods.jargon.core.query.QueryConditionOperators; import org.irods.jargon.core.service.AbstractJargonService; import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.irods.jargon.pid.pidservice.UniqueIdAO; @@ -30,14 +30,14 @@ import org.slf4j.LoggerFactory; public class UniqueIdAOHandleInMetadataImpl extends AbstractJargonService - implements UniqueIdAO { +implements UniqueIdAO { private Properties properties; private String propertiesFilename = "d1client.properties"; private Logger log = LoggerFactory.getLogger(this.getClass()); @Override - public DataObject getDataObjectFromIdentifier(Identifier identifier) + public DataObject getDataObjectFromIdentifier(final Identifier identifier) throws JargonException, FileNotFoundException { DataObject dataObject = null; @@ -60,7 +60,7 @@ public DataObject getDataObjectFromIdentifier(Identifier identifier) log.info("got dataObjectAO: {}", dataObjectAO.toString()); // Find iRODS object here from Identifier dataObject = dataObjectAO.findById(new Long(dataObjectId) - .intValue()); + .intValue()); if (dataObject != null) { log.info("found iRODS file: {}", dataObject.getAbsolutePath()); } else { @@ -78,7 +78,7 @@ public DataObject getDataObjectFromIdentifier(Identifier identifier) } @Override - public Identifier getIdentifierFromDataObject(DataObject dataObject) + public Identifier getIdentifierFromDataObject(final DataObject dataObject) throws JargonException { if (dataObject == null) { @@ -115,12 +115,12 @@ public List getListOfDataoneExposedIdentifiers() try { avuQuery1 = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, handleAttr); - avuQuery2 = AVUQueryElement - .instanceForValueQuery(AVUQueryPart.VALUE, - AVUQueryOperatorEnum.EQUAL, handleValue); + avuQuery2 = AVUQueryElement.instanceForValueQuery( + AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, + handleValue); } catch (JargonQueryException e) { log.error("getListOfDataoneExposedIdentifiers: failed to create AVU query elements"); @@ -152,9 +152,9 @@ public List getListOfDataoneExposedIdentifiers() @Override public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, Date toDate, ObjectFormatIdentifier formatId, - Boolean replicaStatus, Integer start, Integer count) - throws JargonException { + final Date fromDate, final Date toDate, + final ObjectFormatIdentifier formatId, final Boolean replicaStatus, + final Integer start, final Integer count) throws JargonException { int total = 0; @@ -192,7 +192,7 @@ public DataObjectListResponse getListOfDataoneExposedDataObjects( return dataObjectListResponse; } - public long getDataObjectIdFromDataOneIdentifier(Identifier pid) { + public long getDataObjectIdFromDataOneIdentifier(final Identifier pid) { int idIdx = pid.getValue().indexOf("/") + 1; long dataObjectId; @@ -218,19 +218,19 @@ public String getHandlePrefix() throws JargonException { } private void loadProperties() { - this.properties = new Properties(); + properties = new Properties(); InputStream input = null; input = getClass().getClassLoader().getResourceAsStream( - this.propertiesFilename); + propertiesFilename); // load a properties file try { - this.properties.load(input); + properties.load(input); } catch (IOException e) { log.error("Cannot load Member Node properties file: {}", - this.propertiesFilename); + propertiesFilename); log.error("IOException: {}", e.getStackTrace()); - this.properties = new Properties(); + properties = new Properties(); } finally { if (input != null) { try { @@ -242,8 +242,9 @@ private void loadProperties() { } } - private List createAVUQueryElementList(Date fromDate, - Date toDate, ObjectFormatIdentifier formatId) { + private List createAVUQueryElementList( + final Date fromDate, final Date toDate, + final ObjectFormatIdentifier formatId) { // TODO: probably should move these to properties String dateAttr = "StartDateTime"; @@ -258,13 +259,13 @@ private List createAVUQueryElementList(Date fromDate, try { // DataOne exposed query avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, handleAttr); avuQueryList.add(avuQuery); - avuQuery = AVUQueryElement - .instanceForValueQuery(AVUQueryPart.VALUE, - AVUQueryOperatorEnum.EQUAL, handleValue); + avuQuery = AVUQueryElement.instanceForValueQuery( + AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, + handleValue); avuQueryList.add(avuQuery); // handle any date queries @@ -283,24 +284,25 @@ private List createAVUQueryElementList(Date fromDate, // fromDate query avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, dateAttr); avuQueryList.add(avuQuery); avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, AVUQueryOperatorEnum.GREATER_OR_EQUAL, + AVUQueryPart.VALUE, + QueryConditionOperators.GREATER_THAN_OR_EQUAL_TO, Long.toString(newFromDate)); avuQueryList.add(avuQuery); // toDate query if ((toDate != null) && ((toDate.getTime() / 1000) >= newFromDate)) { avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, dateAttr); avuQueryList.add(avuQuery); avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, AVUQueryOperatorEnum.LESS_THAN, + AVUQueryPart.VALUE, QueryConditionOperators.LESS_THAN, Long.toString(toDate.getTime() / 1000)); avuQueryList.add(avuQuery); @@ -338,12 +340,12 @@ private List createAVUQueryElementList(Date fromDate, // handle data format query if ((formatId != null) && (formatId.getValue() != null)) { avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, formatAttr); avuQueryList.add(avuQuery); avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, AVUQueryOperatorEnum.EQUAL, + AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, formatId.getValue()); avuQueryList.add(avuQuery); diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/package-info.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/package-info.java index 92c14f2..d57b6fc 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/package-info.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/package-info.java @@ -1,5 +1,5 @@ /** - * + * */ /** * @author lisa From 1a010d83f16afa3ceb75dd8aac64d3eb659c5bae Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 20 Feb 2017 09:05:34 -0500 Subject: [PATCH 19/88] #6 factor out event service --- dataone-node/pom.xml | 5 +++ .../jargon/dataone/tier1/MNCoreImpl.java | 8 ++--- .../jargon/dataone/utils/RestVersion.java | 5 ++- .../jargon/dataone/utils/DataTypeUtils.java | 1 - event-service-api/pom.xml | 4 +++ .../jargon/dataone/events/EventLogAO.java | 34 +++++++++++++++---- .../jargon/dataone/events/EventsEnum.java | 14 ++++---- .../jargon/dataone/events/package-info.java | 0 8 files changed, 49 insertions(+), 22 deletions(-) rename {dataone-node => event-service-api}/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java (55%) rename {dataone-node => event-service-api}/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java (86%) rename {dataone-node => event-service-api}/src/main/java/org/irods/jargon/dataone/events/package-info.java (100%) diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 82e7d7d..77a46a2 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -142,6 +142,11 @@ pid-service-api ${project.version} + + org.irods + event-service-api + ${project.version} + org.irods dataone-utils diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java index 27fd762..232962a 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java @@ -48,7 +48,7 @@ public MNCoreImpl(final IRODSAccessObjectFactory irodsAccessObjectFactory, @Override public Date ping() throws NotImplemented, ServiceFailure, - InsufficientResources { + InsufficientResources { try { IRODSAccount irodsAccount = RestAuthUtils @@ -83,7 +83,7 @@ public Log getLogRecords(final Date fromDate, final Date toDate, // FIXME: add log stuff /* - * + * * EventLogAOElasticSearchImpl eventLogAO = new * EventLogAOElasticSearchImpl(irodsAccessObjectFactory, * restConfiguration); try { d1log = eventLogAO.getLogs(fromDate, @@ -156,8 +156,8 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { public Log getLogRecords(final Session session, final Date date1, final Date date2, final Event event, final String s, final Integer integer1, final Integer integer2) - throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, - ServiceFailure { + throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, + ServiceFailure { throw new NotImplemented("1461", "Authenticated getLogRecords not implemented"); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index f6ae297..9f1347a 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,6 +1,5 @@ package org.irods.jargon.dataone.utils; - public final class RestVersion { - public static String VERSION = "4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME = "2017-02-17T21:14:37Z"; + public static String VERSION="4.2.1.0-SNAPSHOT"; + public static String BUILD_TIME="2017-02-20T13:44:41Z"; } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java index f4c4838..f525abb 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java @@ -71,7 +71,6 @@ public static String getDataObjectFormatFromMetadata( String dataFormat = null; String formatAttr = "Format"; List avuQueryList = new ArrayList(); - AVUQueryElement avuQuery = AVUQueryElement.instanceForValueQuery( AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, formatAttr); diff --git a/event-service-api/pom.xml b/event-service-api/pom.xml index ee4dcc4..b783c2d 100644 --- a/event-service-api/pom.xml +++ b/event-service-api/pom.xml @@ -39,6 +39,10 @@ org.mockito mockito-all + + org.dataone + d1_libclient_java + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java similarity index 55% rename from dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java rename to event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java index 726d9d6..ef6eecc 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java @@ -9,18 +9,38 @@ import org.irods.jargon.core.exception.InvalidArgumentException; import org.irods.jargon.core.exception.JargonException; -// implements access to the iRODS event log +/** + * API for accessing event registry for published objects + * + * @author mconway + * + */ public interface EventLogAO { - // retrieve list of logEntry (events) - // log?[fromDate={fromDate}][&toDate={toDate}][&event={event}][&pidFilter={pidFilter}][&start={start}][&count={count}] - // use elastic search api to retrieve events + /** + * Retrieve logs from the event registry given the parameters + * + * @param fromDate + * @param toDate + * @param event + * @param pidFilter + * @param startIdx + * @param count + * @return {@link Log} with the log data + */ public Log getLogs(Date fromDate, Date toDate, EventsEnum event, String pidFilter, int startIdx, int count); - // execute rule to add event to databook event log - // sendAccess("synch_failure", user name, data object identifier, timestamp - // in seconds, short description); + /** + * Add a given event to the log data + * + * @param event + * @param id + * @param description + * @throws InvalidArgumentException + * @throws JargonException + * @throws ServiceFailure + */ public void recordEvent(Event event, Identifier id, String description) throws InvalidArgumentException, JargonException, ServiceFailure; diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java similarity index 86% rename from dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java rename to event-service-api/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java index 6bd4019..b40189b 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventsEnum.java @@ -10,11 +10,11 @@ public enum EventsEnum { Event.SYNCHRONIZATION_FAILED, "synch_failure"), ; // REPLICATION_FAILED(),; not supported yet - private String databookEvent; + private String internalEvent; private Event dataoneEvent; EventsEnum(final Event dataoneEvent, final String databookEvent) { - this.databookEvent = databookEvent; + this.internalEvent = databookEvent; this.dataoneEvent = dataoneEvent; } @@ -26,12 +26,12 @@ public void setDataoneEvent(final Event dataoneEvent) { this.dataoneEvent = dataoneEvent; } - public String getDatabookEvent() { - return databookEvent; + public String getInternalEvent() { + return internalEvent; } - public void setDatabookEvent(final String databookEvent) { - this.databookEvent = databookEvent; + public void setInternalEvent(final String internalEvent) { + this.internalEvent = internalEvent; } public static EventsEnum valueOfFromDataOne(final Event e) { @@ -54,7 +54,7 @@ public static EventsEnum valueOfFromDataOne(final Event e) { } } - public static EventsEnum valueOfFromDatabook(final String e) { + public static EventsEnum valueFromInternal(final String e) { if (e.equals("put") || e.equals("data object put")) { return CREATE; } else if (e.equals("get") || e.equals("data object get")) { diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/events/package-info.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/package-info.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/events/package-info.java rename to event-service-api/src/main/java/org/irods/jargon/dataone/events/package-info.java From 7f2591ad6ae6c3445353cc3a183aa48fac4b73c8 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 21 Feb 2017 08:13:42 -0500 Subject: [PATCH 20/88] #2 factor out publication context --- .../jargon/dataone/MemberNodeService.java | 86 ++++++++++--------- .../jargon/dataone/utils/RestVersion.java | 2 +- dataone-utils/pom.xml | 26 +++++- .../configuration/PublicationContext.java | 55 ++++++++++++ .../configuration/RestConfiguration.java | 0 .../dataone/configuration/package-info.java | 0 .../jargon/dataone/factory/package-info.java | 8 ++ .../dataone/events/EventServiceFactory.java | 16 ++++ 8 files changed, 151 insertions(+), 42 deletions(-) create mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PublicationContext.java rename {dataone-node => dataone-utils}/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java (100%) rename {dataone-node => dataone-utils}/src/main/java/org/irods/jargon/dataone/configuration/package-info.java (100%) create mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/factory/package-info.java create mode 100644 event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceFactory.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java index bce5b09..b13a086 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java @@ -48,8 +48,7 @@ import org.dataone.service.types.v1.ObjectList; import org.dataone.service.types.v1.SystemMetadata; import org.irods.jargon.core.exception.JargonException; -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; -import org.irods.jargon.dataone.configuration.RestConfiguration; +import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.domain.MNChecksum; import org.irods.jargon.dataone.domain.MNError; import org.irods.jargon.dataone.domain.MNLog; @@ -77,10 +76,7 @@ public class MemberNodeService { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Inject - IRODSAccessObjectFactory irodsAccessObjectFactory; - - @Inject - RestConfiguration restConfiguration; + PublicationContext publicationContext; @GET @Path("/monitor/ping") @@ -89,20 +85,21 @@ public class MemberNodeService { // public Response handlePing(@HeaderParam("Authorization") final String // authorization) public Response handlePing() throws NotImplemented, ServiceFailure, - InsufficientResources, JargonException { + InsufficientResources, JargonException { // if (authorization == null || authorization.isEmpty()) { // throw new IllegalArgumentException("null or empty authorization"); // } - if (irodsAccessObjectFactory == null) { - throw new IllegalArgumentException("null irodsAccessObjectFactory"); + if (publicationContext == null) { + throw new IllegalArgumentException("null publicationContext"); } // MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, // restConfiguration, authorization); - MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, - restConfiguration); + MNCoreImpl mnCoreImpl = new MNCoreImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); Date irodsDate = mnCoreImpl.ping(); SimpleDateFormat df = new SimpleDateFormat( @@ -125,8 +122,9 @@ public MNNode handleGetCapabilities() throws NotImplemented, ServiceFailure { MNNode nodeCapabilities = new MNNode(); - MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, - restConfiguration); + MNCoreImpl mnCoreImpl = new MNCoreImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); Node node = mnCoreImpl.getCapabilities(); nodeCapabilities.copy(node); @@ -139,7 +137,7 @@ public MNNode handleGetCapabilities() throws NotImplemented, ServiceFailure { @Produces(MediaType.TEXT_XML) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) public MNNode handleDefaultGetCapabilities() throws NotImplemented, - ServiceFailure { + ServiceFailure { MNNode nodeCapabilities = handleGetCapabilities(); @@ -158,16 +156,17 @@ public MNLog handleGetLogRecords( @QueryParam("pidFilter") final String pidFilter, @DefaultValue("0") @QueryParam("start") final int start, @DefaultValue("500") @QueryParam("count") final int count) - throws NotImplemented, ServiceFailure, NotAuthorized, - InvalidRequest, InvalidToken { + throws NotImplemented, ServiceFailure, NotAuthorized, + InvalidRequest, InvalidToken { logger.info("/log request: fromData={} toDate={}", fromDateStr, toDateStr); logger.info("/log request: event={} pidFilter={}", event, pidFilter); logger.info("/log request: start={} count={}", start, count); - MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, - restConfiguration); + MNCoreImpl mnCoreImpl = new MNCoreImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); // parse date strings Date fromDate = null; @@ -205,8 +204,9 @@ public void handleRead(@PathParam("id") final String pid, ServiceFailure, NotAuthorized, NotFound, NotImplemented, InsufficientResources { - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, - restConfiguration); + MNReadImpl mnReadImpl = new MNReadImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); Identifier id = new Identifier(); id.setValue(pid); @@ -232,8 +232,8 @@ public void handleRead(@PathParam("id") final String pid, public MNChecksum handleGetChecksum( @PathParam("id") final String pid, @DefaultValue("MD5") @QueryParam("checksumAlgorithm") final String algorithm) - throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, - NotImplemented, InvalidRequest { + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, + NotImplemented, InvalidRequest { MNChecksum mnChecksum = new MNChecksum(); @@ -245,8 +245,9 @@ public MNChecksum handleGetChecksum( Identifier id = new Identifier(); id.setValue(pid); - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, - restConfiguration); + MNReadImpl mnReadImpl = new MNReadImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); Checksum checksum = mnReadImpl.getChecksum(id, algorithm); mnChecksum.copy(checksum); @@ -262,8 +263,9 @@ public void handleReplica(@PathParam("id") final String pid, ServiceFailure, NotAuthorized, NotFound, NotImplemented, InsufficientResources { - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, - restConfiguration); + MNReadImpl mnReadImpl = new MNReadImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); Identifier id = new Identifier(); id.setValue(pid); @@ -275,7 +277,7 @@ public void handleReplica(@PathParam("id") final String pid, // FIXME: add log stuff /* - * + * * // now log the event EventLogAOElasticSearchImpl eventLog = new * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, * restConfiguration); try { eventLog.recordEvent(Event.REPLICATE, id, @@ -292,16 +294,17 @@ public void handleReplica(@PathParam("id") final String pid, public MNSystemMetadata handleGetSystemMetadata( @PathParam("id") final String pid) // @Context final HttpServletResponse response) - throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, - NotImplemented, InvalidRequest { + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, + NotImplemented, InvalidRequest { MNSystemMetadata mnSystemMetadata = new MNSystemMetadata(); Identifier id = new Identifier(); id.setValue(pid); - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, - restConfiguration); + MNReadImpl mnReadImpl = new MNReadImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); SystemMetadata sysMetadata = mnReadImpl.getSystemMetadata(id); mnSystemMetadata.copy(sysMetadata); @@ -314,7 +317,7 @@ public MNSystemMetadata handleGetSystemMetadata( @Produces(MediaType.TEXT_XML) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) public Response handleDescribe(@PathParam("id") final String pid) - // @Context final HttpServletResponse response) + // @Context final HttpServletResponse response) throws NotAuthorized, NotImplemented, ServiceFailure, NotFound, InvalidToken { @@ -323,8 +326,9 @@ public Response handleDescribe(@PathParam("id") final String pid) DescribeResponse describeResponse; - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, - restConfiguration); + MNReadImpl mnReadImpl = new MNReadImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); try { describeResponse = mnReadImpl.describe(id); } catch (NotFound ex) { @@ -401,8 +405,9 @@ public Response handleSynchronizationFailed( "Synch Failure Exception message is null"); } - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, - restConfiguration); + MNReadImpl mnReadImpl = new MNReadImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); boolean success = mnReadImpl.synchronizationFailed(message); if (!success) { @@ -427,8 +432,8 @@ public MNObjectList handleListObjects( @QueryParam("replicaStatus") final Boolean replicaStatus, @DefaultValue("0") @QueryParam("start") final Integer start, @DefaultValue("500") @QueryParam("count") final Integer count) - throws InvalidToken, ServiceFailure, NotAuthorized, InvalidRequest, - NotImplemented { + throws InvalidToken, ServiceFailure, NotAuthorized, InvalidRequest, + NotImplemented { MNObjectList mnObjectList = new MNObjectList(); @@ -451,8 +456,9 @@ public MNObjectList handleListObjects( throw new InvalidRequest("1540", e.getMessage()); } - MNReadImpl mnReadImpl = new MNReadImpl(irodsAccessObjectFactory, - restConfiguration); + MNReadImpl mnReadImpl = new MNReadImpl( + publicationContext.getIrodsAccessObjectFactory(), + publicationContext.getRestConfiguration()); ObjectList objectList = mnReadImpl.listObjects(fromDate, toDate, formatId, replicaStatus, start, count); mnObjectList.copy(objectList); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 9f1347a..7f38fba 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-20T13:44:41Z"; + public static String BUILD_TIME="2017-02-21T13:00:51Z"; } diff --git a/dataone-utils/pom.xml b/dataone-utils/pom.xml index 03a6c5a..70e8e76 100644 --- a/dataone-utils/pom.xml +++ b/dataone-utils/pom.xml @@ -43,7 +43,31 @@ org.apache.tika tika-core - + + org.springframework + spring-core + + + org.springframework + spring-expression + + + org.springframework + spring-aop + + + org.springframework + spring-webmvc + + + org.springframework + spring-context + + + org.springframework + spring-beans + + diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PublicationContext.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PublicationContext.java new file mode 100644 index 0000000..ae1bf36 --- /dev/null +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PublicationContext.java @@ -0,0 +1,55 @@ +/** + * + */ +package org.irods.jargon.dataone.configuration; + +import org.irods.jargon.core.pub.IRODSAccessObjectFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Sharable context elements between components of the DataONE service + * + * @author mconway + * + */ +@Component +public class PublicationContext { + @Autowired + IRODSAccessObjectFactory irodsAccessObjectFactory; + + @Autowired + RestConfiguration restConfiguration; + + /** + * @return the irodsAccessObjectFactory + */ + public IRODSAccessObjectFactory getIrodsAccessObjectFactory() { + return irodsAccessObjectFactory; + } + + /** + * @param irodsAccessObjectFactory + * the irodsAccessObjectFactory to set + */ + public void setIrodsAccessObjectFactory( + IRODSAccessObjectFactory irodsAccessObjectFactory) { + this.irodsAccessObjectFactory = irodsAccessObjectFactory; + } + + /** + * @return the restConfiguration + */ + public RestConfiguration getRestConfiguration() { + return restConfiguration; + } + + /** + * @param restConfiguration + * the restConfiguration to set + */ + public void setRestConfiguration(RestConfiguration restConfiguration) { + this.restConfiguration = restConfiguration; + } + +} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java rename to dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/package-info.java similarity index 100% rename from dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java rename to dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/package-info.java diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/factory/package-info.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/factory/package-info.java new file mode 100644 index 0000000..3240715 --- /dev/null +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/factory/package-info.java @@ -0,0 +1,8 @@ +/** + * + */ +/** + * @author mconway + * + */ +package org.irods.jargon.dataone.factory; \ No newline at end of file diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceFactory.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceFactory.java new file mode 100644 index 0000000..8ac9a63 --- /dev/null +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceFactory.java @@ -0,0 +1,16 @@ +/** + * + */ +package org.irods.jargon.dataone.events; + +/** + * Factory interface that will discover and create the event service + * + * @author mconway + * + */ +public interface EventServiceFactory { + + // EventService instance(DataOneContext dataOneContext); + +} From 95daabe8b34726f778a336c9d9226a169137a820 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 21 Feb 2017 10:24:26 -0500 Subject: [PATCH 21/88] #2 adding reflection based plugin loader infrastructure adapted from pulisher api --- .../jargon/dataone/utils/RestVersion.java | 2 +- dataone-utils/pom.xml | 10 ++ .../configuration/PluginDiscoveryService.java | 153 ++++++++++++++++++ .../PluginNotFoundException.java | 20 +++ .../configuration/PluginRuntimeException.java | 56 +++++++ .../configuration/RestConfiguration.java | 68 +++++++- 6 files changed, 306 insertions(+), 3 deletions(-) create mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java create mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginNotFoundException.java create mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginRuntimeException.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 7f38fba..405a48c 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-21T13:00:51Z"; + public static String BUILD_TIME="2017-02-21T15:23:52Z"; } diff --git a/dataone-utils/pom.xml b/dataone-utils/pom.xml index 70e8e76..7fa05ec 100644 --- a/dataone-utils/pom.xml +++ b/dataone-utils/pom.xml @@ -67,6 +67,16 @@ org.springframework spring-beans + + org.xeustechnologies + jcl-core + 2.7 + + + org.reflections + reflections + 0.9.10 + diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java new file mode 100644 index 0000000..19b0f90 --- /dev/null +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java @@ -0,0 +1,153 @@ +/** + * + */ +package org.irods.jargon.dataone.configuration; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.reflections.Reflections; +import org.reflections.scanners.SubTypesScanner; +import org.reflections.scanners.TypeAnnotationsScanner; +import org.reflections.util.ConfigurationBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.xeustechnologies.jcl.JarClassLoader; +import org.xeustechnologies.jcl.context.DefaultContextLoader; +import org.xeustechnologies.jcl.context.JclContext; + +/** + * Service to locate and surface provided publisher plug-ins. Handles all the + * classloader and reflection tasks. + * + * @author Mike Conway - DICE + * + */ +@Component +public class PluginDiscoveryService { + + private JarClassLoader jcl; + private List urls = new ArrayList(); + @Autowired + private PublicationContext publicationContext; + + public static final Logger log = LoggerFactory + .getLogger(PluginDiscoveryService.class); + + public PluginDiscoveryService() { + } + + private final Class loadImplClass(Class clazz) + throws PluginNotFoundException { + + /* + * see: https://github.com/ronmamo/reflections + */ + + ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); + configurationBuilder + .setUrls(urls) + .addClassLoader(JclContext.get()) + .addScanners(new SubTypesScanner(), + new TypeAnnotationsScanner()); + Reflections reflections = new Reflections(configurationBuilder); + + Set> mechanisms = reflections.getTypesAnnotatedWith(clazz, + true); + log.info("mechanisms:{}", mechanisms); + + if (mechanisms.isEmpty()) { + throw new PluginNotFoundException("no plugin found for class:" + + clazz.getName()); + } + + return mechanisms.iterator().next(); + + } + + /** + * Initialize publisher based on (required) configuration + * + * @throws PublicationException + */ + public void init() { + log.info("init()"); + if (publicationContext == null) { + throw new PluginRuntimeException( + "init() cannot be called, no provided publicationContext"); + } + + if (publicationContext.getRestConfiguration().getPluginJarLocation() == null + || publicationContext.getRestConfiguration() + .getPluginJarLocation().isEmpty()) { + throw new PluginRuntimeException( + "no jar file plugin directory specified"); + } + + log.info("scanning for plugin jars at:{}", publicationContext + .getRestConfiguration().getPluginJarLocation()); + loadCandidateClasspaths(publicationContext.getRestConfiguration() + .getPluginJarLocation()); + + } + + private void loadCandidateClasspaths(String libDir) { + + /* + * See https://github.com/kamranzafar/JCL for usage of JCL + */ + + File dependencyDirectory = new File(libDir); + File[] files = dependencyDirectory.listFiles(); + ArrayList uris = new ArrayList(); + for (int i = 0; i < files.length; i++) { + if (files[i].getName().endsWith(".jar")) { + log.info("adding jar:{} to candidates", files[i]); + uris.add(files[i].toURI()); + } + } + + log.info("creating jar class loader..."); + jcl = new JarClassLoader(); + + for (URI uri : uris) { + log.info("adding uri for jar:{}", uri); + try { + jcl.add(uri.toURL()); + urls.add(uri.toURL()); // testing outside jcl FIXME: decide! + } catch (MalformedURLException e) { + log.error("malformed url for jar file:{}", uri, e); + throw new PluginRuntimeException("error loading jar file", e); + } + } + + if (JclContext.get() == null) { + DefaultContextLoader context = new DefaultContextLoader(jcl); + context.loadContext(); + } + + } + + /** + * @return the publicationContext + */ + public PublicationContext getPublicationContext() { + return publicationContext; + } + + /** + * @param publicationContext + * the publicationContext to set + */ + public void setPublicationContext(PublicationContext publicationContext) { + this.publicationContext = publicationContext; + } + +} diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginNotFoundException.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginNotFoundException.java new file mode 100644 index 0000000..d515011 --- /dev/null +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginNotFoundException.java @@ -0,0 +1,20 @@ +/** + * + */ +package org.irods.jargon.dataone.configuration; + +/** + * Warns of a missing plugin of a given type + * + * @author mconway + * + */ +public class PluginNotFoundException extends Exception { + + public PluginNotFoundException(String string) { + super(string); + } + + private static final long serialVersionUID = 2365990131845450987L; + +} diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginRuntimeException.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginRuntimeException.java new file mode 100644 index 0000000..2f61abb --- /dev/null +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginRuntimeException.java @@ -0,0 +1,56 @@ +/** + * + */ +package org.irods.jargon.dataone.configuration; + +/** + * @author mconway + * + */ +public class PluginRuntimeException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = 1878244280920075564L; + + /** + * + */ + public PluginRuntimeException() { + } + + /** + * @param arg0 + */ + public PluginRuntimeException(String arg0) { + super(arg0); + } + + /** + * @param arg0 + */ + public PluginRuntimeException(Throwable arg0) { + super(arg0); + } + + /** + * @param arg0 + * @param arg1 + */ + public PluginRuntimeException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + + /** + * @param arg0 + * @param arg1 + * @param arg2 + * @param arg3 + */ + public PluginRuntimeException(String arg0, Throwable arg1, boolean arg2, + boolean arg3) { + super(arg0, arg1, arg2, arg3); + } + +} diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java index 8453586..e629082 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java @@ -18,8 +18,7 @@ public class RestConfiguration { private String publicKeyAbsPath = ""; private String irodsUserName; private String irodsUserPswd; - - private String handlePrefix = "11333/"; + private String pluginJarLocation; /** * Optional URL for a web interface to access grid data (typically an @@ -172,4 +171,69 @@ public void setIrodsUserPswd(final String irodsUserPswd) { this.irodsUserPswd = irodsUserPswd; } + /** + * @return the pluginJarLocation + */ + public String getPluginJarLocation() { + return pluginJarLocation; + } + + /** + * @param pluginJarLocation + * the pluginJarLocation to set + */ + public void setPluginJarLocation(String pluginJarLocation) { + this.pluginJarLocation = pluginJarLocation; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("RestConfiguration ["); + if (irodsHost != null) { + builder.append("irodsHost=").append(irodsHost).append(", "); + } + builder.append("irodsPort=").append(irodsPort).append(", "); + if (irodsZone != null) { + builder.append("irodsZone=").append(irodsZone).append(", "); + } + if (defaultStorageResource != null) { + builder.append("defaultStorageResource=") + .append(defaultStorageResource).append(", "); + } + if (realm != null) { + builder.append("realm=").append(realm).append(", "); + } + builder.append("smimeEncryptAdminFunctions=") + .append(smimeEncryptAdminFunctions).append(", "); + if (privateCertAbsPath != null) { + builder.append("privateCertAbsPath=").append(privateCertAbsPath) + .append(", "); + } + if (publicKeyAbsPath != null) { + builder.append("publicKeyAbsPath=").append(publicKeyAbsPath) + .append(", "); + } + if (irodsUserName != null) { + builder.append("irodsUserName=").append(irodsUserName).append(", "); + } + if (irodsUserPswd != null) { + builder.append("irodsUserPswd=").append(irodsUserPswd).append(", "); + } + if (pluginJarLocation != null) { + builder.append("pluginJarLocation=").append(pluginJarLocation) + .append(", "); + } + if (webInterfaceURL != null) { + builder.append("webInterfaceURL=").append(webInterfaceURL); + } + builder.append("]"); + return builder.toString(); + } + } From fa4502714ed4ee3ec205a207600b64f33b4658a6 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 24 Feb 2017 08:40:16 -0500 Subject: [PATCH 22/88] #2 adding abstract pid and event service with configs --- dataone-node/pom.xml | 17 ---- .../jargon/dataone/utils/RestVersion.java | 2 +- .../dataone/plugin/AbstractDataOnePlugin.java | 32 +++++++ .../jargon/dataone/plugin/package-info.java | 6 ++ .../events/AbstractEventServiceAO.java | 55 ++++++++++++ .../{EventLogAO.java => EventServiceAO.java} | 2 +- .../pid/pidservice/AbstractUniqueIdAO.java | 84 +++++++++++++++++++ pom.xml | 28 +++++++ 8 files changed, 207 insertions(+), 19 deletions(-) create mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java create mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/package-info.java create mode 100644 event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java rename event-service-api/src/main/java/org/irods/jargon/dataone/events/{EventLogAO.java => EventServiceAO.java} (97%) create mode 100644 pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 77a46a2..b8faf63 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -108,26 +108,10 @@ org.springframework spring-webmvc - - - spring-expression - org.springframework - - org.springframework spring-context - - - spring-aop - org.springframework - - - spring-expression - org.springframework - - org.springframework @@ -155,7 +139,6 @@ org.irods.jargon.springboot resteasy-spring-boot-starter - 4.1.10.0-SNAPSHOT diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 405a48c..628512f 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-21T15:23:52Z"; + public static String BUILD_TIME="2017-02-24T13:39:32Z"; } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java new file mode 100644 index 0000000..4a01297 --- /dev/null +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java @@ -0,0 +1,32 @@ +package org.irods.jargon.dataone.plugin; + +import org.irods.jargon.dataone.configuration.PublicationContext; + +/** + * + * @author mconway + * + */ +public class AbstractDataOnePlugin { + + /** + * Represents a handle to iRODS connection and general configuration + * information + */ + private final PublicationContext publicationContext; + + /** + * @param publicationContext + */ + public AbstractDataOnePlugin(PublicationContext publicationContext) { + this.publicationContext = publicationContext; + } + + /** + * @return the publicationContext + */ + protected PublicationContext getPublicationContext() { + return publicationContext; + } + +} diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/package-info.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/package-info.java new file mode 100644 index 0000000..1e69e92 --- /dev/null +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/package-info.java @@ -0,0 +1,6 @@ +/** + * Plugin framework for dataone + * @author mconway + * + */ +package org.irods.jargon.dataone.plugin; \ No newline at end of file diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java new file mode 100644 index 0000000..541de90 --- /dev/null +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java @@ -0,0 +1,55 @@ +/** + * + */ +package org.irods.jargon.dataone.events; + +import java.util.Date; + +import org.dataone.service.exceptions.ServiceFailure; +import org.dataone.service.types.v1.Event; +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.Log; +import org.irods.jargon.core.exception.InvalidArgumentException; +import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.plugin.AbstractDataOnePlugin; + +/** + * Abstract superclass for the event service that accepts context and + * configuration information from the member node service + * + * @author mconway + * + */ +public abstract class AbstractEventServiceAO extends AbstractDataOnePlugin + implements EventServiceAO { + + public AbstractEventServiceAO(PublicationContext publicationContext) { + super(publicationContext); + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.events.EventServiceAO#getLogs(java.util.Date, + * java.util.Date, org.irods.jargon.dataone.events.EventsEnum, + * java.lang.String, int, int) + */ + @Override + public abstract Log getLogs(Date fromDate, Date toDate, EventsEnum event, + String pidFilter, int startIdx, int count); + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.events.EventServiceAO#recordEvent(org.dataone + * .service.types.v1.Event, org.dataone.service.types.v1.Identifier, + * java.lang.String) + */ + @Override + public abstract void recordEvent(Event event, Identifier id, + String description) throws InvalidArgumentException, + JargonException, ServiceFailure; +} diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceAO.java similarity index 97% rename from event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java rename to event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceAO.java index ef6eecc..d9b1977 100644 --- a/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLogAO.java +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceAO.java @@ -15,7 +15,7 @@ * @author mconway * */ -public interface EventLogAO { +public interface EventServiceAO { /** * Retrieve logs from the event registry given the parameters diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java new file mode 100644 index 0000000..8b04e18 --- /dev/null +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java @@ -0,0 +1,84 @@ +/** + * + */ +package org.irods.jargon.pid.pidservice; + +import java.util.Date; +import java.util.List; + +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.core.pub.domain.DataObject; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.plugin.AbstractDataOnePlugin; + +/** + * Abstract superclass for a pid handler that will accept the provided context + * from the DataONE service when created by the discovery mechanism + * + * @author mconway + * + */ +public abstract class AbstractUniqueIdAO extends AbstractDataOnePlugin + implements UniqueIdAO { + + /** + * Default constructor takes a context object with a handle to connection + * and config + * + * @param publicationContext + */ + public AbstractUniqueIdAO(PublicationContext publicationContext) { + super(publicationContext); + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.pid.pidservice.UniqueIdAO#getIdentifierFromDataObject + * (org.irods.jargon.core.pub.domain.DataObject) + */ + @Override + public abstract Identifier getIdentifierFromDataObject(DataObject dataObject) + throws JargonException; + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.pid.pidservice.UniqueIdAO#getDataObjectFromIdentifier + * (org.dataone.service.types.v1.Identifier) + */ + @Override + public abstract DataObject getDataObjectFromIdentifier(Identifier identifier) + throws JargonException; + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.pid.pidservice.UniqueIdAO#getListOfDataoneExposedIdentifiers + * () + */ + @Override + public abstract List getListOfDataoneExposedIdentifiers() + throws JargonException; + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.pid.pidservice.UniqueIdAO#getListOfDataoneExposedDataObjects + * (java.util.Date, java.util.Date, + * org.dataone.service.types.v1.ObjectFormatIdentifier, java.lang.Boolean, + * java.lang.Integer, java.lang.Integer) + */ + @Override + public abstract DataObjectListResponse getListOfDataoneExposedDataObjects( + Date fromDate, Date toDate, ObjectFormatIdentifier formatId, + Boolean replicaStatus, Integer start, Integer count) + throws JargonException; + +} diff --git a/pom.xml b/pom.xml index 70b82c8..400ff0e 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,34 @@ + + + dice.repository snaps + dice.repository.snapshots + https://raw.github.com/DICE-UNC/DICE-Maven/master/snapshots + + true + + + true + always + warn + + + + dice.repository + dice.repository + https://raw.github.com/DICE-UNC/DICE-Maven/master/releases + + true + + + true + always + warn + + + dataone-node pid-service-api From ae14af6636e3b48a1c87efb54658d937459518bc Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 24 Feb 2017 12:42:51 -0500 Subject: [PATCH 23/88] #2 working on first test for plugin event service --- .../configuration/PluginDiscoveryService.java | 31 ++++++-- .../dataone/configuration/package-info.java | 7 ++ .../jargon/dataone/utils/RestVersion.java | 2 +- .../PluginDiscoveryServiceTest.java | 15 ++++ .../src/test/resources/log4j.properties | 9 +++ .../PluginNotFoundException.java | 6 +- dummy-event-service-impl/pom.xml | 53 ++++++++++++++ .../src/main/java/.gitinclude | 0 .../impl/dummy/DummyEventServiceAOImpl.java | 72 +++++++++++++++++++ .../events/impl/dummy/package-info.java | 6 ++ .../src/main/resources/.gitinclude | 0 .../src/test/java/.gitinclude | 0 .../src/test/resources/.gitinclude | 0 .../src/test/resources/log4j.properties | 9 +++ pom.xml | 3 +- 15 files changed, 206 insertions(+), 7 deletions(-) rename {dataone-utils => dataone-node}/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java (78%) create mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java create mode 100644 dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java create mode 100644 dataone-node/src/test/resources/log4j.properties create mode 100644 dummy-event-service-impl/pom.xml create mode 100644 dummy-event-service-impl/src/main/java/.gitinclude create mode 100644 dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceAOImpl.java create mode 100644 dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/package-info.java create mode 100644 dummy-event-service-impl/src/main/resources/.gitinclude create mode 100644 dummy-event-service-impl/src/test/java/.gitinclude create mode 100644 dummy-event-service-impl/src/test/resources/.gitinclude create mode 100644 dummy-event-service-impl/src/test/resources/log4j.properties diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java similarity index 78% rename from dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java rename to dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java index 19b0f90..5467979 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java @@ -4,6 +4,8 @@ package org.irods.jargon.dataone.configuration; import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; @@ -11,6 +13,8 @@ import java.util.List; import java.util.Set; +import org.irods.jargon.dataone.events.AbstractEventServiceAO; +import org.irods.jargon.dataone.events.EventServiceAO; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; import org.reflections.scanners.TypeAnnotationsScanner; @@ -44,7 +48,24 @@ public class PluginDiscoveryService { public PluginDiscoveryService() { } - private final Class loadImplClass(Class clazz) + public EventServiceAO instanceEventService() throws PluginNotFoundException { + log.info("instanceEventService()"); + Class clazz = loadImplClass(AbstractEventServiceAO.class); + try { + Constructor ctor = clazz + .getConstructor(PublicationContext.class); + return (EventServiceAO) ctor + .newInstance(new Object[] { publicationContext }); + } catch (NoSuchMethodException | SecurityException + | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + log.error("cannot find appropriate plugin", e); + throw new PluginNotFoundException(e); + } + } + + @SuppressWarnings("unchecked") + private final Class loadImplClass(Class clazz) throws PluginNotFoundException { /* @@ -59,8 +80,10 @@ private final Class loadImplClass(Class clazz) new TypeAnnotationsScanner()); Reflections reflections = new Reflections(configurationBuilder); - Set> mechanisms = reflections.getTypesAnnotatedWith(clazz, - true); + Set mechanisms = reflections.getSubTypesOf(clazz); + + // .getTypesAnnotatedWith(clazz, + // true); log.info("mechanisms:{}", mechanisms); if (mechanisms.isEmpty()) { @@ -68,7 +91,7 @@ private final Class loadImplClass(Class clazz) + clazz.getName()); } - return mechanisms.iterator().next(); + return (Class) mechanisms.iterator().next(); } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java new file mode 100644 index 0000000..4d9c60a --- /dev/null +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/package-info.java @@ -0,0 +1,7 @@ +/** + * Implementation of the DataONE REST API + * + * @author Lisa Stillwell - RENCI - UNC, Chapel Hill (www.renci.org) + * + */ +package org.irods.jargon.dataone.configuration; \ No newline at end of file diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 628512f..c0f23f7 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-24T13:39:32Z"; + public static String BUILD_TIME="2017-02-24T17:32:44Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java new file mode 100644 index 0000000..fc2ab67 --- /dev/null +++ b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java @@ -0,0 +1,15 @@ +package org.irods.jargon.dataone.configuration; + +import org.junit.Test; + +public class PluginDiscoveryServiceTest { + + @Test + public void testInstanceEventService() { + PublicationContext publicationContext = new PublicationContext(); + RestConfiguration restConfiguration = new RestConfiguration(); + // restConfiguration.setPluginJarLocation(pluginJarLocation); + PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); + // EventServiceAO eventServiceAO = + } +} diff --git a/dataone-node/src/test/resources/log4j.properties b/dataone-node/src/test/resources/log4j.properties new file mode 100644 index 0000000..0228b8f --- /dev/null +++ b/dataone-node/src/test/resources/log4j.properties @@ -0,0 +1,9 @@ +# Set root logger level and appender +log4j.rootLogger=DEBUG, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginNotFoundException.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginNotFoundException.java index d515011..d5ea4ae 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginNotFoundException.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PluginNotFoundException.java @@ -11,10 +11,14 @@ */ public class PluginNotFoundException extends Exception { + private static final long serialVersionUID = 2365990131845450987L; + public PluginNotFoundException(String string) { super(string); } - private static final long serialVersionUID = 2365990131845450987L; + public PluginNotFoundException(Exception e) { + super(e); + } } diff --git a/dummy-event-service-impl/pom.xml b/dummy-event-service-impl/pom.xml new file mode 100644 index 0000000..bb9dc73 --- /dev/null +++ b/dummy-event-service-impl/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + dummy-event-service-impl + + org.irods + dfc-dataone + 4.2.1.0-SNAPSHOT + + jar + Event service dummy implementation for testing purposes + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + org.irods + event-service-api + ${project.version} + + + org.irods + dataone-utils + ${project.version} + + + diff --git a/dummy-event-service-impl/src/main/java/.gitinclude b/dummy-event-service-impl/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceAOImpl.java b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceAOImpl.java new file mode 100644 index 0000000..7a543a6 --- /dev/null +++ b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceAOImpl.java @@ -0,0 +1,72 @@ +/** + * + */ +package org.irods.jargon.dataone.events.impl.dummy; + +import java.util.Date; + +import org.dataone.service.exceptions.ServiceFailure; +import org.dataone.service.types.v1.Event; +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.Log; +import org.irods.jargon.core.exception.InvalidArgumentException; +import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.events.AbstractEventServiceAO; +import org.irods.jargon.dataone.events.EventsEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Dummy implementation of an event service suitable for testing of discovery + * and loading + * + * @author mconway + * + */ +public class DummyEventServiceAOImpl extends AbstractEventServiceAO { + + public static final Logger log = LoggerFactory + .getLogger(DummyEventServiceAOImpl.class); + + /** + * @param publicationContext + */ + public DummyEventServiceAOImpl(PublicationContext publicationContext) { + super(publicationContext); + log.info("publicationContext:{}", publicationContext); + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.events.AbstractEventServiceAO#getLogs(java.util + * .Date, java.util.Date, org.irods.jargon.dataone.events.EventsEnum, + * java.lang.String, int, int) + */ + @Override + public Log getLogs(Date fromDate, Date toDate, EventsEnum event, + String pidFilter, int startIdx, int count) { + log.info("getLogs()"); + return new Log(); + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.events.AbstractEventServiceAO#recordEvent(org + * .dataone.service.types.v1.Event, org.dataone.service.types.v1.Identifier, + * java.lang.String) + */ + @Override + public void recordEvent(Event event, Identifier id, String description) + throws InvalidArgumentException, JargonException, ServiceFailure { + log.info("recordEvent()"); + log.info("event:{}", event); + log.info("id:{}", id); + log.info("description:{}", description); + } + +} diff --git a/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/package-info.java b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/package-info.java new file mode 100644 index 0000000..57f8956 --- /dev/null +++ b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/package-info.java @@ -0,0 +1,6 @@ +/** + * Dummy impl of an events service + * @author mconway + * + */ +package org.irods.jargon.dataone.events.impl.dummy; \ No newline at end of file diff --git a/dummy-event-service-impl/src/main/resources/.gitinclude b/dummy-event-service-impl/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/dummy-event-service-impl/src/test/java/.gitinclude b/dummy-event-service-impl/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/dummy-event-service-impl/src/test/resources/.gitinclude b/dummy-event-service-impl/src/test/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/dummy-event-service-impl/src/test/resources/log4j.properties b/dummy-event-service-impl/src/test/resources/log4j.properties new file mode 100644 index 0000000..0228b8f --- /dev/null +++ b/dummy-event-service-impl/src/test/resources/log4j.properties @@ -0,0 +1,9 @@ +# Set root logger level and appender +log4j.rootLogger=DEBUG, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n diff --git a/pom.xml b/pom.xml index 400ff0e..c547e13 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ - michal-conway + michael-conway Mike Conway michael_conway@unc.edu http://www.renci.org @@ -92,5 +92,6 @@ event-service-api pid-service-handle-impl dataone-utils + dummy-event-service-impl From 9a66893680251e85ce5bac003a2fa7f06cc9ecbd Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 28 Feb 2017 15:13:32 -0500 Subject: [PATCH 24/88] #1 some cleanups and merge of dev --- dataone-node/pom.xml | 8 ++++++++ pom.xml | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index b8faf63..5d3b0ba 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -140,6 +140,14 @@ org.irods.jargon.springboot resteasy-spring-boot-starter + + org.xeustechnologies + jcl-core + + + org.reflections + reflections + diff --git a/pom.xml b/pom.xml index c547e13..e8f6964 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,16 @@ 2.3.0 jar + + org.xeustechnologies + jcl-core + 2.7 + + + org.reflections + reflections + 0.9.10 + From a0b3e84a4cc51ef448bea957120e7bf123f9f008 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 28 Feb 2017 15:19:36 -0500 Subject: [PATCH 25/88] #1 looking for missing abstractdataoneplugin --- .../org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java index 4a01297..4172fe7 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java @@ -5,7 +5,7 @@ /** * * @author mconway - * + * */ public class AbstractDataOnePlugin { From 979873eb5a1e3fb2055be4ed7529eb4803a27c15 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 28 Feb 2017 15:29:37 -0500 Subject: [PATCH 26/88] #6 introduce abstract plugin --- .../jargon/dataone/tier1/MNReadImpl.java | 108 +++++++++--------- .../jargon/dataone/utils/RestVersion.java | 2 +- pid-service-api/pom.xml | 9 ++ 3 files changed, 64 insertions(+), 55 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index c44c0f0..9ef7f02 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -75,7 +75,7 @@ public MNReadImpl(final IRODSAccessObjectFactory irodsAccessObjectFactory, @Override public DescribeResponse describe(final Identifier id) throws InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure, NotFound { + NotAuthorized, NotImplemented, ServiceFailure, NotFound { if (id == null || id.getValue().isEmpty()) { log.error("id is null or empty"); @@ -176,7 +176,7 @@ public void streamObject(final HttpServletResponse response, * dataObject.getAbsolutePath(); irodsFile = * irodsAccessObjectFactory.getIRODSFileFactory( * irodsAccount).instanceIRODSFile(path); - * + * * if (!irodsFile.exists()) { log.info("file does not exist"); throw * new NotFound("1020", * "No data object could be found for given PID:" + id.getValue()); @@ -190,35 +190,35 @@ public void streamObject(final HttpServletResponse response, } /* - * + * * // now try and stream it try { - * + * * stream = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount) * .instanceIRODSFileInputStream(irodsFile); // TODO: need to catch and * return appropriate exceptions here for no // permission - * + * * contentLength = (int) irodsFile.length(); * log.info("contentLength={}", contentLength); - * + * * response.setContentType("application/octet-stream"); * response.setHeader("Content-Disposition", "attachment;filename=" + * dataObject.getDataName()); response.setContentLength(contentLength); * // response.addHeader("Vary", "Accept-Encoding"); * log.info("reponse: {}", response.toString()); - * + * * output = new BufferedOutputStream(response.getOutputStream()); - * + * * // Stream2StreamAO stream2StreamAO = getIrodsAccessObjectFactory() // * .getStream2StreamAO(irodsAccount); // * stream2StreamAO.streamToStreamCopyUsingStandardIO(input, output); - * + * * int readBytes = 0; byte[] buffer = new byte[4096]; - * + * * while ((readBytes = stream.read(buffer, 0, 4096)) != -1) { // * log.info("readBytes={}", readBytes); output.write(buffer, 0, * readBytes); } output.flush(); if (stream != null) stream.close(); if * (output != null) output.close(); - * + * * } catch (Exception e) { log.error("Cannot stream iRODS object: {}", * path); throw new ServiceFailure("1030", * "unable to stream iRODS data object"); } finally { @@ -229,8 +229,8 @@ public void streamObject(final HttpServletResponse response, @Override public IRODSFileInputStream get(final Identifier id) throws InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure, NotFound, - InsufficientResources { + NotAuthorized, NotImplemented, ServiceFailure, NotFound, + InsufficientResources { // TODO: Not sure how to implement this properly - used streamObject // method instead @@ -297,11 +297,11 @@ public Checksum getChecksum(final Identifier id, final String algorithm) /* * try { - * + * * // FIXME: need to add handle stuff - * - * - * + * + * + * * UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl( * restConfiguration, irodsAccessObjectFactory); dataObject = * handleImpl.getDataObjectFromIdentifier(id); String csum = @@ -311,7 +311,7 @@ public Checksum getChecksum(final Identifier id, final String algorithm) * "Checksum does not exist for data object id provided"); } * checksum.setValue(csum); checksum.setAlgorithm(properties * .getProperty("irods.dataone.chksum-algorithm")); - * + * * } catch (FileNotFoundException nf) { * log.error("Cannot access iRODS object: {}", * dataObject.getAbsolutePath()); throw new NotFound("1410", @@ -334,8 +334,8 @@ public Checksum getChecksum(final Session arg0, final Identifier arg1, @Override public InputStream getReplica(final Identifier arg0) throws InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure, NotFound, - InsufficientResources { + NotAuthorized, NotImplemented, ServiceFailure, NotFound, + InsufficientResources { // This is implemented in streamObject return null; } @@ -368,51 +368,51 @@ public SystemMetadata getSystemMetadata(final Identifier id) // FIXME: add handle stuff /* - * + * * try { irodsAccount = RestAuthUtils * .getIRODSAccountFromBasicAuthValues(restConfiguration); - * + * * dataObjectAO = irodsAccessObjectFactory * .getDataObjectAO(irodsAccount); UniqueIdAOHandleImpl handleImpl = new * UniqueIdAOHandleImpl( restConfiguration, irodsAccessObjectFactory); * dataObject = handleImpl.getDataObjectFromIdentifier(id); - * + * * } catch (Exception ex) { log.info("file does not exist"); throw new * NotFound("1060", "No metadata could be found for given PID:" + * id.getValue()); } - * - * + * + * * try { String csum = dataObject.getChecksum(); if (csum == null) { * log.info("checksum does not exist for file: {}", * dataObject.getAbsolutePath()); // throw new NotFound("404", "1420"); * } else { checksum.setValue(csum); checksum.setAlgorithm(properties * .getProperty("irods.dataone.chksum-algorithm")); } - * + * * String format = DataTypeUtils.getDataObjectFormatFromMetadata( * irodsAccount, irodsAccessObjectFactory, dataObject); if (format == * null) { format = getDataObjectMimeType(irodsAccount, dataObject); } * metadata.setIdentifier(id); ObjectFormatIdentifier formatId = new * ObjectFormatIdentifier(); formatId.setValue(format); * metadata.setFormatId(formatId); - * + * * Long dataSizeLong = new Long(dataObject.getDataSize()); String * dataSizeStr = dataSizeLong.toString(); metadata.setSize(new * BigInteger(dataSizeStr)); metadata.setChecksum(checksum); - * + * * String dataOwner = "uid=" + dataObject.getDataOwnerName(); Subject * submitter = new Subject(); submitter.setValue(dataOwner); * metadata.setSubmitter(submitter); - * + * * Subject rightsHolder = new Subject(); * rightsHolder.setValue(dataOwner); * metadata.setRightsHolder(rightsHolder); - * + * * List permissions = dataObjectAO * .listPermissionsForDataObject(dataObject.getAbsolutePath()); if * (permissions != null) { AccessPolicy accessPolicy = new * AccessPolicy(); for (UserFilePermission permission : permissions) { * AccessRule rule = new AccessRule(); Subject subject = new Subject(); - * + * * // in DataONE - anonymous translates to public // TODO: also may need * to make translation for "public" to // "authenticatedUser" if * (permission.getUserName().equals("anonymous")) { @@ -422,13 +422,13 @@ public SystemMetadata getSystemMetadata(final Identifier id) * (Permission d1Premission : d1Premissions) { * rule.addPermission(d1Premission); } accessPolicy.addAllow(rule); } * metadata.setAccessPolicy(accessPolicy); } - * + * * ReplicationPolicy replicationPolicy = new ReplicationPolicy(); * replicationPolicy.setReplicationAllowed(false); * metadata.setReplicationPolicy(replicationPolicy); - * + * * // Add support for obsoletes or obsoletedBy? - * + * * // Use AVU epoch date // * metadata.setDateUploaded(dataObject.getCreatedAt()); // * metadata.setDateSysMetadataModified(dataObject.getUpdatedAt()); Date @@ -436,13 +436,13 @@ public SystemMetadata getSystemMetadata(final Identifier id) * irodsAccessObjectFactory, irodsAccount, dataObject); * metadata.setDateSysMetadataModified(startDate); * metadata.setDateUploaded(startDate); - * + * * NodeReference nodeReference = new NodeReference(); * nodeReference.setValue(properties * .getProperty("irods.dataone.identifier")); * metadata.setOriginMemberNode(nodeReference); * metadata.setAuthoritativeMemberNode(nodeReference); - * + * * } catch (Exception e) { log.error("Cannot access iRODS object: {}", * dataObject.getAbsolutePath()); throw new ServiceFailure("1090", * e.getMessage()); } finally { @@ -472,33 +472,33 @@ public ObjectList listObjects(final Date fromDate, final Date toDate, // FIXME: handle stuff /* - * + * * UniqueIdAOHandleInMetadataImpl handleImpl; - * + * * try { // handleImpl = new UniqueIdAOHandleImpl(restConfiguration, // * irodsAccessObjectFactory); handleImpl = new * UniqueIdAOHandleInMetadataImpl(restConfiguration, * irodsAccessObjectFactory); - * + * * // dataObjectListResponse = // * handleImpl.getListOfDataoneExposedDataObjects( dataObjectListResponse * = handleImpl .getListOfDataoneExposedDataObjects(fromDate, toDate, * formatId, replicaStatus, start, count); } catch (Exception ex) { * log.info("{}", ex.toString()); throw new ServiceFailure("1580", * "Could not retrieve list of data objects"); } - * + * * dataObjectList = dataObjectListResponse.getDataObjects(); - * + * * for (DataObject dObject : dataObjectList) { - * + * * ObjectInfo oInfo = new ObjectInfo(); - * + * * if (dObject.getChecksum() != null) { Checksum checksum = new * Checksum(); checksum.setValue(dObject.getChecksum()); * checksum.setAlgorithm(properties * .getProperty("irods.dataone.chksum-algorithm")); * oInfo.setChecksum(checksum); } - * + * * // probably should combine query for format and start date at some // * future refactor IRODSAccount irodsAccount = null; ; String format = * null; try { irodsAccount = RestAuthUtils @@ -512,7 +512,7 @@ public ObjectList listObjects(final Date fromDate, final Date toDate, * , dObject.getAbsolutePath()); format = "application/octet-stream"; } * ObjectFormatIdentifier fId = new ObjectFormatIdentifier(); * fId.setValue(format); oInfo.setFormatId(fId); - * + * * // oInfo.setDateSysMetadataModified(dObject.getUpdatedAt()); Date * startDate = new Date(); try { startDate = * DataObjectMetadataUtils.getStartDateTime( irodsAccessObjectFactory, @@ -521,7 +521,7 @@ public ObjectList listObjects(final Date fromDate, final Date toDate, * log.error("cannot retrieve start date for object: {}", * dObject.getAbsolutePath()); } * oInfo.setDateSysMetadataModified(startDate); - * + * * Identifier id; try { id = * handleImpl.getIdentifierFromDataObject(dObject); } catch * (JargonException e) { @@ -529,18 +529,18 @@ public ObjectList listObjects(final Date fromDate, final Date toDate, * e.toString()); throw new ServiceFailure("1580", * "Could not retrieve list of data objects"); } * oInfo.setIdentifier(id); - * + * * Long dataSizeLong = new Long(dObject.getDataSize()); String * dataSizeStr = dataSizeLong.toString(); oInfo.setSize(new * BigInteger(dataSizeStr)); - * + * * objectInfoList.add(oInfo); } - * + * * objectList.setObjectInfoList(objectInfoList); * objectList.setTotal(dataObjectListResponse.getTotal()); * objectList.setCount(objectInfoList.size()); * objectList.setStart(start); - * + * * return objectList; */ @@ -564,13 +564,13 @@ public boolean synchronizationFailed(final SynchronizationFailed syncFailed) // FIXME: fix handle stuff /* - * + * * Identifier pid = null; - * + * * if (syncFailed.getPid() != null) { pid = new Identifier(); * pid.setValue(syncFailed.getPid()); } else { throw new * ServiceFailure("2161", "The identifier cannot be null."); } - * + * * // check to make sure pid is valid try { UniqueIdAOHandleImpl * handleImpl = new UniqueIdAOHandleImpl( restConfiguration, * irodsAccessObjectFactory); // just try to access the object to see if @@ -578,7 +578,7 @@ public boolean synchronizationFailed(final SynchronizationFailed syncFailed) * (Exception ex) { throw new ServiceFailure("2161", * "The identifier specified by " + syncFailed.getPid() + * " was not found on this node."); } - * + * * EventLogAOElasticSearchImpl eventLog = new * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, * restConfiguration); try { diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index c0f23f7..e6123a1 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-24T17:32:44Z"; + public static String BUILD_TIME="2017-02-28T20:27:04Z"; } diff --git a/pid-service-api/pom.xml b/pid-service-api/pom.xml index 204ff00..b915c30 100644 --- a/pid-service-api/pom.xml +++ b/pid-service-api/pom.xml @@ -43,6 +43,15 @@ org.dataone d1_libclient_java + + org.mockito + mockito-all + + + org.irods + dataone-utils + ${project.version} + From e264f22bcc0d1e23fbddc0bea484b8f5a7b6b174 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 28 Feb 2017 17:06:25 -0500 Subject: [PATCH 27/88] #6 adding config to test boot and load of event dummy impl --- dataone-node/pom.xml | 23 ++++--- .../jargon/dataone/utils/RestVersion.java | 2 +- .../src/main/resources/jargon-beans.xml | 60 ++++++++++--------- .../src/test/resources/rest-servlet.xml | 1 + .../test/resources/test-irods-rest.properties | 7 +++ event-service-api/pom.xml | 5 ++ 6 files changed, 55 insertions(+), 43 deletions(-) create mode 100644 dataone-node/src/test/resources/test-irods-rest.properties diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 5d3b0ba..a1f4059 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -187,21 +187,18 @@ validate - - + - - test.confirm=${jargon.test.confirm} - test.data.directory=${jargon.test.data.directory} - test.irods.user=${jargon.test.irods.user} - test.irods.password=${jargon.test.irods.password} - test.irods.resource=${jargon.test.irods.resource} - test.irods.host=${jargon.test.irods.host} - test.irods.port=${jargon.test.irods.port} - test.irods.zone=${jargon.test.irods.zone} - test.irods.scratch.subdir=${jargon.test.irods.scratch.subdir} - test.rest.port=${test.rest.port} + irods.user=${jargon.test.irods.user} + irods.password=${jargon.test.irods.password} + irods.resource=${jargon.test.irods.resource} + irods.host=${jargon.test.irods.host} + irods.port=${jargon.test.irods.port} + irods.zone=${jargon.test.irods.zone} + plugin.jar.location=${test.plugin.jar.location} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index e6123a1..6252b2f 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-28T20:27:04Z"; + public static String BUILD_TIME="2017-02-28T21:59:24Z"; } diff --git a/dataone-node/src/main/resources/jargon-beans.xml b/dataone-node/src/main/resources/jargon-beans.xml index 0484023..3dbd22b 100644 --- a/dataone-node/src/main/resources/jargon-beans.xml +++ b/dataone-node/src/main/resources/jargon-beans.xml @@ -1,43 +1,45 @@ - + - - - + + + - - - + + + - - - - - - - - - + + + + + + + + + + + + - + diff --git a/dataone-node/src/test/resources/rest-servlet.xml b/dataone-node/src/test/resources/rest-servlet.xml index 040c833..5dd5b3e 100644 --- a/dataone-node/src/test/resources/rest-servlet.xml +++ b/dataone-node/src/test/resources/rest-servlet.xml @@ -9,6 +9,7 @@ + diff --git a/dataone-node/src/test/resources/test-irods-rest.properties b/dataone-node/src/test/resources/test-irods-rest.properties new file mode 100644 index 0000000..0770ea2 --- /dev/null +++ b/dataone-node/src/test/resources/test-irods-rest.properties @@ -0,0 +1,7 @@ +irods.user=test1 + irods.password=test + irods.resource=test1-resc + irods.host=irods419.irodslocal + irods.port=1247 + irods.zone=zone1 + plugin.jar.location=/home/mconway/temp/dataonejar \ No newline at end of file diff --git a/event-service-api/pom.xml b/event-service-api/pom.xml index b783c2d..224178c 100644 --- a/event-service-api/pom.xml +++ b/event-service-api/pom.xml @@ -43,6 +43,11 @@ org.dataone d1_libclient_java + + org.irods + dataone-utils + ${project.version} + From 7ab0623bd2e0e4f82935cca1b5bb90e3521538da Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 1 Mar 2017 11:13:38 -0500 Subject: [PATCH 28/88] #3 clean up log4j cyclic dependency --- dataone-node/pom.xml | 37 ++++--- .../irods/jargon/dataone/app/DataOneBoot.java | 24 ----- .../dataone/utils/DataOneTestHelper.java | 96 +++++++++++++++++++ .../jargon/dataone/utils/RestVersion.java | 2 +- .../PluginDiscoveryServiceTest.java | 32 ++++++- ...est.properties => test-dataone.properties} | 4 +- dataone-utils/pom.xml | 4 - pom.xml | 6 ++ 8 files changed, 157 insertions(+), 48 deletions(-) delete mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java create mode 100644 dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataOneTestHelper.java rename dataone-node/src/test/resources/{test-irods-rest.properties => test-dataone.properties} (57%) diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index a1f4059..5b67699 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -85,10 +85,6 @@ log4j log4j - - org.slf4j - slf4j-log4j12 - org.mockito mockito-all @@ -120,6 +116,12 @@ org.dataone d1_libclient_java + + + ch.qos.logback + logback-classic + + org.irods @@ -136,18 +138,25 @@ dataone-utils ${project.version} + + + org.xeustechnologies + jcl-core - org.xeustechnologies - jcl-core - - - org.reflections - reflections - + org.reflections + reflections + @@ -187,10 +196,10 @@ validate - - + - irods.user=${jargon.test.irods.user} irods.password=${jargon.test.irods.password} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java b/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java deleted file mode 100644 index f055ffa..0000000 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/app/DataOneBoot.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * - */ -package org.irods.jargon.dataone.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; - -/** - * DataONE embedded container boot and app assemblies - * - * @author mconway - * - */ - -@SpringBootApplication -public class DataOneBoot extends SpringBootServletInitializer { - - public static void main(final String[] args) { - SpringApplication.run(DataOneBoot.class, args); - } - -} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataOneTestHelper.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataOneTestHelper.java new file mode 100644 index 0000000..40dafb8 --- /dev/null +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataOneTestHelper.java @@ -0,0 +1,96 @@ +package org.irods.jargon.dataone.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.irods.jargon.testutils.TestingUtilsException; + +/** + * Utilities to load testing properties from a properties file + * + * @author Mike Conway, DICE (www.irods.org) + * @since 10/18/2009 + */ +public class DataOneTestHelper { + + public static final String JAR_DIRECTORY_PROP = "plugin.jar.location"; + + public String getPluginJarLocation(final Properties testingProperties) { + return testingProperties.getProperty(JAR_DIRECTORY_PROP); + } + + /** + * Return the given property (by key) as an int + * + * @param testingProperties + * @param key + * @return + * @throws TestingUtilsException + */ + public int getPropertyValueAsInt(final Properties testingProperties, + final String key) throws TestingUtilsException { + String propVal = (String) testingProperties.get(key); + + if (propVal == null || propVal.length() == 0) { + throw new TestingUtilsException( + "missing or invalid value in test-dataone.properties"); + } + + int retVal = 0; + + try { + retVal = Integer.parseInt(propVal); + } catch (NumberFormatException nfe) { + throw new TestingUtilsException( + "port is in valid format to convert to int:" + propVal, nfe); + } + + return retVal; + } + + /** + * Load the properties that control various tests from the + * testing.properties file on the code path + * + * @return Properties class with the test values + * @throws TestingUtilsException + */ + public Properties getTestProperties() throws TestingUtilsException { + ClassLoader loader = this.getClass().getClassLoader(); + InputStream in = loader.getResourceAsStream("test-dataone.properties"); + Properties properties = new Properties(); + + try { + properties.load(in); + } catch (IOException ioe) { + throw new TestingUtilsException( + "error loading test-dataone properties", ioe); + } finally { + try { + in.close(); + } catch (Exception e) { + // ignore + } + } + return properties; + } + + /** + * Get the given property as a boolean + * + * @param testingProperties + * @param key + * @return + */ + public boolean getPropertyValueAsBoolean( + final Properties testingProperties, final String key) { + String val = (String) testingProperties.get(key); + if (val == null) { + return false; + } else { + return Boolean.parseBoolean(val); + } + } + +} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 6252b2f..66e24b1 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-28T21:59:24Z"; + public static String BUILD_TIME="2017-03-01T16:11:41Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java index fc2ab67..9da52e2 100644 --- a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java +++ b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java @@ -1,15 +1,41 @@ package org.irods.jargon.dataone.configuration; +import java.util.Properties; + +import org.irods.jargon.core.pub.IRODSAccessObjectFactory; +import org.irods.jargon.dataone.events.EventServiceAO; +import org.irods.jargon.dataone.utils.DataOneTestHelper; +import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; +import org.mockito.Mockito; public class PluginDiscoveryServiceTest { + private static DataOneTestHelper dataOneTestHelper; + private static Properties dataOneProperties; + + @BeforeClass + public static void before() throws Exception { + dataOneTestHelper = new DataOneTestHelper(); + dataOneProperties = dataOneTestHelper.getTestProperties(); + } + @Test - public void testInstanceEventService() { + public void testInstanceEventService() throws Exception { + IRODSAccessObjectFactory aof = Mockito + .mock(IRODSAccessObjectFactory.class); PublicationContext publicationContext = new PublicationContext(); RestConfiguration restConfiguration = new RestConfiguration(); - // restConfiguration.setPluginJarLocation(pluginJarLocation); + restConfiguration.setPluginJarLocation(dataOneTestHelper + .getPluginJarLocation(dataOneProperties)); + publicationContext.setRestConfiguration(restConfiguration); + publicationContext.setIrodsAccessObjectFactory(aof); PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); - // EventServiceAO eventServiceAO = + pluginDiscoveryService.setPublicationContext(publicationContext); + + EventServiceAO eventServiceAO = pluginDiscoveryService + .instanceEventService(); + Assert.assertNotNull("no eventServiceAO", eventServiceAO); } } diff --git a/dataone-node/src/test/resources/test-irods-rest.properties b/dataone-node/src/test/resources/test-dataone.properties similarity index 57% rename from dataone-node/src/test/resources/test-irods-rest.properties rename to dataone-node/src/test/resources/test-dataone.properties index 0770ea2..c887c4e 100644 --- a/dataone-node/src/test/resources/test-irods-rest.properties +++ b/dataone-node/src/test/resources/test-dataone.properties @@ -1,7 +1,7 @@ irods.user=test1 irods.password=test irods.resource=test1-resc - irods.host=irods419.irodslocal + irods.host=irods420.irodslocal irods.port=1247 irods.zone=zone1 - plugin.jar.location=/home/mconway/temp/dataonejar \ No newline at end of file + plugin.jar.location=${test.plugin.jar.location} \ No newline at end of file diff --git a/dataone-utils/pom.xml b/dataone-utils/pom.xml index 7fa05ec..6407db4 100644 --- a/dataone-utils/pom.xml +++ b/dataone-utils/pom.xml @@ -31,10 +31,6 @@ log4j log4j - - org.slf4j - slf4j-log4j12 - org.mockito mockito-all diff --git a/pom.xml b/pom.xml index e8f6964..7f11694 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,12 @@ d1_libclient_java 2.3.0 jar + + + org.slf4j + log4j-over-slf4j + + org.xeustechnologies From 4e97da1af7d871d656bc1f908a304c4fcf2221ec Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 1 Mar 2017 12:39:43 -0500 Subject: [PATCH 29/88] #3 discovery works --- dataone-node/pom.xml | 4 ++-- .../main/java/org/irods/jargon/dataone/utils/RestVersion.java | 2 +- .../dataone/configuration/PluginDiscoveryServiceTest.java | 1 + dataone-node/src/test/resources/test-dataone.properties | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 5b67699..0873891 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -220,7 +220,7 @@ - + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 66e24b1..8f0e084 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-03-01T16:11:41Z"; + public static String BUILD_TIME="2017-03-01T17:36:40Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java index 9da52e2..8a07e2b 100644 --- a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java +++ b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java @@ -33,6 +33,7 @@ public void testInstanceEventService() throws Exception { publicationContext.setIrodsAccessObjectFactory(aof); PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); pluginDiscoveryService.setPublicationContext(publicationContext); + pluginDiscoveryService.init(); EventServiceAO eventServiceAO = pluginDiscoveryService .instanceEventService(); diff --git a/dataone-node/src/test/resources/test-dataone.properties b/dataone-node/src/test/resources/test-dataone.properties index c887c4e..afa00d0 100644 --- a/dataone-node/src/test/resources/test-dataone.properties +++ b/dataone-node/src/test/resources/test-dataone.properties @@ -4,4 +4,4 @@ irods.user=test1 irods.host=irods420.irodslocal irods.port=1247 irods.zone=zone1 - plugin.jar.location=${test.plugin.jar.location} \ No newline at end of file + plugin.jar.location=/home/mconway/temp/dataonejar \ No newline at end of file From 2c9b32020efda4f6354f764e0a5d05091d47f93d Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 1 Mar 2017 12:44:44 -0500 Subject: [PATCH 30/88] #3 added test of plugin event --- dataone-node/TESTING.md | 53 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 dataone-node/TESTING.md diff --git a/dataone-node/TESTING.md b/dataone-node/TESTING.md new file mode 100644 index 0000000..d6508d6 --- /dev/null +++ b/dataone-node/TESTING.md @@ -0,0 +1,53 @@ +# Testing setup notes + +### maven profile + +add the following to your maven settings.xml profile in your home/.m2 directory + +```xml + + + dataone + + /home/mconway/temp/dataonejar + + + + + +``` + +That .jar directory will be the place to put the .jar files for your pid and event service plugins. These are discovered by the PluginDiscoveryService. + +### build and place your plugin jars in the test plugin jar location + +Dummy plugins are being built, including the dummy-event-service-impl included in this repo. These dummy jar files can be copied out of the target directory of the dummy subproject +in order to run the unit and integration tests that depend on successful lookup + +### sample unit test + +Check out the PluginDiscoveryServiceTest unit test for examples of testing the loading of a plugin, as in this simple case: + +```java + +@Test + public void testInstanceEventService() throws Exception { + IRODSAccessObjectFactory aof = Mockito + .mock(IRODSAccessObjectFactory.class); + PublicationContext publicationContext = new PublicationContext(); + RestConfiguration restConfiguration = new RestConfiguration(); + restConfiguration.setPluginJarLocation(dataOneTestHelper + .getPluginJarLocation(dataOneProperties)); + publicationContext.setRestConfiguration(restConfiguration); + publicationContext.setIrodsAccessObjectFactory(aof); + PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); + pluginDiscoveryService.setPublicationContext(publicationContext); + pluginDiscoveryService.init(); + + EventServiceAO eventServiceAO = pluginDiscoveryService + .instanceEventService(); + Assert.assertNotNull("no eventServiceAO", eventServiceAO); + } + + +``` \ No newline at end of file From 3b44bfd21d8c8b212282f794c056353746ed7ad2 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 10 Mar 2017 09:26:51 -0500 Subject: [PATCH 31/88] #3 discovery of pid plugin --- .../configuration/PluginDiscoveryService.java | 18 ++++++ .../jargon/dataone/utils/RestVersion.java | 2 +- .../PluginDiscoveryServiceTest.java | 20 +++++++ dummy-pid-service-impl/pom.xml | 53 ++++++++++++++++ .../src/main/java/.gitinclude | 0 .../impl/dummy/DummyPidServiceAOImpl.java | 60 +++++++++++++++++++ .../pidservice/impl/dummy/package-info.java | 8 +++ .../src/main/resources/.gitinclude | 0 .../src/test/java/.gitinclude | 0 .../src/test/resources/.gitinclude | 0 pom.xml | 1 + 11 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 dummy-pid-service-impl/pom.xml create mode 100644 dummy-pid-service-impl/src/main/java/.gitinclude create mode 100644 dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java create mode 100644 dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/package-info.java create mode 100644 dummy-pid-service-impl/src/main/resources/.gitinclude create mode 100644 dummy-pid-service-impl/src/test/java/.gitinclude create mode 100644 dummy-pid-service-impl/src/test/resources/.gitinclude diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java index 5467979..4e2705d 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java @@ -15,6 +15,8 @@ import org.irods.jargon.dataone.events.AbstractEventServiceAO; import org.irods.jargon.dataone.events.EventServiceAO; +import org.irods.jargon.pid.pidservice.AbstractUniqueIdAO; +import org.irods.jargon.pid.pidservice.UniqueIdAO; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; import org.reflections.scanners.TypeAnnotationsScanner; @@ -64,6 +66,22 @@ public EventServiceAO instanceEventService() throws PluginNotFoundException { } } + public UniqueIdAO instanceUniqueIdService() throws PluginNotFoundException { + log.info("instancePidService()"); + Class clazz = loadImplClass(AbstractUniqueIdAO.class); + try { + Constructor ctor = clazz + .getConstructor(PublicationContext.class); + return (UniqueIdAO) ctor + .newInstance(new Object[] { publicationContext }); + } catch (NoSuchMethodException | SecurityException + | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + log.error("cannot find appropriate plugin", e); + throw new PluginNotFoundException(e); + } + } + @SuppressWarnings("unchecked") private final Class loadImplClass(Class clazz) throws PluginNotFoundException { diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 8f0e084..04f98ab 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-03-01T17:36:40Z"; + public static String BUILD_TIME="2017-03-10T14:17:51Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java index 8a07e2b..6d2ef1f 100644 --- a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java +++ b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java @@ -5,6 +5,7 @@ import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.dataone.events.EventServiceAO; import org.irods.jargon.dataone.utils.DataOneTestHelper; +import org.irods.jargon.pid.pidservice.UniqueIdAO; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -39,4 +40,23 @@ public void testInstanceEventService() throws Exception { .instanceEventService(); Assert.assertNotNull("no eventServiceAO", eventServiceAO); } + + @Test + public void testInstanceUniqueIdService() throws Exception { + IRODSAccessObjectFactory aof = Mockito + .mock(IRODSAccessObjectFactory.class); + PublicationContext publicationContext = new PublicationContext(); + RestConfiguration restConfiguration = new RestConfiguration(); + restConfiguration.setPluginJarLocation(dataOneTestHelper + .getPluginJarLocation(dataOneProperties)); + publicationContext.setRestConfiguration(restConfiguration); + publicationContext.setIrodsAccessObjectFactory(aof); + PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); + pluginDiscoveryService.setPublicationContext(publicationContext); + pluginDiscoveryService.init(); + + UniqueIdAO uniqueIdAO = pluginDiscoveryService + .instanceUniqueIdService(); + Assert.assertNotNull("no uniqueIdAO", uniqueIdAO); + } } diff --git a/dummy-pid-service-impl/pom.xml b/dummy-pid-service-impl/pom.xml new file mode 100644 index 0000000..9c05238 --- /dev/null +++ b/dummy-pid-service-impl/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + dummy-pid-service-impl + + org.irods + dfc-dataone + 4.2.1.0-SNAPSHOT + + jar + Pid service dummy implementation for testing purposes + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + org.irods + pid-service-api + ${project.version} + + + org.irods + dataone-utils + ${project.version} + + + diff --git a/dummy-pid-service-impl/src/main/java/.gitinclude b/dummy-pid-service-impl/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java new file mode 100644 index 0000000..b87cee5 --- /dev/null +++ b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java @@ -0,0 +1,60 @@ +package org.irods.jargon.dataone.pidservice.impl.dummy; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.core.pub.domain.DataObject; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.pid.pidservice.AbstractUniqueIdAO; +import org.irods.jargon.pid.pidservice.DataObjectListResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DummyPidServiceAOImpl extends AbstractUniqueIdAO { + + public static final Logger log = LoggerFactory + .getLogger(DummyPidServiceAOImpl.class); + + public DummyPidServiceAOImpl(PublicationContext publicationContext) { + super(publicationContext); + } + + @Override + public Identifier getIdentifierFromDataObject(DataObject dataObject) + throws JargonException { + Identifier id = new Identifier(); + id.setValue(new String("http://handle/dummy/" + + String.valueOf(System.currentTimeMillis()))); + return id; + } + + @Override + public DataObject getDataObjectFromIdentifier(Identifier identifier) + throws JargonException { + return new DataObject(); + } + + @Override + public List getListOfDataoneExposedIdentifiers() + throws JargonException { + List ids = new ArrayList(); + Identifier id = new Identifier(); + id.setValue(new String("http://handle/dummy/" + + String.valueOf(System.currentTimeMillis()))); + ids.add(id); + return ids; + } + + @Override + public DataObjectListResponse getListOfDataoneExposedDataObjects( + Date fromDate, Date toDate, ObjectFormatIdentifier formatId, + Boolean replicaStatus, Integer start, Integer count) + throws JargonException { + return new DataObjectListResponse(); + } + +} diff --git a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/package-info.java b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/package-info.java new file mode 100644 index 0000000..20b876f --- /dev/null +++ b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/package-info.java @@ -0,0 +1,8 @@ +/** + * + */ +/** + * @author mconway + * Dummy implementation of a pid service + */ +package org.irods.jargon.dataone.pidservice.impl.dummy; \ No newline at end of file diff --git a/dummy-pid-service-impl/src/main/resources/.gitinclude b/dummy-pid-service-impl/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/dummy-pid-service-impl/src/test/java/.gitinclude b/dummy-pid-service-impl/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/dummy-pid-service-impl/src/test/resources/.gitinclude b/dummy-pid-service-impl/src/test/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml index 7f11694..b3fa09c 100644 --- a/pom.xml +++ b/pom.xml @@ -109,5 +109,6 @@ pid-service-handle-impl dataone-utils dummy-event-service-impl + dummy-pid-service-impl From e7663f59d74cf828370882194c2333fc049f4411 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 10 Mar 2017 10:08:44 -0500 Subject: [PATCH 32/88] #3 add repo service api --- .../jargon/dataone/utils/RestVersion.java | 2 +- pom.xml | 1 + repo-service-api/pom.xml | 54 +++++++++++++++++++ repo-service-api/src/main/java/.gitinclude | 0 .../src/main/resources/.gitinclude | 0 repo-service-api/src/test/java/.gitinclude | 0 .../src/test/resources/.gitinclude | 0 7 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 repo-service-api/pom.xml create mode 100644 repo-service-api/src/main/java/.gitinclude create mode 100644 repo-service-api/src/main/resources/.gitinclude create mode 100644 repo-service-api/src/test/java/.gitinclude create mode 100644 repo-service-api/src/test/resources/.gitinclude diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 04f98ab..df1d5b0 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-03-10T14:17:51Z"; + public static String BUILD_TIME="2017-03-10T15:08:18Z"; } diff --git a/pom.xml b/pom.xml index b3fa09c..a2ab082 100644 --- a/pom.xml +++ b/pom.xml @@ -106,6 +106,7 @@ dataone-node pid-service-api event-service-api + repo-service-api pid-service-handle-impl dataone-utils dummy-event-service-impl diff --git a/repo-service-api/pom.xml b/repo-service-api/pom.xml new file mode 100644 index 0000000..386291b --- /dev/null +++ b/repo-service-api/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + repo-service-api + + org.irods + dfc-dataone + 4.2.1.0-SNAPSHOT + + jar + Repository service API + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + org.dataone + d1_libclient_java + + + org.irods + dataone-utils + ${project.version} + + + + + diff --git a/repo-service-api/src/main/java/.gitinclude b/repo-service-api/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/repo-service-api/src/main/resources/.gitinclude b/repo-service-api/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/repo-service-api/src/test/java/.gitinclude b/repo-service-api/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/repo-service-api/src/test/resources/.gitinclude b/repo-service-api/src/test/resources/.gitinclude new file mode 100644 index 0000000..e69de29 From 5d2012a40b53950bced3a06fb58140be9647a144 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 20 Mar 2017 12:07:15 -0400 Subject: [PATCH 33/88] #1 align version and clean build --- dataone-node/pom.xml | 15 +-- .../jargon/dataone/utils/RestVersion.java | 4 +- dataone-utils/pom.xml | 2 +- .../utils/DataObjectMetadataUtils.java | 32 +++-- .../jargon/dataone/utils/DataTypeUtils.java | 63 +++++----- event-service-api/pom.xml | 2 +- pid-service-api/pom.xml | 2 +- pid-service-handle-impl/pom.xml | 2 +- .../UniqueIdAOHandleInMetadataImpl.java | 113 ++++++------------ pom.xml | 2 +- 10 files changed, 89 insertions(+), 148 deletions(-) diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 0f0a90d..db7e0a2 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -6,7 +6,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT war DataOne node @@ -25,19 +25,11 @@ org.jboss.resteasy resteasy-jaxrs - - org.jboss.resteasy - resteasy-jaxb-provider - org.jboss.resteasy resteasy-jackson-provider - - org.jboss.resteasy - resteasy-crypto - - + org.jboss.resteasy tjws test @@ -52,8 +44,7 @@ javax.servlet - servlet-api - provided + javax.servlet-api org.springframework diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 7a18a0a..590aaf3 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { - public static String VERSION="4.1.10.0-SNAPSHOT"; - public static String BUILD_TIME="2017-02-08T16:14:12Z"; + public static String VERSION="4.2.1.0-SNAPSHOT"; + public static String BUILD_TIME="2017-03-20T16:01:48Z"; } diff --git a/dataone-utils/pom.xml b/dataone-utils/pom.xml index 068cefa..03a6c5a 100644 --- a/dataone-utils/pom.xml +++ b/dataone-utils/pom.xml @@ -6,7 +6,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT jar DataONE utilities diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java index a40fa1e..b0f12c0 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java @@ -10,34 +10,30 @@ import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.AVUQueryElement; -import org.irods.jargon.core.query.AVUQueryOperatorEnum; import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.core.query.MetaDataAndDomainData; +import org.irods.jargon.core.query.QueryConditionOperators; public class DataObjectMetadataUtils { - - static public Date getStartDateTime( - IRODSAccessObjectFactory irodsAccessObjectFactory, - IRODSAccount irodsAccount, - DataObject dObject) - throws JargonQueryException, JargonException { - - long epoch=0; + + static public Date getStartDateTime(IRODSAccessObjectFactory irodsAccessObjectFactory, IRODSAccount irodsAccount, + DataObject dObject) throws JargonQueryException, JargonException { + + long epoch = 0; AVUQueryElement avuQuery = null; List avuQueryList = new ArrayList(); List metadataAndDomainDataList = new ArrayList(); String dateAttr = "StartDateTime"; - - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, + + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, dateAttr); avuQueryList.add(avuQuery); - + DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - - metadataAndDomainDataList = dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, dObject.getAbsolutePath()); + + metadataAndDomainDataList = dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, + dObject.getAbsolutePath()); String value = null; for (MetaDataAndDomainData data : metadataAndDomainDataList) { value = data.getAvuValue(); @@ -46,8 +42,8 @@ static public Date getStartDateTime( } epoch = Long.parseLong(value); // need to convert it 2 milliseconds for Java date - Date theDate = new Date(epoch*1000); - + Date theDate = new Date(epoch * 1000); + return theDate; } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java index 4f8a5b0..b39e6e5 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java @@ -18,79 +18,70 @@ import org.irods.jargon.core.pub.io.IRODSFile; import org.irods.jargon.core.pub.io.IRODSFileInputStream; import org.irods.jargon.core.query.AVUQueryElement; -import org.irods.jargon.core.query.AVUQueryOperatorEnum; +import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.core.query.MetaDataAndDomainData; -import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; +import org.irods.jargon.core.query.QueryConditionOperators; public class DataTypeUtils { - + public static String getDataObjectMimeType(IRODSAccount irodsAccount, - IRODSAccessObjectFactory irodsAccessObjectFactory, - DataObject dataObject) + IRODSAccessObjectFactory irodsAccessObjectFactory, DataObject dataObject) throws FileNotFoundException, JargonException { String mimeType = null; String filename = dataObject.getAbsolutePath(); - + DefaultDetector typeDetector = new DefaultDetector(); - IRODSFile irodsFile = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount) - .instanceIRODSFile(filename); - IRODSFileInputStream irodsStream = irodsAccessObjectFactory - .getIRODSFileFactory(irodsAccount) - .instanceIRODSFileInputStream(irodsFile); + IRODSFile irodsFile = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount).instanceIRODSFile(filename); + IRODSFileInputStream irodsStream = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount) + .instanceIRODSFileInputStream(irodsFile); InputStream stream = new BufferedInputStream(irodsStream); Metadata metadata = new Metadata(); metadata.add(Metadata.RESOURCE_NAME_KEY, filename); - + MediaType type; try { type = typeDetector.detect(stream, metadata); } catch (IOException e) { throw new FileNotFoundException("Cannot stream file in order to detect file type"); } - - // if mime type is returned as "application/x-netcdf" change to + + // if mime type is returned as "application/x-netcdf" change to // DataONE accepted name: "netCDF-4" mimeType = type.toString(); if (mimeType.equals("application/x-netcdf")) { mimeType = "netCDF-4"; } - + return mimeType; - + } - + public static String getDataObjectFormatFromMetadata(IRODSAccount irodsAccount, - IRODSAccessObjectFactory irodsAccessObjectFactory, - DataObject dataObject) - throws FileNotFoundException, JargonException, JargonQueryException { - + IRODSAccessObjectFactory irodsAccessObjectFactory, DataObject dataObject) + throws FileNotFoundException, JargonException, JargonQueryException { + String dataFormat = null; String formatAttr = "Format"; List avuQueryList = new ArrayList(); - - AVUQueryElement avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, - AVUQueryOperatorEnum.EQUAL, - formatAttr); + + AVUQueryElement avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, + QueryConditionOperators.EQUAL, formatAttr); avuQueryList.add(avuQuery); - - + DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - //List result = dataObjectAO.findMetadataValuesForDataObject(dataObject.getAbsolutePath()); - List result = - dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery( - avuQueryList, - dataObject.getAbsolutePath()); - + // List result = + // dataObjectAO.findMetadataValuesForDataObject(dataObject.getAbsolutePath()); + List result = dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, + dataObject.getAbsolutePath()); + for (MetaDataAndDomainData metadata : result) { if (metadata.getAvuAttribute().equals("Format")) { dataFormat = metadata.getAvuValue(); break; } } - + return dataFormat; } diff --git a/event-service-api/pom.xml b/event-service-api/pom.xml index f3b6761..ee4dcc4 100644 --- a/event-service-api/pom.xml +++ b/event-service-api/pom.xml @@ -6,7 +6,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT jar Event service API diff --git a/pid-service-api/pom.xml b/pid-service-api/pom.xml index b52911e..204ff00 100644 --- a/pid-service-api/pom.xml +++ b/pid-service-api/pom.xml @@ -6,7 +6,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT jar PID service API diff --git a/pid-service-handle-impl/pom.xml b/pid-service-handle-impl/pom.xml index f6dc28f..0725b69 100644 --- a/pid-service-handle-impl/pom.xml +++ b/pid-service-handle-impl/pom.xml @@ -8,7 +8,7 @@ org.irods dfc-dataone - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT jar diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java index 2515af6..5b82a78 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java @@ -16,33 +16,25 @@ import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.AVUQueryElement; import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; -import org.irods.jargon.core.query.AVUQueryOperatorEnum; import org.irods.jargon.core.query.JargonQueryException; +import org.irods.jargon.core.query.QueryConditionOperators; import org.irods.jargon.core.service.AbstractJargonService; import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.irods.jargon.pid.pidservice.UniqueIdAO; -//import org.irods.jargon.dataprofile.DataProfile; -//import org.irods.jargon.dataprofile.DataProfileService; -//import org.irods.jargon.dataprofile.DataProfileServiceImpl; -//import org.irods.jargon.dataprofile.DataTypeResolutionService; -//import org.irods.jargon.dataprofile.DataTypeResolutionServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class UniqueIdAOHandleInMetadataImpl extends AbstractJargonService - implements UniqueIdAO { +public class UniqueIdAOHandleInMetadataImpl extends AbstractJargonService implements UniqueIdAO { private Properties properties; private String propertiesFilename = "d1client.properties"; private Logger log = LoggerFactory.getLogger(this.getClass()); @Override - public DataObject getDataObjectFromIdentifier(Identifier identifier) - throws JargonException, FileNotFoundException { + public DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException, FileNotFoundException { DataObject dataObject = null; - log.info("retrieving irods data object id from identifier: {}", - identifier.getValue()); + log.info("retrieving irods data object id from identifier: {}", identifier.getValue()); long dataObjectId = getDataObjectIdFromDataOneIdentifier(identifier); log.info("got id: {}", dataObjectId); @@ -55,12 +47,10 @@ public DataObject getDataObjectFromIdentifier(Identifier identifier) try { - DataObjectAO dataObjectAO = irodsAccessObjectFactory - .getDataObjectAO(irodsAccount); + DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); log.info("got dataObjectAO: {}", dataObjectAO.toString()); // Find iRODS object here from Identifier - dataObject = dataObjectAO.findById(new Long(dataObjectId) - .intValue()); + dataObject = dataObjectAO.findById(new Long(dataObjectId).intValue()); if (dataObject != null) { log.info("found iRODS file: {}", dataObject.getAbsolutePath()); } else { @@ -78,8 +68,7 @@ public DataObject getDataObjectFromIdentifier(Identifier identifier) } @Override - public Identifier getIdentifierFromDataObject(DataObject dataObject) - throws JargonException { + public Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException { if (dataObject == null) { log.error("getIdentifierFromDataObject: dataObject is null"); @@ -100,39 +89,32 @@ public Identifier getIdentifierFromDataObject(DataObject dataObject) } @Override - public List getListOfDataoneExposedIdentifiers() - throws JargonException { + public List getListOfDataoneExposedIdentifiers() throws JargonException { AVUQueryElement avuQuery1 = null; AVUQueryElement avuQuery2 = null; - String handleAttr = properties - .getProperty("irods.dataone.publish_entity_metadata_attr"); - String handleValue = properties - .getProperty("irods.dataone.publish_entity_metadata_value"); + String handleAttr = properties.getProperty("irods.dataone.publish_entity_metadata_attr"); + String handleValue = properties.getProperty("irods.dataone.publish_entity_metadata_value"); List identifiers = new ArrayList(); try { - avuQuery1 = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + avuQuery1 = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, handleAttr); - avuQuery2 = AVUQueryElement - .instanceForValueQuery(AVUQueryPart.VALUE, - AVUQueryOperatorEnum.EQUAL, handleValue); + avuQuery2 = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, + handleValue); } catch (JargonQueryException e) { log.error("getListOfDataoneExposedIdentifiers: failed to create AVU query elements"); return identifiers; } - DataObjectAO dataObjectAO = irodsAccessObjectFactory - .getDataObjectAO(irodsAccount); + DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); List dataObjects = new ArrayList(); try { - dataObjects = dataObjectAO.findDomainByMetadataQuery(Arrays.asList( - avuQuery1, avuQuery2)); + dataObjects = dataObjectAO.findDomainByMetadataQuery(Arrays.asList(avuQuery1, avuQuery2)); } catch (JargonQueryException e) { log.error("getListOfDataoneExposedIdentifiers: failed to execute AVU query"); return identifiers; @@ -151,25 +133,21 @@ public List getListOfDataoneExposedIdentifiers() } @Override - public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, Date toDate, ObjectFormatIdentifier formatId, - Boolean replicaStatus, Integer start, Integer count) + public DataObjectListResponse getListOfDataoneExposedDataObjects(Date fromDate, Date toDate, + ObjectFormatIdentifier formatId, Boolean replicaStatus, Integer start, Integer count) throws JargonException { int total = 0; DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); - List avuQueryList = createAVUQueryElementList( - fromDate, toDate, formatId); + List avuQueryList = createAVUQueryElementList(fromDate, toDate, formatId); - DataObjectAO dataObjectAO = irodsAccessObjectFactory - .getDataObjectAO(irodsAccount); + DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); List dataObjects = new ArrayList(); try { - dataObjects = dataObjectAO.findDomainByMetadataQuery(avuQueryList, - start); + dataObjects = dataObjectAO.findDomainByMetadataQuery(avuQueryList, start); // save original size of set returned total = dataObjects.size(); } catch (JargonQueryException e) { @@ -203,9 +181,7 @@ public long getDataObjectIdFromDataOneIdentifier(Identifier pid) { dataObjectId = -1; } - log.info( - "getDataObjectIdFromDataOneIdentifier: returning data object id: {}", - dataObjectId); + log.info("getDataObjectIdFromDataOneIdentifier: returning data object id: {}", dataObjectId); return dataObjectId; } @@ -220,15 +196,13 @@ public String getHandlePrefix() throws JargonException { private void loadProperties() { this.properties = new Properties(); InputStream input = null; - input = getClass().getClassLoader().getResourceAsStream( - this.propertiesFilename); + input = getClass().getClassLoader().getResourceAsStream(this.propertiesFilename); // load a properties file try { this.properties.load(input); } catch (IOException e) { - log.error("Cannot load Member Node properties file: {}", - this.propertiesFilename); + log.error("Cannot load Member Node properties file: {}", this.propertiesFilename); log.error("IOException: {}", e.getStackTrace()); this.properties = new Properties(); } finally { @@ -242,29 +216,25 @@ private void loadProperties() { } } - private List createAVUQueryElementList(Date fromDate, - Date toDate, ObjectFormatIdentifier formatId) { + private List createAVUQueryElementList(Date fromDate, Date toDate, + ObjectFormatIdentifier formatId) { // TODO: probably should move these to properties String dateAttr = "StartDateTime"; String formatAttr = "Format"; List avuQueryList = new ArrayList(); - String handleAttr = properties - .getProperty("irods.dataone.publish_entity_metadata_attr"); - String handleValue = properties - .getProperty("irods.dataone.publish_entity_metadata_value"); + String handleAttr = properties.getProperty("irods.dataone.publish_entity_metadata_attr"); + String handleValue = properties.getProperty("irods.dataone.publish_entity_metadata_value"); AVUQueryElement avuQuery; try { // DataOne exposed query - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, handleAttr); avuQueryList.add(avuQuery); - avuQuery = AVUQueryElement - .instanceForValueQuery(AVUQueryPart.VALUE, - AVUQueryOperatorEnum.EQUAL, handleValue); + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, + handleValue); avuQueryList.add(avuQuery); // handle any date queries @@ -275,32 +245,27 @@ private List createAVUQueryElementList(Date fromDate, // GMT : 1459123201 long newFromDate; if (fromDate != null) { - newFromDate = java.lang.Math.max(fromDate.getTime() / 1000, - Long.parseLong("1459123201")); + newFromDate = java.lang.Math.max(fromDate.getTime() / 1000, Long.parseLong("1459123201")); } else { newFromDate = Long.parseLong("1459123201"); } // fromDate query - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, dateAttr); avuQueryList.add(avuQuery); - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, AVUQueryOperatorEnum.GREATER_OR_EQUAL, - Long.toString(newFromDate)); + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, + QueryConditionOperators.GREATER_THAN_OR_EQUAL_TO, Long.toString(newFromDate)); avuQueryList.add(avuQuery); // toDate query if ((toDate != null) && ((toDate.getTime() / 1000) >= newFromDate)) { - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, dateAttr); avuQueryList.add(avuQuery); - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, AVUQueryOperatorEnum.LESS_THAN, + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.LESS_THAN, Long.toString(toDate.getTime() / 1000)); avuQueryList.add(avuQuery); @@ -337,13 +302,11 @@ private List createAVUQueryElementList(Date fromDate, // handle data format query if ((formatId != null) && (formatId.getValue() != null)) { - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.ATTRIBUTE, AVUQueryOperatorEnum.EQUAL, + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, formatAttr); avuQueryList.add(avuQuery); - avuQuery = AVUQueryElement.instanceForValueQuery( - AVUQueryPart.VALUE, AVUQueryOperatorEnum.EQUAL, + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, formatId.getValue()); avuQueryList.add(avuQuery); diff --git a/pom.xml b/pom.xml index 5beca86..05a18de 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.irods jargon-pom - 4.1.10.0-SNAPSHOT + 4.2.1.0-SNAPSHOT pom dfc-dataone From 4d9110cf3a7e16495db8cb47ed7bd4ab55c39040 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 20 Mar 2017 12:32:46 -0400 Subject: [PATCH 34/88] #1 cleanup after merge --- .../main/java/org/irods/jargon/dataone/utils/RestVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 86f3584..9f87961 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-03-20T16:17:38Z"; + public static String BUILD_TIME="2017-03-20T16:28:46Z"; } From e62fc1cc438d1c176f0cef8a76bbd905d42d375d Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 20 Mar 2017 14:05:38 -0400 Subject: [PATCH 35/88] #1 adding repo service and continue to refactor, currently breaks build --- dataone-node/pom.xml | 5 + .../jargon/dataone/tier1/MNReadImpl.java | 2 +- .../jargon/dataone/utils/RestVersion.java | 2 +- dataone-utils/pom.xml | 6 +- .../impl/dummy/DummyPidServiceAOImpl.java | 37 +-- pid-service-api/pom.xml | 4 - .../pid/pidservice/AbstractUniqueIdAO.java | 39 +-- .../jargon/pid/pidservice/UniqueIdAO.java | 58 +--- .../id/handle/UniqueIdAOHandleImpl.java | 2 +- .../UniqueIdAOHandleInMetadataImpl.java | 216 +-------------- pom.xml | 1 + .../reposervice/AbstractDataOneRepoAO.java | 54 ++++ .../reposervice}/DataObjectListResponse.java | 2 +- .../dataone/reposervice/DataOneRepoAO.java | 38 +++ .../dataone/reposervice/package-info.java | 10 + repo-service-handle-impl/pom.xml | 60 ++++ .../src/main/java/.gitinclude | 0 .../handle/HandleRepoServiceAOImpl.java | 262 ++++++++++++++++++ .../reposervice/handle/package-info.java | 10 + .../src/main/lib/cnriutil.jar | Bin 0 -> 68965 bytes .../src/main/lib/handle.jar | Bin 0 -> 844979 bytes .../src/main/resources/.gitinclude | 0 .../src/test/java/.gitinclude | 0 .../src/test/resources/.gitinclude | 0 24 files changed, 475 insertions(+), 333 deletions(-) create mode 100644 repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java rename {pid-service-api/src/main/java/org/irods/jargon/pid/pidservice => repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice}/DataObjectListResponse.java (92%) create mode 100644 repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoAO.java create mode 100644 repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/package-info.java create mode 100644 repo-service-handle-impl/pom.xml create mode 100644 repo-service-handle-impl/src/main/java/.gitinclude create mode 100644 repo-service-handle-impl/src/main/java/org/irods/jargon/dataone/reposervice/handle/HandleRepoServiceAOImpl.java create mode 100644 repo-service-handle-impl/src/main/java/org/irods/jargon/dataone/reposervice/handle/package-info.java create mode 100644 repo-service-handle-impl/src/main/lib/cnriutil.jar create mode 100644 repo-service-handle-impl/src/main/lib/handle.jar create mode 100644 repo-service-handle-impl/src/main/resources/.gitinclude create mode 100644 repo-service-handle-impl/src/test/java/.gitinclude create mode 100644 repo-service-handle-impl/src/test/resources/.gitinclude diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 88e9c5d..ef3b742 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -124,6 +124,11 @@ pid-service-api ${project.version} + + org.irods + repo-service-api + ${project.version} + org.irods event-service-api diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index 9ef7f02..c1c3faa 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -50,10 +50,10 @@ import org.irods.jargon.dataone.auth.RestAuthUtils; import org.irods.jargon.dataone.configuration.RestConfiguration; import org.irods.jargon.dataone.domain.MNPermissionEnum; +import org.irods.jargon.dataone.reposervice.DataObjectListResponse; import org.irods.jargon.dataone.utils.DataObjectMetadataUtils; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.dataone.utils.PropertiesLoader; -import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 9f87961..bdb2676 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-03-20T16:28:46Z"; + public static String BUILD_TIME="2017-03-20T17:31:35Z"; } diff --git a/dataone-utils/pom.xml b/dataone-utils/pom.xml index 6407db4..bcbd98a 100644 --- a/dataone-utils/pom.xml +++ b/dataone-utils/pom.xml @@ -66,13 +66,11 @@ org.xeustechnologies jcl-core - 2.7 - + org.reflections reflections - 0.9.10 - + diff --git a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java index b87cee5..c8be939 100644 --- a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java +++ b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java @@ -1,60 +1,31 @@ package org.irods.jargon.dataone.pidservice.impl.dummy; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.pid.pidservice.AbstractUniqueIdAO; -import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DummyPidServiceAOImpl extends AbstractUniqueIdAO { - public static final Logger log = LoggerFactory - .getLogger(DummyPidServiceAOImpl.class); + public static final Logger log = LoggerFactory.getLogger(DummyPidServiceAOImpl.class); public DummyPidServiceAOImpl(PublicationContext publicationContext) { super(publicationContext); } @Override - public Identifier getIdentifierFromDataObject(DataObject dataObject) - throws JargonException { + public Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException { Identifier id = new Identifier(); - id.setValue(new String("http://handle/dummy/" - + String.valueOf(System.currentTimeMillis()))); + id.setValue(new String("http://handle/dummy/" + String.valueOf(System.currentTimeMillis()))); return id; } @Override - public DataObject getDataObjectFromIdentifier(Identifier identifier) - throws JargonException { + public DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException { return new DataObject(); } - @Override - public List getListOfDataoneExposedIdentifiers() - throws JargonException { - List ids = new ArrayList(); - Identifier id = new Identifier(); - id.setValue(new String("http://handle/dummy/" - + String.valueOf(System.currentTimeMillis()))); - ids.add(id); - return ids; - } - - @Override - public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, Date toDate, ObjectFormatIdentifier formatId, - Boolean replicaStatus, Integer start, Integer count) - throws JargonException { - return new DataObjectListResponse(); - } - } diff --git a/pid-service-api/pom.xml b/pid-service-api/pom.xml index b915c30..fa6bfd0 100644 --- a/pid-service-api/pom.xml +++ b/pid-service-api/pom.xml @@ -43,10 +43,6 @@ org.dataone d1_libclient_java - - org.mockito - mockito-all - org.irods dataone-utils diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java index 8b04e18..c82c856 100644 --- a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java @@ -3,11 +3,7 @@ */ package org.irods.jargon.pid.pidservice; -import java.util.Date; -import java.util.List; - import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.dataone.configuration.PublicationContext; @@ -20,8 +16,7 @@ * @author mconway * */ -public abstract class AbstractUniqueIdAO extends AbstractDataOnePlugin - implements UniqueIdAO { +public abstract class AbstractUniqueIdAO extends AbstractDataOnePlugin implements UniqueIdAO { /** * Default constructor takes a context object with a handle to connection @@ -41,8 +36,7 @@ public AbstractUniqueIdAO(PublicationContext publicationContext) { * (org.irods.jargon.core.pub.domain.DataObject) */ @Override - public abstract Identifier getIdentifierFromDataObject(DataObject dataObject) - throws JargonException; + public abstract Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException; /* * (non-Javadoc) @@ -52,33 +46,6 @@ public abstract Identifier getIdentifierFromDataObject(DataObject dataObject) * (org.dataone.service.types.v1.Identifier) */ @Override - public abstract DataObject getDataObjectFromIdentifier(Identifier identifier) - throws JargonException; - - /* - * (non-Javadoc) - * - * @see - * org.irods.jargon.pid.pidservice.UniqueIdAO#getListOfDataoneExposedIdentifiers - * () - */ - @Override - public abstract List getListOfDataoneExposedIdentifiers() - throws JargonException; - - /* - * (non-Javadoc) - * - * @see - * org.irods.jargon.pid.pidservice.UniqueIdAO#getListOfDataoneExposedDataObjects - * (java.util.Date, java.util.Date, - * org.dataone.service.types.v1.ObjectFormatIdentifier, java.lang.Boolean, - * java.lang.Integer, java.lang.Integer) - */ - @Override - public abstract DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, Date toDate, ObjectFormatIdentifier formatId, - Boolean replicaStatus, Integer start, Integer count) - throws JargonException; + public abstract DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException; } diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java index 72740ca..33877b6 100644 --- a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java @@ -1,34 +1,28 @@ package org.irods.jargon.pid.pidservice; -import java.util.Date; -import java.util.List; - import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; // Access object for unique identifiers that are associated with iRODS Data Objects public interface UniqueIdAO { - - //These methods are intended for future support of DataONE MN tiers > 1 - //public Identifier createNewIdentifier(); - //public Identifier createNewIdentifier(String identifier); - //public void deleteIdentifier(String identifier); - + + // These methods are intended for future support of DataONE MN tiers > 1 + // public Identifier createNewIdentifier(); + // public Identifier createNewIdentifier(String identifier); + // public void deleteIdentifier(String identifier); + /** * Returns a DataONE Identifier object for the iRODS Data Object specified * * @param dataObject - * DataObject of iRODS Data Object - * associated with the identifier to be returned. + * DataObject of iRODS Data Object associated with + * the identifier to be returned. * @throws JargonException */ - public Identifier getIdentifierFromDataObject(DataObject dataObject) - throws JargonException; - - + public Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException; + /** * Returns an iRODS Data Object for the DataONE Identifier object specified * @@ -37,36 +31,6 @@ public Identifier getIdentifierFromDataObject(DataObject dataObject) * to be returned. * @throws JargonException */ - public DataObject getDataObjectFromIdentifier(Identifier identifier) - throws JargonException; - - - - /** - * Returns a complete list of Unique Identifiers that are associated with - * iRODS objects that are exposed to DataONE - * - * @return List<Identifier> - * @throws JargonException - */ - public List getListOfDataoneExposedIdentifiers() - throws JargonException; - - - - /** - * Returns an iRODS Data Object for the DataONE Identifier object specified - * - * @return List<DataObject> - * @throws JargonException - */ - public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, - Date toDate, - ObjectFormatIdentifier formatId, - Boolean replicaStatus, - Integer start, - Integer count - ) throws JargonException; + public DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException; } diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java index ac92fac..ebbd1e3 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java @@ -16,8 +16,8 @@ import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.core.service.AbstractJargonService; +import org.irods.jargon.dataone.reposervice.DataObjectListResponse; import org.irods.jargon.dataone.utils.DataTypeUtils; -import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.irods.jargon.pid.pidservice.UniqueIdAO; //import org.irods.jargon.dataprofile.DataProfile; //import org.irods.jargon.dataprofile.DataProfileService; diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java index 54f970f..5e6e798 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java @@ -2,29 +2,24 @@ import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; import java.util.Properties; import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.DataObjectAO; import org.irods.jargon.core.pub.domain.DataObject; -import org.irods.jargon.core.query.AVUQueryElement; -import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; -import org.irods.jargon.core.query.JargonQueryException; -import org.irods.jargon.core.query.QueryConditionOperators; -import org.irods.jargon.core.service.AbstractJargonService; -import org.irods.jargon.pid.pidservice.DataObjectListResponse; -import org.irods.jargon.pid.pidservice.UniqueIdAO; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.pid.pidservice.AbstractUniqueIdAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class UniqueIdAOHandleInMetadataImpl extends AbstractJargonService implements UniqueIdAO { +public class UniqueIdAOHandleInMetadataImpl extends AbstractUniqueIdAO { + + public UniqueIdAOHandleInMetadataImpl(PublicationContext publicationContext) { + super(publicationContext); + loadProperties(); + } private Properties properties; private String propertiesFilename = "d1client.properties"; @@ -48,7 +43,8 @@ public DataObject getDataObjectFromIdentifier(final Identifier identifier) try { - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); + DataObjectAO dataObjectAO = this.getPublicationContext().getIrodsAccessObjectFactory() + .getDataObjectAO(irodsAccount); log.info("got dataObjectAO: {}", dataObjectAO.toString()); // Find iRODS object here from Identifier dataObject = dataObjectAO.findById(new Long(dataObjectId).intValue()); @@ -63,7 +59,7 @@ public DataObject getDataObjectFromIdentifier(final Identifier identifier) // log.warn("Cannot access iRODS object for id={}", dataObjectId); // throw e; } finally { - irodsAccessObjectFactory.closeSessionAndEatExceptions(); + this.getPublicationContext().getIrodsAccessObjectFactory().closeSessionAndEatExceptions(); } return dataObject; @@ -90,89 +86,6 @@ public Identifier getIdentifierFromDataObject(final DataObject dataObject) throw return identifier; } - @Override - public List getListOfDataoneExposedIdentifiers() throws JargonException { - - AVUQueryElement avuQuery1 = null; - AVUQueryElement avuQuery2 = null; - - String handleAttr = properties.getProperty("irods.dataone.publish_entity_metadata_attr"); - String handleValue = properties.getProperty("irods.dataone.publish_entity_metadata_value"); - - List identifiers = new ArrayList(); - - try { - avuQuery1 = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, - handleAttr); - - avuQuery2 = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, - - handleValue); - - } catch (JargonQueryException e) { - log.error("getListOfDataoneExposedIdentifiers: failed to create AVU query elements"); - return identifiers; - } - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - List dataObjects = new ArrayList(); - try { - dataObjects = dataObjectAO.findDomainByMetadataQuery(Arrays.asList(avuQuery1, avuQuery2)); - } catch (JargonQueryException e) { - log.error("getListOfDataoneExposedIdentifiers: failed to execute AVU query"); - return identifiers; - } - - // restrict start date for now to 2/10/16 - Date afterDate = new Date(Long.parseLong("1455062400") * 1000); - for (DataObject dataObject : dataObjects) { - if (dataObject.getCreatedAt().after(afterDate)) { - identifiers.add(getIdentifierFromDataObject(dataObject)); - } - } - - log.info("returning identifiers: {}", identifiers); - return identifiers; - } - - @Override - public DataObjectListResponse getListOfDataoneExposedDataObjects(final Date fromDate, final Date toDate, - final ObjectFormatIdentifier formatId, final Boolean replicaStatus, final Integer start, - final Integer count) throws JargonException { - - int total = 0; - - DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); - - List avuQueryList = createAVUQueryElementList(fromDate, toDate, formatId); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - List dataObjects = new ArrayList(); - - try { - dataObjects = dataObjectAO.findDomainByMetadataQuery(avuQueryList, start); - // save original size of set returned - total = dataObjects.size(); - } catch (JargonQueryException e) { - log.error("test_getListOfDataoneExposedDataObjects: failed to execute AVU query"); - return dataObjectListResponse; - } - - // truncate list if count is specified and it is less than the total - List finalDataObjects = new ArrayList(); - if ((count >= 0) && (count < total)) { - finalDataObjects = dataObjects.subList(0, count); - } else { - finalDataObjects = dataObjects; - } - - dataObjectListResponse.setTotal(total); - dataObjectListResponse.setCount(finalDataObjects.size()); - dataObjectListResponse.setDataObjects(finalDataObjects); - - return dataObjectListResponse; - } - public long getDataObjectIdFromDataOneIdentifier(final Identifier pid) { int idIdx = pid.getValue().indexOf("/") + 1; @@ -219,111 +132,4 @@ private void loadProperties() { } } - private List createAVUQueryElementList(Date fromDate, Date toDate, - ObjectFormatIdentifier formatId) { - - // TODO: probably should move these to properties - String dateAttr = "StartDateTime"; - String formatAttr = "Format"; - List avuQueryList = new ArrayList(); - String handleAttr = properties.getProperty("irods.dataone.publish_entity_metadata_attr"); - String handleValue = properties.getProperty("irods.dataone.publish_entity_metadata_value"); - - AVUQueryElement avuQuery; - try { - // DataOne exposed query - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, - handleAttr); - avuQueryList.add(avuQuery); - - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, - - handleValue); - avuQueryList.add(avuQuery); - - // handle any date queries - // restrict start date for now to 2/17/16 00:00:01 : 1455667201 - // 3-23-16 Update - now changed earliest data to 3/23/16 00:00:01 : - // 1458691201 - // 3-31-16 Update - now changed earliest data to 3/28/16 00:00:01 - // GMT : 1459123201 - long newFromDate; - if (fromDate != null) { - newFromDate = java.lang.Math.max(fromDate.getTime() / 1000, Long.parseLong("1459123201")); - } else { - newFromDate = Long.parseLong("1459123201"); - } - - // fromDate query - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, - dateAttr); - avuQueryList.add(avuQuery); - - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, - QueryConditionOperators.GREATER_THAN_OR_EQUAL_TO, Long.toString(newFromDate)); - - avuQueryList.add(avuQuery); - - // toDate query - if ((toDate != null) && ((toDate.getTime() / 1000) >= newFromDate)) { - - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, - dateAttr); - avuQueryList.add(avuQuery); - - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.LESS_THAN, - Long.toString(toDate.getTime() / 1000)); - avuQueryList.add(avuQuery); - - } - - // if ((toDate != null) && (toDate.getTime() >= newFromDate)) { - // avuQuery = AVUQueryElement.instanceForValueQuery( - // AVUQueryPart.ATTRIBUTE, - // AVUQueryOperatorEnum.EQUAL, - // dateAttr); - // avuQueryList.add(avuQuery); - // - // avuQuery = AVUQueryElement.instanceForValueQuery( - // AVUQueryPart.VALUE, - // AVUQueryOperatorEnum.BETWEEN, - // Long.toString(toDate.getTime()/1000)); - // avuQueryList.add(avuQuery); - // - // } - // else { - // avuQuery = AVUQueryElement.instanceForValueQuery( - // AVUQueryPart.ATTRIBUTE, - // AVUQueryOperatorEnum.EQUAL, - // dateAttr); - // avuQueryList.add(avuQuery); - // - // avuQuery = AVUQueryElement.instanceForValueQuery( - // AVUQueryPart.VALUE, - // AVUQueryOperatorEnum.GREATER_OR_EQUAL, - // Long.toString(newFromDate)); - // avuQueryList.add(avuQuery); - // - // } - - // handle data format query - if ((formatId != null) && (formatId.getValue() != null)) { - - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, - formatAttr); - avuQueryList.add(avuQuery); - - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, - formatId.getValue()); - avuQueryList.add(avuQuery); - - } - } catch (JargonQueryException e) { - log.error("createAVUQueryElementList: failed to construct AVU query"); - return avuQueryList; - } - - return avuQueryList; - } - } diff --git a/pom.xml b/pom.xml index a2ab082..b63d168 100644 --- a/pom.xml +++ b/pom.xml @@ -111,5 +111,6 @@ dataone-utils dummy-event-service-impl dummy-pid-service-impl + repo-service-handle-impl diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java new file mode 100644 index 0000000..e089707 --- /dev/null +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java @@ -0,0 +1,54 @@ +/** + * + */ +package org.irods.jargon.dataone.reposervice; + +import java.util.Date; +import java.util.List; + +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.plugin.AbstractDataOnePlugin; + +/** + * Abstract implementation of a dataone repo service. This service is in charge + * of coordinating data objects that are to be provided to DataONE polling + * + * @author mconway + * + */ +public abstract class AbstractDataOneRepoAO extends AbstractDataOnePlugin implements DataOneRepoAO { + + /** + * @param publicationContext + */ + public AbstractDataOneRepoAO(PublicationContext publicationContext) { + super(publicationContext); + // TODO Auto-generated constructor stub + } + + /* + * (non-Javadoc) + * + * @see org.irods.jargon.dataone.reposervice.DataOneRepoAO# + * getListOfDataoneExposedIdentifiers() + */ + @Override + public abstract List getListOfDataoneExposedIdentifiers() throws JargonException; + + /* + * (non-Javadoc) + * + * @see org.irods.jargon.dataone.reposervice.DataOneRepoAO# + * getListOfDataoneExposedDataObjects(java.util.Date, java.util.Date, + * org.dataone.service.types.v1.ObjectFormatIdentifier, java.lang.Boolean, + * java.lang.Integer, java.lang.Integer) + */ + @Override + public abstract DataObjectListResponse getListOfDataoneExposedDataObjects(Date fromDate, Date toDate, + ObjectFormatIdentifier formatId, Boolean replicaStatus, Integer start, Integer count) + throws JargonException; + +} diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataObjectListResponse.java similarity index 92% rename from pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java rename to repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataObjectListResponse.java index f075862..efb231c 100644 --- a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataObjectListResponse.java @@ -1,4 +1,4 @@ -package org.irods.jargon.pid.pidservice; +package org.irods.jargon.dataone.reposervice; import java.util.List; diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoAO.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoAO.java new file mode 100644 index 0000000..bce15be --- /dev/null +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoAO.java @@ -0,0 +1,38 @@ +package org.irods.jargon.dataone.reposervice; + +import java.util.Date; +import java.util.List; + +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.exception.JargonException; + +/** + * Abstraction of management of the DataOne repository (objects to list, + * maintenance of status of DataOne published objects) + * + * @author mconway + * + */ +public interface DataOneRepoAO { + + /** + * Returns a complete list of Unique Identifiers that are associated with + * iRODS objects that are exposed to DataONE + * + * @return List<Identifier> + * @throws JargonException + */ + public List getListOfDataoneExposedIdentifiers() throws JargonException; + + /** + * Returns an iRODS Data Object for the DataONE Identifier object specified + * + * @return List<DataObject> + * @throws JargonException + */ + public DataObjectListResponse getListOfDataoneExposedDataObjects(Date fromDate, Date toDate, + ObjectFormatIdentifier formatId, Boolean replicaStatus, Integer start, Integer count) + throws JargonException; + +} diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/package-info.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/package-info.java new file mode 100644 index 0000000..c78e517 --- /dev/null +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/package-info.java @@ -0,0 +1,10 @@ +/** + * + */ +/** + * Repository management service abstraction for dataone + * + * @author mconway + * + */ +package org.irods.jargon.dataone.reposervice; \ No newline at end of file diff --git a/repo-service-handle-impl/pom.xml b/repo-service-handle-impl/pom.xml new file mode 100644 index 0000000..8bc6d0d --- /dev/null +++ b/repo-service-handle-impl/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + repo-service-handle-impl + Handle repo server impl + + org.irods + dfc-dataone + 4.2.1.0-SNAPSHOT + + jar + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.mockito + mockito-all + + + handle + org.handle + system + 1.0.0 + ${project.basedir}/src/main/lib/handle.jar + + + org.irods + repo-service-api + ${project.version} + + + org.irods + dataone-utils + ${project.version} + + + diff --git a/repo-service-handle-impl/src/main/java/.gitinclude b/repo-service-handle-impl/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/repo-service-handle-impl/src/main/java/org/irods/jargon/dataone/reposervice/handle/HandleRepoServiceAOImpl.java b/repo-service-handle-impl/src/main/java/org/irods/jargon/dataone/reposervice/handle/HandleRepoServiceAOImpl.java new file mode 100644 index 0000000..596ab47 --- /dev/null +++ b/repo-service-handle-impl/src/main/java/org/irods/jargon/dataone/reposervice/handle/HandleRepoServiceAOImpl.java @@ -0,0 +1,262 @@ +/** + * + */ +package org.irods.jargon.dataone.reposervice.handle; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Properties; + +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.core.pub.DataObjectAO; +import org.irods.jargon.core.pub.domain.DataObject; +import org.irods.jargon.core.query.AVUQueryElement; +import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; +import org.irods.jargon.core.query.JargonQueryException; +import org.irods.jargon.core.query.QueryConditionOperators; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoAO; +import org.irods.jargon.dataone.reposervice.DataObjectListResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author mconway + * + */ +public class HandleRepoServiceAOImpl extends AbstractDataOneRepoAO { + + private Properties properties; + private String propertiesFilename = "d1client.properties"; + private Logger log = LoggerFactory.getLogger(this.getClass()); + + /** + * @param publicationContext + */ + public HandleRepoServiceAOImpl(PublicationContext publicationContext) { + super(publicationContext); + loadProperties(); + } + + @Override + public List getListOfDataoneExposedIdentifiers() throws JargonException { + + AVUQueryElement avuQuery1 = null; + AVUQueryElement avuQuery2 = null; + + String handleAttr = properties.getProperty("irods.dataone.publish_entity_metadata_attr"); + String handleValue = properties.getProperty("irods.dataone.publish_entity_metadata_value"); + + List identifiers = new ArrayList(); + + try { + avuQuery1 = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, + handleAttr); + + avuQuery2 = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, + + handleValue); + + } catch (JargonQueryException e) { + log.error("getListOfDataoneExposedIdentifiers: failed to create AVU query elements"); + return identifiers; + } + + DataObjectAO dataObjectAO = this.getPublicationContext().getIrodsAccessObjectFactory() + .getDataObjectAO(irodsAccount); + List dataObjects = new ArrayList(); + try { + dataObjects = dataObjectAO.findDomainByMetadataQuery(Arrays.asList(avuQuery1, avuQuery2)); + } catch (JargonQueryException e) { + log.error("getListOfDataoneExposedIdentifiers: failed to execute AVU query"); + return identifiers; + } + + // restrict start date for now to 2/10/16 + Date afterDate = new Date(Long.parseLong("1455062400") * 1000); + for (DataObject dataObject : dataObjects) { + if (dataObject.getCreatedAt().after(afterDate)) { + identifiers.add(getIdentifierFromDataObject(dataObject)); + } + } + + log.info("returning identifiers: {}", identifiers); + return identifiers; + } + + @Override + public DataObjectListResponse getListOfDataoneExposedDataObjects(final Date fromDate, final Date toDate, + final ObjectFormatIdentifier formatId, final Boolean replicaStatus, final Integer start, + final Integer count) throws JargonException { + + int total = 0; + + DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); + + List avuQueryList = createAVUQueryElementList(fromDate, toDate, formatId); + + DataObjectAO dataObjectAO = this.getPublicationContext().getIrodsAccessObjectFactory() + .getDataObjectAO(irodsAccount); + List dataObjects = new ArrayList(); + + try { + dataObjects = dataObjectAO.findDomainByMetadataQuery(avuQueryList, start); + // save original size of set returned + total = dataObjects.size(); + } catch (JargonQueryException e) { + log.error("test_getListOfDataoneExposedDataObjects: failed to execute AVU query"); + return dataObjectListResponse; + } + + // truncate list if count is specified and it is less than the total + List finalDataObjects = new ArrayList(); + if ((count >= 0) && (count < total)) { + finalDataObjects = dataObjects.subList(0, count); + } else { + finalDataObjects = dataObjects; + } + + dataObjectListResponse.setTotal(total); + dataObjectListResponse.setCount(finalDataObjects.size()); + dataObjectListResponse.setDataObjects(finalDataObjects); + + return dataObjectListResponse; + } + + private void loadProperties() { + properties = new Properties(); + InputStream input = null; + + input = getClass().getClassLoader().getResourceAsStream(this.propertiesFilename); + + // load a properties file + try { + properties.load(input); + } catch (IOException e) { + log.error("Cannot load Member Node properties file: {}", propertiesFilename, e); + properties = new Properties(); + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + // do nothing + } + } + } + } + + private List createAVUQueryElementList(Date fromDate, Date toDate, + ObjectFormatIdentifier formatId) { + + // TODO: probably should move these to properties + String dateAttr = "StartDateTime"; + String formatAttr = "Format"; + List avuQueryList = new ArrayList(); + String handleAttr = properties.getProperty("irods.dataone.publish_entity_metadata_attr"); + String handleValue = properties.getProperty("irods.dataone.publish_entity_metadata_value"); + + AVUQueryElement avuQuery; + try { + // DataOne exposed query + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, + handleAttr); + avuQueryList.add(avuQuery); + + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, + + handleValue); + avuQueryList.add(avuQuery); + + // handle any date queries + // restrict start date for now to 2/17/16 00:00:01 : 1455667201 + // 3-23-16 Update - now changed earliest data to 3/23/16 00:00:01 : + // 1458691201 + // 3-31-16 Update - now changed earliest data to 3/28/16 00:00:01 + // GMT : 1459123201 + long newFromDate; + if (fromDate != null) { + newFromDate = java.lang.Math.max(fromDate.getTime() / 1000, Long.parseLong("1459123201")); + } else { + newFromDate = Long.parseLong("1459123201"); + } + + // fromDate query + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, + dateAttr); + avuQueryList.add(avuQuery); + + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, + QueryConditionOperators.GREATER_THAN_OR_EQUAL_TO, Long.toString(newFromDate)); + + avuQueryList.add(avuQuery); + + // toDate query + if ((toDate != null) && ((toDate.getTime() / 1000) >= newFromDate)) { + + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, + dateAttr); + avuQueryList.add(avuQuery); + + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.LESS_THAN, + Long.toString(toDate.getTime() / 1000)); + avuQueryList.add(avuQuery); + + } + + // if ((toDate != null) && (toDate.getTime() >= newFromDate)) { + // avuQuery = AVUQueryElement.instanceForValueQuery( + // AVUQueryPart.ATTRIBUTE, + // AVUQueryOperatorEnum.EQUAL, + // dateAttr); + // avuQueryList.add(avuQuery); + // + // avuQuery = AVUQueryElement.instanceForValueQuery( + // AVUQueryPart.VALUE, + // AVUQueryOperatorEnum.BETWEEN, + // Long.toString(toDate.getTime()/1000)); + // avuQueryList.add(avuQuery); + // + // } + // else { + // avuQuery = AVUQueryElement.instanceForValueQuery( + // AVUQueryPart.ATTRIBUTE, + // AVUQueryOperatorEnum.EQUAL, + // dateAttr); + // avuQueryList.add(avuQuery); + // + // avuQuery = AVUQueryElement.instanceForValueQuery( + // AVUQueryPart.VALUE, + // AVUQueryOperatorEnum.GREATER_OR_EQUAL, + // Long.toString(newFromDate)); + // avuQueryList.add(avuQuery); + // + // } + + // handle data format query + if ((formatId != null) && (formatId.getValue() != null)) { + + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, + formatAttr); + avuQueryList.add(avuQuery); + + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.VALUE, QueryConditionOperators.EQUAL, + formatId.getValue()); + avuQueryList.add(avuQuery); + + } + } catch (JargonQueryException e) { + log.error("createAVUQueryElementList: failed to construct AVU query"); + return avuQueryList; + } + + return avuQueryList; + } + +} diff --git a/repo-service-handle-impl/src/main/java/org/irods/jargon/dataone/reposervice/handle/package-info.java b/repo-service-handle-impl/src/main/java/org/irods/jargon/dataone/reposervice/handle/package-info.java new file mode 100644 index 0000000..6695bb7 --- /dev/null +++ b/repo-service-handle-impl/src/main/java/org/irods/jargon/dataone/reposervice/handle/package-info.java @@ -0,0 +1,10 @@ +/** + * + */ +/** + * Original handle-based repo service implementation + * + * @author mconway + * + */ +package org.irods.jargon.dataone.reposervice.handle; \ No newline at end of file diff --git a/repo-service-handle-impl/src/main/lib/cnriutil.jar b/repo-service-handle-impl/src/main/lib/cnriutil.jar new file mode 100644 index 0000000000000000000000000000000000000000..211a869300836cc873278b4120755aa100b3fffe GIT binary patch literal 68965 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 T{QX_X0_F}H$VTtJ|L^|+!>YH< literal 0 HcmV?d00001 diff --git a/repo-service-handle-impl/src/main/lib/handle.jar b/repo-service-handle-impl/src/main/lib/handle.jar new file mode 100644 index 0000000000000000000000000000000000000000..aed4710a6df7b7cdd17c6b1d39e664a57d01e30d GIT binary patch literal 844979 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

    VoU^xg$XU(C|i!d!e8 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 aZJ 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

      13RcN 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≪;lQ7t1ft>H^(IpBy<=B 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 z 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 Date: Tue, 16 May 2017 10:39:03 -0400 Subject: [PATCH 36/88] #2 merge --- .../dataone/utils/DataOneTestHelper.java | 192 +++++++++--------- .../jargon/dataone/utils/RestVersion.java | 2 +- pid-service-api/pom.xml | 4 - 3 files changed, 97 insertions(+), 101 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataOneTestHelper.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataOneTestHelper.java index 40dafb8..10a5500 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataOneTestHelper.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/DataOneTestHelper.java @@ -1,96 +1,96 @@ -package org.irods.jargon.dataone.utils; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -import org.irods.jargon.testutils.TestingUtilsException; - -/** - * Utilities to load testing properties from a properties file - * - * @author Mike Conway, DICE (www.irods.org) - * @since 10/18/2009 - */ -public class DataOneTestHelper { - - public static final String JAR_DIRECTORY_PROP = "plugin.jar.location"; - - public String getPluginJarLocation(final Properties testingProperties) { - return testingProperties.getProperty(JAR_DIRECTORY_PROP); - } - - /** - * Return the given property (by key) as an int - * - * @param testingProperties - * @param key - * @return - * @throws TestingUtilsException - */ - public int getPropertyValueAsInt(final Properties testingProperties, - final String key) throws TestingUtilsException { - String propVal = (String) testingProperties.get(key); - - if (propVal == null || propVal.length() == 0) { - throw new TestingUtilsException( - "missing or invalid value in test-dataone.properties"); - } - - int retVal = 0; - - try { - retVal = Integer.parseInt(propVal); - } catch (NumberFormatException nfe) { - throw new TestingUtilsException( - "port is in valid format to convert to int:" + propVal, nfe); - } - - return retVal; - } - - /** - * Load the properties that control various tests from the - * testing.properties file on the code path - * - * @return Properties class with the test values - * @throws TestingUtilsException - */ - public Properties getTestProperties() throws TestingUtilsException { - ClassLoader loader = this.getClass().getClassLoader(); - InputStream in = loader.getResourceAsStream("test-dataone.properties"); - Properties properties = new Properties(); - - try { - properties.load(in); - } catch (IOException ioe) { - throw new TestingUtilsException( - "error loading test-dataone properties", ioe); - } finally { - try { - in.close(); - } catch (Exception e) { - // ignore - } - } - return properties; - } - - /** - * Get the given property as a boolean - * - * @param testingProperties - * @param key - * @return - */ - public boolean getPropertyValueAsBoolean( - final Properties testingProperties, final String key) { - String val = (String) testingProperties.get(key); - if (val == null) { - return false; - } else { - return Boolean.parseBoolean(val); - } - } - -} +package org.irods.jargon.dataone.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.irods.jargon.testutils.TestingUtilsException; + +/** + * Utilities to load testing properties from a properties file + * + * @author Mike Conway, DICE (www.irods.org) + * @since 10/18/2009 + */ +public class DataOneTestHelper { + + public static final String JAR_DIRECTORY_PROP = "plugin.jar.location"; + + public String getPluginJarLocation(final Properties testingProperties) { + return testingProperties.getProperty(JAR_DIRECTORY_PROP); + } + + /** + * Return the given property (by key) as an int + * + * @param testingProperties + * @param key + * @return + * @throws TestingUtilsException + */ + public int getPropertyValueAsInt(final Properties testingProperties, + final String key) throws TestingUtilsException { + String propVal = (String) testingProperties.get(key); + + if (propVal == null || propVal.length() == 0) { + throw new TestingUtilsException( + "missing or invalid value in test-dataone.properties"); + } + + int retVal = 0; + + try { + retVal = Integer.parseInt(propVal); + } catch (NumberFormatException nfe) { + throw new TestingUtilsException( + "port is in valid format to convert to int:" + propVal, nfe); + } + + return retVal; + } + + /** + * Load the properties that control various tests from the + * testing.properties file on the code path + * + * @return Properties class with the test values + * @throws TestingUtilsException + */ + public Properties getTestProperties() throws TestingUtilsException { + ClassLoader loader = this.getClass().getClassLoader(); + InputStream in = loader.getResourceAsStream("test-dataone.properties"); + Properties properties = new Properties(); + + try { + properties.load(in); + } catch (IOException ioe) { + throw new TestingUtilsException( + "error loading test-dataone properties", ioe); + } finally { + try { + in.close(); + } catch (Exception e) { + // ignore + } + } + return properties; + } + + /** + * Get the given property as a boolean + * + * @param testingProperties + * @param key + * @return + */ + public boolean getPropertyValueAsBoolean( + final Properties testingProperties, final String key) { + String val = (String) testingProperties.get(key); + if (val == null) { + return false; + } else { + return Boolean.parseBoolean(val); + } + } + +} diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index df1d5b0..c65735b 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-03-10T15:08:18Z"; + public static String BUILD_TIME="2017-05-16T14:37:56Z"; } diff --git a/pid-service-api/pom.xml b/pid-service-api/pom.xml index b915c30..5c74768 100644 --- a/pid-service-api/pom.xml +++ b/pid-service-api/pom.xml @@ -35,10 +35,6 @@ org.slf4j slf4j-log4j12 - - org.mockito - mockito-all - org.dataone d1_libclient_java From 0b604d7c793f577fef49331ff91ce9a45f85ee7c Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 18 May 2017 08:14:11 -0400 Subject: [PATCH 37/88] #2 wip --- .../jargon/dataone/tier1/MNReadImpl.java | 2 +- .../jargon/dataone/utils/RestVersion.java | 2 +- .../impl/dummy/DummyPidServiceAOImpl.java | 31 +--- .../pid/pidservice/AbstractUniqueIdAO.java | 34 +--- .../jargon/pid/pidservice/UniqueIdAO.java | 53 ++---- .../id/handle/UniqueIdAOHandleImpl.java | 172 ++---------------- .../UniqueIdAOHandleInMetadataImpl.java | 2 +- pom.xml | 2 + .../reposervice}/DataObjectListResponse.java | 2 +- 9 files changed, 50 insertions(+), 250 deletions(-) rename {pid-service-api/src/main/java/org/irods/jargon/pid/pidservice => repo-service-api/src/main/java/org/irods/jargon/dataone/repo/reposervice}/DataObjectListResponse.java (91%) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index 9ef7f02..1f90eed 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -50,10 +50,10 @@ import org.irods.jargon.dataone.auth.RestAuthUtils; import org.irods.jargon.dataone.configuration.RestConfiguration; import org.irods.jargon.dataone.domain.MNPermissionEnum; +import org.irods.jargon.dataone.repo.reposervice.DataObjectListResponse; import org.irods.jargon.dataone.utils.DataObjectMetadataUtils; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.dataone.utils.PropertiesLoader; -import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index c65735b..c6b0d56 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-05-16T14:37:56Z"; + public static String BUILD_TIME="2017-05-16T16:49:12Z"; } diff --git a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java index b87cee5..00c4631 100644 --- a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java +++ b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java @@ -1,60 +1,43 @@ package org.irods.jargon.dataone.pidservice.impl.dummy; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.pid.pidservice.AbstractUniqueIdAO; -import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DummyPidServiceAOImpl extends AbstractUniqueIdAO { - public static final Logger log = LoggerFactory - .getLogger(DummyPidServiceAOImpl.class); + public static final Logger log = LoggerFactory.getLogger(DummyPidServiceAOImpl.class); public DummyPidServiceAOImpl(PublicationContext publicationContext) { super(publicationContext); } @Override - public Identifier getIdentifierFromDataObject(DataObject dataObject) - throws JargonException { + public Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException { Identifier id = new Identifier(); - id.setValue(new String("http://handle/dummy/" - + String.valueOf(System.currentTimeMillis()))); + id.setValue(new String("http://handle/dummy/" + String.valueOf(System.currentTimeMillis()))); return id; } @Override - public DataObject getDataObjectFromIdentifier(Identifier identifier) - throws JargonException { + public DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException { return new DataObject(); } @Override - public List getListOfDataoneExposedIdentifiers() - throws JargonException { - List ids = new ArrayList(); + public List getListOfDataoneExposedIdentifiers() throws JargonException { + List ids = new ArrayList<>(); Identifier id = new Identifier(); - id.setValue(new String("http://handle/dummy/" - + String.valueOf(System.currentTimeMillis()))); + id.setValue(new String("http://handle/dummy/" + String.valueOf(System.currentTimeMillis()))); ids.add(id); return ids; } - @Override - public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, Date toDate, ObjectFormatIdentifier formatId, - Boolean replicaStatus, Integer start, Integer count) - throws JargonException { - return new DataObjectListResponse(); - } - } diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java index 8b04e18..3b5e47c 100644 --- a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java @@ -3,11 +3,9 @@ */ package org.irods.jargon.pid.pidservice; -import java.util.Date; import java.util.List; import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.dataone.configuration.PublicationContext; @@ -20,8 +18,7 @@ * @author mconway * */ -public abstract class AbstractUniqueIdAO extends AbstractDataOnePlugin - implements UniqueIdAO { +public abstract class AbstractUniqueIdAO extends AbstractDataOnePlugin implements UniqueIdAO { /** * Default constructor takes a context object with a handle to connection @@ -41,8 +38,7 @@ public AbstractUniqueIdAO(PublicationContext publicationContext) { * (org.irods.jargon.core.pub.domain.DataObject) */ @Override - public abstract Identifier getIdentifierFromDataObject(DataObject dataObject) - throws JargonException; + public abstract Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException; /* * (non-Javadoc) @@ -52,33 +48,15 @@ public abstract Identifier getIdentifierFromDataObject(DataObject dataObject) * (org.dataone.service.types.v1.Identifier) */ @Override - public abstract DataObject getDataObjectFromIdentifier(Identifier identifier) - throws JargonException; + public abstract DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException; /* * (non-Javadoc) * - * @see - * org.irods.jargon.pid.pidservice.UniqueIdAO#getListOfDataoneExposedIdentifiers - * () - */ - @Override - public abstract List getListOfDataoneExposedIdentifiers() - throws JargonException; - - /* - * (non-Javadoc) - * - * @see - * org.irods.jargon.pid.pidservice.UniqueIdAO#getListOfDataoneExposedDataObjects - * (java.util.Date, java.util.Date, - * org.dataone.service.types.v1.ObjectFormatIdentifier, java.lang.Boolean, - * java.lang.Integer, java.lang.Integer) + * @see org.irods.jargon.pid.pidservice.UniqueIdAO# + * getListOfDataoneExposedIdentifiers () */ @Override - public abstract DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, Date toDate, ObjectFormatIdentifier formatId, - Boolean replicaStatus, Integer start, Integer count) - throws JargonException; + public abstract List getListOfDataoneExposedIdentifiers() throws JargonException; } diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java index 72740ca..85bf5fb 100644 --- a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/UniqueIdAO.java @@ -1,34 +1,30 @@ package org.irods.jargon.pid.pidservice; -import java.util.Date; import java.util.List; import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; // Access object for unique identifiers that are associated with iRODS Data Objects public interface UniqueIdAO { - - //These methods are intended for future support of DataONE MN tiers > 1 - //public Identifier createNewIdentifier(); - //public Identifier createNewIdentifier(String identifier); - //public void deleteIdentifier(String identifier); - + + // These methods are intended for future support of DataONE MN tiers > 1 + // public Identifier createNewIdentifier(); + // public Identifier createNewIdentifier(String identifier); + // public void deleteIdentifier(String identifier); + /** * Returns a DataONE Identifier object for the iRODS Data Object specified * * @param dataObject - * DataObject of iRODS Data Object - * associated with the identifier to be returned. + * DataObject of iRODS Data Object associated with + * the identifier to be returned. * @throws JargonException */ - public Identifier getIdentifierFromDataObject(DataObject dataObject) - throws JargonException; - - + public Identifier getIdentifierFromDataObject(DataObject dataObject) throws JargonException; + /** * Returns an iRODS Data Object for the DataONE Identifier object specified * @@ -37,36 +33,15 @@ public Identifier getIdentifierFromDataObject(DataObject dataObject) * to be returned. * @throws JargonException */ - public DataObject getDataObjectFromIdentifier(Identifier identifier) - throws JargonException; - - - + public DataObject getDataObjectFromIdentifier(Identifier identifier) throws JargonException; + /** * Returns a complete list of Unique Identifiers that are associated with * iRODS objects that are exposed to DataONE * - * @return List<Identifier> - * @throws JargonException - */ - public List getListOfDataoneExposedIdentifiers() - throws JargonException; - - - - /** - * Returns an iRODS Data Object for the DataONE Identifier object specified - * - * @return List<DataObject> + * @return List<Identifier> * @throws JargonException */ - public DataObjectListResponse getListOfDataoneExposedDataObjects( - Date fromDate, - Date toDate, - ObjectFormatIdentifier formatId, - Boolean replicaStatus, - Integer start, - Integer count - ) throws JargonException; + public List getListOfDataoneExposedIdentifiers() throws JargonException; } diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java index ac92fac..9a0c8fa 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleImpl.java @@ -3,21 +3,16 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.Properties; import org.dataone.service.types.v1.Identifier; -import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.DataObjectAO; import org.irods.jargon.core.pub.domain.DataObject; -import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.core.service.AbstractJargonService; -import org.irods.jargon.dataone.utils.DataTypeUtils; -import org.irods.jargon.pid.pidservice.DataObjectListResponse; import org.irods.jargon.pid.pidservice.UniqueIdAO; //import org.irods.jargon.dataprofile.DataProfile; //import org.irods.jargon.dataprofile.DataProfileService; @@ -27,8 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class UniqueIdAOHandleImpl extends AbstractJargonService implements -UniqueIdAO { +public class UniqueIdAOHandleImpl extends AbstractJargonService implements UniqueIdAO { private Properties properties; private String propertiesFilename = "d1client.properties"; @@ -39,8 +33,7 @@ public DataObject getDataObjectFromIdentifier(final Identifier identifier) throws JargonException, FileNotFoundException { DataObject dataObject = null; - log.info("retrieving irods data object id from identifier: {}", - identifier.getValue()); + log.info("retrieving irods data object id from identifier: {}", identifier.getValue()); long dataObjectId = getDataObjectIdFromDataOneIdentifier(identifier); log.info("got id: {}", dataObjectId); @@ -50,12 +43,10 @@ public DataObject getDataObjectFromIdentifier(final Identifier identifier) try { - DataObjectAO dataObjectAO = irodsAccessObjectFactory - .getDataObjectAO(irodsAccount); + DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); log.info("got dataObjectAO: {}", dataObjectAO.toString()); // Find iRODS object here from Identifier - dataObject = dataObjectAO.findById(new Long(dataObjectId) - .intValue()); + dataObject = dataObjectAO.findById(new Long(dataObjectId).intValue()); if (dataObject != null) { log.info("found iRODS file: {}", dataObject.getAbsolutePath()); } else { @@ -73,8 +64,7 @@ public DataObject getDataObjectFromIdentifier(final Identifier identifier) } @Override - public Identifier getIdentifierFromDataObject(final DataObject dataObject) - throws JargonException { + public Identifier getIdentifierFromDataObject(final DataObject dataObject) throws JargonException { if (dataObject == null) { log.error("getIdentifierFromDataObject: dataObject is null"); @@ -95,24 +85,20 @@ public Identifier getIdentifierFromDataObject(final DataObject dataObject) } @Override - public List getListOfDataoneExposedIdentifiers() - throws JargonException { + public List getListOfDataoneExposedIdentifiers() throws JargonException { - List identifiers = new ArrayList(); + List identifiers = new ArrayList<>(); // retrieve properties to get list of current handles from // handle server StringBuilder hdl = new StringBuilder(); - hdl.append(properties - .getProperty("irods.dataone.handle.namingAuthority")); + hdl.append(properties.getProperty("irods.dataone.handle.namingAuthority")); hdl.append("/"); hdl.append(properties.getProperty("irods.dataone.handle.prefix")); String authHandle = hdl.toString(); String authIndex = properties.getProperty("irods.dataone.handle.index"); - String privateKey = properties - .getProperty("irods.dataone.handle.privateKeyPath"); - String namingAuthority = properties - .getProperty("irods.dataone.handle.prefix"); + String privateKey = properties.getProperty("irods.dataone.handle.privateKeyPath"); + String namingAuthority = properties.getProperty("irods.dataone.handle.prefix"); log.info("config params for handle lister:"); log.info("authHandle: {}", authHandle); @@ -122,10 +108,10 @@ public List getListOfDataoneExposedIdentifiers() // LinkedBlockingQueue> queue = new // LinkedBlockingQueue>(); - LinkedList> queue = new LinkedList>(); + LinkedList> queue = new LinkedList<>(); - HandleListerRunnable hlThread = new HandleListerRunnable(queue, - authHandle, authIndex, privateKey, namingAuthority); + HandleListerRunnable hlThread = new HandleListerRunnable(queue, authHandle, authIndex, privateKey, + namingAuthority); hlThread.run(); log.info("continuing after call to run"); @@ -146,8 +132,7 @@ public List getListOfDataoneExposedIdentifiers() } if (handles != null) { - log.info("listObjects: got list of Handle values: {}", - handles.toString()); + log.info("listObjects: got list of Handle values: {}", handles.toString()); for (String h : handles) { Identifier id = new Identifier(); @@ -160,65 +145,6 @@ public List getListOfDataoneExposedIdentifiers() return identifiers; } - @Override - public DataObjectListResponse getListOfDataoneExposedDataObjects( - final Date fromDate, final Date toDate, - final ObjectFormatIdentifier formatId, final Boolean replicaStatus, - final Integer start, final Integer count) throws JargonException { - - // get complete list of exposed data objects - // TODO: see if this can be done differently to just request list - // using filter items - DataObjectListResponse dataObjectListResponse = new DataObjectListResponse(); - List dataObjectListTmp = new ArrayList(); - List dataObjectListFinal = new ArrayList(); - List ids = getListOfDataoneExposedIdentifiers(); - - log.info("finding list of data objects with list of {} identifiers", - ids.size()); - - for (Identifier id : ids) { - DataObject dataObject; - try { - dataObject = getDataObjectFromIdentifier(id); - } catch (JargonException ex) { - // just ignore this id - dataObject = null; - } - - if (dataObject != null) { - Date modifiedDate = dataObject.getUpdatedAt(); - - if (matchesFromDate(fromDate, modifiedDate) - && matchesToDate(toDate, modifiedDate) && - // matchesFormatId(formatId, dataObject) && support not - // required - matchesReplicaStatus(replicaStatus)) { - dataObjectListTmp.add(dataObject); - } - } - } - // save total before filtering with start and count - dataObjectListResponse.setTotal(dataObjectListTmp.size()); - - // now filter this list according to start and count - if (dataObjectListTmp.size() > 0) { - DataObject[] dataObjectArray = dataObjectListTmp - .toArray(new DataObject[dataObjectListTmp.size()]); - int end = start + count; - for (int i = start; i < dataObjectArray.length && i < end; i++) { - dataObjectListFinal.add(dataObjectArray[i]); - } - } - - dataObjectListResponse.setCount(dataObjectListFinal.size()); - dataObjectListResponse.setDataObjects(dataObjectListFinal); - - log.info("returning list of dataObjects: {}", - dataObjectListFinal.toString()); - return dataObjectListResponse; - } - public long getDataObjectIdFromDataOneIdentifier(final Identifier pid) { int idIdx = pid.getValue().indexOf("/") + 1; @@ -230,9 +156,7 @@ public long getDataObjectIdFromDataOneIdentifier(final Identifier pid) { dataObjectId = -1; } - log.info( - "getDataObjectIdFromDataOneIdentifier: returning data object id: {}", - dataObjectId); + log.info("getDataObjectIdFromDataOneIdentifier: returning data object id: {}", dataObjectId); return dataObjectId; } @@ -247,15 +171,13 @@ public String getHandlePrefix() throws JargonException { private void loadProperties() { properties = new Properties(); InputStream input = null; - input = getClass().getClassLoader().getResourceAsStream( - propertiesFilename); + input = getClass().getClassLoader().getResourceAsStream(propertiesFilename); // load a properties file try { properties.load(input); } catch (IOException e) { - log.error("Cannot load Member Node properties file: {}", - propertiesFilename); + log.error("Cannot load Member Node properties file: {}", propertiesFilename); log.error("IOException: {}", e.getStackTrace()); properties = new Properties(); } finally { @@ -269,64 +191,4 @@ private void loadProperties() { } } - private boolean matchesFromDate(final Date fromDate, - final Date dataObjectModDate) { - - if (fromDate == null || fromDate.getTime() <= 0) { - log.info("fromDate : returning matches"); - return true; - } - - if (fromDate.getTime() <= dataObjectModDate.getTime()) { - log.info("fromDate : returning matches"); - return true; - } - - log.info("fromDate : returning no match"); - return false; - } - - private boolean matchesToDate(final Date toDate, - final Date dataObjectModDate) { - - if (toDate == null || toDate.getTime() <= 0) { - log.info("toDate : returning matches"); - return true; - } - - if (toDate.getTime() >= dataObjectModDate.getTime()) { - log.info("toDate : returning matches"); - return true; - } - - log.info("toDate : returning no match"); - return false; - } - - private boolean matchesFormatId(final ObjectFormatIdentifier formatId, - final DataObject dataObject) throws JargonException, - JargonQueryException { - - String dataFormat = DataTypeUtils.getDataObjectFormatFromMetadata( - irodsAccount, irodsAccessObjectFactory, dataObject); - - if ((formatId.getValue() == null) - || (formatId.getValue().equals(dataFormat))) { - return true; - } - return false; - } - - private boolean matchesReplicaStatus(final Boolean replicaStatus) { - - // replication is always set to false for now - if (replicaStatus == null || replicaStatus == false) { - log.info("replicastatus : returning matches"); - return true; - } - - log.info("toDate : returning no match"); - return false; - } - } diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java index e384162..5cd5cac 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java @@ -19,7 +19,7 @@ import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.core.query.QueryConditionOperators; import org.irods.jargon.core.service.AbstractJargonService; -import org.irods.jargon.pid.pidservice.DataObjectListResponse; +import org.irods.jargon.dataone.repo.reposervice.DataObjectListResponse; import org.irods.jargon.pid.pidservice.UniqueIdAO; //import org.irods.jargon.dataprofile.DataProfile; //import org.irods.jargon.dataprofile.DataProfileService; diff --git a/pom.xml b/pom.xml index a2ab082..d3ce6b6 100644 --- a/pom.xml +++ b/pom.xml @@ -107,9 +107,11 @@ pid-service-api event-service-api repo-service-api + dummy-repo-service-impl pid-service-handle-impl dataone-utils dummy-event-service-impl dummy-pid-service-impl + dfc-repo-service-impl diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/repo/reposervice/DataObjectListResponse.java similarity index 91% rename from pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java rename to repo-service-api/src/main/java/org/irods/jargon/dataone/repo/reposervice/DataObjectListResponse.java index f075862..bb99120 100644 --- a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataObjectListResponse.java +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/repo/reposervice/DataObjectListResponse.java @@ -1,4 +1,4 @@ -package org.irods.jargon.pid.pidservice; +package org.irods.jargon.dataone.repo.reposervice; import java.util.List; From 591ce587ec1a5d4752e13f58e467b0e6b9e99e5e Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 18 May 2017 13:13:08 -0400 Subject: [PATCH 38/88] #2 adding factories and aligning api for lookups externally --- .../jargon/dataone/tier1/MNReadImpl.java | 2 +- .../jargon/dataone/utils/RestVersion.java | 6 +- .../dataone/plugin/AbstractDataOnePlugin.java | 15 +++- dfc-repo-service-impl/pom.xml | 5 +- .../dataone/repo/dfc/DfcRepoServiceImpl.java | 89 ++++--------------- .../impl/dummy/DummyEventServiceAOImpl.java | 15 ++-- .../impl/dummy/DummyPidServiceAOImpl.java | 23 +---- .../repo/impl/dummy/DummyRepoServiceImpl.java | 23 +++-- .../AbstractDataOneEventServiceFactory.java | 28 ++++++ .../events/AbstractEventServiceAO.java | 26 ++++-- .../pidservice/AbstractDataOnePidFactory.java | 28 ++++++ .../pid/pidservice/AbstractUniqueIdAO.java | 12 ++- .../UniqueIdAOHandleInMetadataImpl.java | 10 +-- repo-service-api/pom.xml | 1 - .../reposervice/AbstractDataOneRepoAO.java | 12 ++- .../AbstractDataOneRepoFactory.java | 28 ++++++ 16 files changed, 179 insertions(+), 144 deletions(-) create mode 100644 event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java create mode 100644 pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractDataOnePidFactory.java create mode 100644 repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoFactory.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index 8bc5882..cf0f000 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -50,7 +50,7 @@ import org.irods.jargon.dataone.auth.RestAuthUtils; import org.irods.jargon.dataone.configuration.RestConfiguration; import org.irods.jargon.dataone.domain.MNPermissionEnum; -import org.irods.jargon.dataone.repo.reposervice.DataObjectListResponse; +import org.irods.jargon.dataone.reposervice.DataObjectListResponse; import org.irods.jargon.dataone.utils.DataObjectMetadataUtils; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.dataone.utils.PropertiesLoader; diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index bcdc1f4..164daa6 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,7 +1,5 @@ package org.irods.jargon.dataone.utils; - public final class RestVersion { - public static String VERSION = "4.2.1.0-SNAPSHOT"; - - public static String BUILD_TIME = "2017-03-20T17:31:35Z"; + public static String VERSION="4.2.1.0-SNAPSHOT"; + public static String BUILD_TIME="2017-05-18T16:50:35Z"; } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java index 4172fe7..aef6da7 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/plugin/AbstractDataOnePlugin.java @@ -1,5 +1,6 @@ package org.irods.jargon.dataone.plugin; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.dataone.configuration.PublicationContext; /** @@ -9,6 +10,8 @@ */ public class AbstractDataOnePlugin { + private final IRODSAccount irodsAccount; + /** * Represents a handle to iRODS connection and general configuration * information @@ -16,9 +19,12 @@ public class AbstractDataOnePlugin { private final PublicationContext publicationContext; /** + * @param irodsAccount * @param publicationContext */ - public AbstractDataOnePlugin(PublicationContext publicationContext) { + public AbstractDataOnePlugin(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(); + this.irodsAccount = irodsAccount; this.publicationContext = publicationContext; } @@ -29,4 +35,11 @@ protected PublicationContext getPublicationContext() { return publicationContext; } + /** + * @return the irodsAccount + */ + public IRODSAccount getIrodsAccount() { + return irodsAccount; + } + } diff --git a/dfc-repo-service-impl/pom.xml b/dfc-repo-service-impl/pom.xml index 0e02165..d172d0b 100644 --- a/dfc-repo-service-impl/pom.xml +++ b/dfc-repo-service-impl/pom.xml @@ -49,10 +49,9 @@ dataone-utils ${project.version} - - + org.irods - pid-service-handel-impl + repo-service-api ${project.version} diff --git a/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java b/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java index ab416c1..7be47df 100644 --- a/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java +++ b/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java @@ -5,18 +5,17 @@ import java.util.ArrayList; import java.util.Date; -import java.util.LinkedList; import java.util.List; import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.dataone.configuration.PublicationContext; -import org.irods.jargon.dataone.id.handle.HandleListerRunnable; -import org.irods.jargon.dataone.repo.reposervice.AbstractRepoServiceAO; -import org.irods.jargon.dataone.repo.reposervice.DataObjectListResponse; +import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoAO; +import org.irods.jargon.dataone.reposervice.DataObjectListResponse; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,17 +24,14 @@ * @author mcc * */ -public class DfcRepoServiceImpl extends AbstractRepoServiceAO { +public class DfcRepoServiceImpl extends AbstractDataOneRepoAO { - private Logger log = LoggerFactory.getLogger(this.getClass()); - - /** - * @param publicationContext - */ - public DfcRepoServiceImpl(PublicationContext publicationContext) { - super(publicationContext); + public DfcRepoServiceImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); } + private Logger log = LoggerFactory.getLogger(this.getClass()); + @Override public DataObjectListResponse getListOfDataoneExposedDataObjects(final Date fromDate, final Date toDate, final ObjectFormatIdentifier formatId, final Boolean replicaStatus, final Integer start, @@ -53,12 +49,8 @@ public DataObjectListResponse getListOfDataoneExposedDataObjects(final Date from for (Identifier id : ids) { DataObject dataObject; - try { - dataObject = getDataObjectFromIdentifier(id); - } catch (JargonException ex) { - // just ignore this id - dataObject = null; - } + dataObject = null; // TODO://recast + // getDataObjectFromIdentifier(id); if (dataObject != null) { Date modifiedDate = dataObject.getUpdatedAt(); @@ -125,8 +117,8 @@ private boolean matchesToDate(final Date toDate, final Date dataObjectModDate) { private boolean matchesFormatId(final ObjectFormatIdentifier formatId, final DataObject dataObject) throws JargonException, JargonQueryException { - String dataFormat = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, irodsAccessObjectFactory, - dataObject); + String dataFormat = DataTypeUtils.getDataObjectFormatFromMetadata(getIrodsAccount(), + this.getPublicationContext().getIrodsAccessObjectFactory(), dataObject); if ((formatId.getValue() == null) || (formatId.getValue().equals(dataFormat))) { return true; @@ -146,63 +138,12 @@ private boolean matchesReplicaStatus(final Boolean replicaStatus) { return false; } - private List getListOfDataoneExposedIdentifiers() throws JargonException { + @Override + public List getListOfDataoneExposedIdentifiers() throws JargonException { List identifiers = new ArrayList<>(); - // retrieve properties to get list of current handles from - // handle server - StringBuilder hdl = new StringBuilder(); - hdl.append(properties.getProperty("irods.dataone.handle.namingAuthority")); - hdl.append("/"); - hdl.append(properties.getProperty("irods.dataone.handle.prefix")); - String authHandle = hdl.toString(); - String authIndex = properties.getProperty("irods.dataone.handle.index"); - String privateKey = properties.getProperty("irods.dataone.handle.privateKeyPath"); - String namingAuthority = properties.getProperty("irods.dataone.handle.prefix"); - - log.info("config params for handle lister:"); - log.info("authHandle: {}", authHandle); - log.info("authIndex:{}", authIndex); - log.info("privateKey: {}", privateKey); - log.info("namingAuthority: {}", namingAuthority); - - // LinkedBlockingQueue> queue = new - // LinkedBlockingQueue>(); - LinkedList> queue = new LinkedList<>(); - - HandleListerRunnable hlThread = new HandleListerRunnable(queue, authHandle, authIndex, privateKey, - namingAuthority); - hlThread.run(); - log.info("continuing after call to run"); - - synchronized (queue) { - while (queue.isEmpty()) { - try { - queue.wait(); - } catch (InterruptedException e) { - log.warn("getListOfDataoneExposedIdentifiers: caught InterruptedException while waiting for queue"); - } - } - } - - List handles = null; - if (!queue.isEmpty()) { - log.debug("listObjects: got list of Handle values"); - handles = queue.element(); - } - - if (handles != null) { - log.info("listObjects: got list of Handle values: {}", handles.toString()); - - for (String h : handles) { - Identifier id = new Identifier(); - id.setValue(h); - identifiers.add(id); - } - } - - log.info("returning identifiers: {}", identifiers); + // FIXME: recast return identifiers; } diff --git a/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceAOImpl.java b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceAOImpl.java index 7a543a6..dcb3f77 100644 --- a/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceAOImpl.java +++ b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceAOImpl.java @@ -9,6 +9,7 @@ import org.dataone.service.types.v1.Event; import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.Log; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.InvalidArgumentException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.dataone.configuration.PublicationContext; @@ -26,15 +27,10 @@ */ public class DummyEventServiceAOImpl extends AbstractEventServiceAO { - public static final Logger log = LoggerFactory - .getLogger(DummyEventServiceAOImpl.class); + public static final Logger log = LoggerFactory.getLogger(DummyEventServiceAOImpl.class); - /** - * @param publicationContext - */ - public DummyEventServiceAOImpl(PublicationContext publicationContext) { - super(publicationContext); - log.info("publicationContext:{}", publicationContext); + public DummyEventServiceAOImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); } /* @@ -46,8 +42,7 @@ public DummyEventServiceAOImpl(PublicationContext publicationContext) { * java.lang.String, int, int) */ @Override - public Log getLogs(Date fromDate, Date toDate, EventsEnum event, - String pidFilter, int startIdx, int count) { + public Log getLogs(Date fromDate, Date toDate, EventsEnum event, String pidFilter, int startIdx, int count) { log.info("getLogs()"); return new Log(); } diff --git a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java index 88c3e4b..4833865 100644 --- a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java +++ b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceAOImpl.java @@ -1,12 +1,7 @@ package org.irods.jargon.dataone.pidservice.impl.dummy; -<<<<<<< HEAD -import java.util.ArrayList; -import java.util.List; - -======= ->>>>>>> e62fc1cc438d1c176f0cef8a76bbd905d42d375d import org.dataone.service.types.v1.Identifier; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.dataone.configuration.PublicationContext; @@ -18,8 +13,8 @@ public class DummyPidServiceAOImpl extends AbstractUniqueIdAO { public static final Logger log = LoggerFactory.getLogger(DummyPidServiceAOImpl.class); - public DummyPidServiceAOImpl(PublicationContext publicationContext) { - super(publicationContext); + public DummyPidServiceAOImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); } @Override @@ -34,16 +29,4 @@ public DataObject getDataObjectFromIdentifier(Identifier identifier) throws Jarg return new DataObject(); } -<<<<<<< HEAD - @Override - public List getListOfDataoneExposedIdentifiers() throws JargonException { - List ids = new ArrayList<>(); - Identifier id = new Identifier(); - id.setValue(new String("http://handle/dummy/" + String.valueOf(System.currentTimeMillis()))); - ids.add(id); - return ids; - } - -======= ->>>>>>> e62fc1cc438d1c176f0cef8a76bbd905d42d375d } diff --git a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java index f5c6903..4fec540 100644 --- a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java +++ b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java @@ -4,25 +4,24 @@ package org.irods.jargon.dataone.repo.impl.dummy; import java.util.Date; +import java.util.List; +import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.dataone.configuration.PublicationContext; -import org.irods.jargon.dataone.repo.reposervice.AbstractRepoServiceAO; -import org.irods.jargon.dataone.repo.reposervice.DataObjectListResponse; +import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoAO; +import org.irods.jargon.dataone.reposervice.DataObjectListResponse; /** * @author mcc * */ -public class DummyRepoServiceImpl extends AbstractRepoServiceAO { +public class DummyRepoServiceImpl extends AbstractDataOneRepoAO { - /** - * @param publicationContext - */ - public DummyRepoServiceImpl(PublicationContext publicationContext) { - super(publicationContext); - // TODO Auto-generated constructor stub + public DummyRepoServiceImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); } /* @@ -39,4 +38,10 @@ public DataObjectListResponse getListOfDataoneExposedDataObjects(Date arg0, Date return new DataObjectListResponse(); } + @Override + public List getListOfDataoneExposedIdentifiers() throws JargonException { + // FIXME: narrow down the needed public methods + return null; + } + } diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java new file mode 100644 index 0000000..5acb0f5 --- /dev/null +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java @@ -0,0 +1,28 @@ +/** + * + */ +package org.irods.jargon.dataone.events; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; + +/** + * Factory to create event services + * + * @author mcc + * + */ +public abstract class AbstractDataOneEventServiceFactory { + + /** + * Create an instance of the pid service + * + * @param publicationContext + * {@link PublicationContext} with configuration information + * @param irodsAccount + * {@link IRODSAccount} associated with the instance + * @return + */ + public abstract EventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); + +} diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java index 541de90..abfe620 100644 --- a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java @@ -9,6 +9,7 @@ import org.dataone.service.types.v1.Event; import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.Log; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.InvalidArgumentException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.dataone.configuration.PublicationContext; @@ -21,11 +22,19 @@ * @author mconway * */ -public abstract class AbstractEventServiceAO extends AbstractDataOnePlugin - implements EventServiceAO { +public abstract class AbstractEventServiceAO extends AbstractDataOnePlugin implements EventServiceAO { - public AbstractEventServiceAO(PublicationContext publicationContext) { - super(publicationContext); + /** + * Default constructor with required values + * + * @param irodsAccount + * {@link IRODSAccount} for the current iRODS connection + * @param publicationContext + * {@link PublicationContext} with configuration and other + * information + */ + public AbstractEventServiceAO(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); } /* @@ -37,8 +46,8 @@ public AbstractEventServiceAO(PublicationContext publicationContext) { * java.lang.String, int, int) */ @Override - public abstract Log getLogs(Date fromDate, Date toDate, EventsEnum event, - String pidFilter, int startIdx, int count); + public abstract Log getLogs(Date fromDate, Date toDate, EventsEnum event, String pidFilter, int startIdx, + int count); /* * (non-Javadoc) @@ -49,7 +58,6 @@ public abstract Log getLogs(Date fromDate, Date toDate, EventsEnum event, * java.lang.String) */ @Override - public abstract void recordEvent(Event event, Identifier id, - String description) throws InvalidArgumentException, - JargonException, ServiceFailure; + public abstract void recordEvent(Event event, Identifier id, String description) + throws InvalidArgumentException, JargonException, ServiceFailure; } diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractDataOnePidFactory.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractDataOnePidFactory.java new file mode 100644 index 0000000..09f16ad --- /dev/null +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractDataOnePidFactory.java @@ -0,0 +1,28 @@ +/** + * + */ +package org.irods.jargon.pid.pidservice; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; + +/** + * Factory to create pid services + * + * @author mcc + * + */ +public abstract class AbstractDataOnePidFactory { + + /** + * Create an instance of the pid service + * + * @param publicationContext + * {@link PublicationContext} with configuration information + * @param irodsAccount + * {@link IRODSAccount} associated with the instance + * @return + */ + public abstract UniqueIdAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); + +} diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java index c82c856..eeabf1b 100644 --- a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractUniqueIdAO.java @@ -4,6 +4,7 @@ package org.irods.jargon.pid.pidservice; import org.dataone.service.types.v1.Identifier; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.dataone.configuration.PublicationContext; @@ -19,13 +20,16 @@ public abstract class AbstractUniqueIdAO extends AbstractDataOnePlugin implements UniqueIdAO { /** - * Default constructor takes a context object with a handle to connection - * and config + * Default constructor with required values * + * @param irodsAccount + * {@link IRODSAccount} for the current iRODS connection * @param publicationContext + * {@link PublicationContext} with configuration and other + * information */ - public AbstractUniqueIdAO(PublicationContext publicationContext) { - super(publicationContext); + public AbstractUniqueIdAO(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); } /* diff --git a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java index 173b3c1..65db503 100644 --- a/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java +++ b/pid-service-handle-impl/src/main/java/org/irods/jargon/dataone/id/handle/UniqueIdAOHandleInMetadataImpl.java @@ -5,6 +5,7 @@ import java.util.Properties; import org.dataone.service.types.v1.Identifier; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.DataObjectAO; @@ -16,15 +17,14 @@ public class UniqueIdAOHandleInMetadataImpl extends AbstractUniqueIdAO { - public UniqueIdAOHandleInMetadataImpl(PublicationContext publicationContext) { - super(publicationContext); - loadProperties(); - } - private Properties properties; private String propertiesFilename = "d1client.properties"; private Logger log = LoggerFactory.getLogger(this.getClass()); + public UniqueIdAOHandleInMetadataImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); + } + @Override public DataObject getDataObjectFromIdentifier(final Identifier identifier) throws JargonException, FileNotFoundException { diff --git a/repo-service-api/pom.xml b/repo-service-api/pom.xml index 386291b..3d136be 100644 --- a/repo-service-api/pom.xml +++ b/repo-service-api/pom.xml @@ -48,7 +48,6 @@ dataone-utils ${project.version} - diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java index e089707..c2cd881 100644 --- a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java @@ -8,6 +8,7 @@ import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.plugin.AbstractDataOnePlugin; @@ -22,11 +23,16 @@ public abstract class AbstractDataOneRepoAO extends AbstractDataOnePlugin implements DataOneRepoAO { /** + * Default constructor with required values + * + * @param irodsAccount + * {@link IRODSAccount} for the current iRODS connection * @param publicationContext + * {@link PublicationContext} with configuration and other + * information */ - public AbstractDataOneRepoAO(PublicationContext publicationContext) { - super(publicationContext); - // TODO Auto-generated constructor stub + public AbstractDataOneRepoAO(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); } /* diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoFactory.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoFactory.java new file mode 100644 index 0000000..59da33e --- /dev/null +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoFactory.java @@ -0,0 +1,28 @@ +/** + * + */ +package org.irods.jargon.dataone.reposervice; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; + +/** + * Factory to create repo services + * + * @author mcc + * + */ +public abstract class AbstractDataOneRepoFactory { + + /** + * Create an instance of the pid service + * + * @param publicationContext + * {@link PublicationContext} with configuration information + * @param irodsAccount + * {@link IRODSAccount} associated with the instance + * @return + */ + public abstract DataOneRepoAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); + +} From ffe9b324fd126743aaa16df628523fa6a8f0fcbf Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 18 May 2017 14:15:23 -0400 Subject: [PATCH 39/88] #3 add dummy factories --- .../impl/dummy/DummyEventServiceFactory.java | 35 ++++++++++++++++++ .../impl/dummy/DummyPidServiceFactory.java | 37 +++++++++++++++++++ .../impl/dummy/DummyRepoServiceFactory.java | 37 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceFactory.java create mode 100644 dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceFactory.java create mode 100644 dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceFactory.java diff --git a/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceFactory.java b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceFactory.java new file mode 100644 index 0000000..fbadb58 --- /dev/null +++ b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceFactory.java @@ -0,0 +1,35 @@ +/** + * + */ +package org.irods.jargon.dataone.events.impl.dummy; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.events.AbstractDataOneEventServiceFactory; +import org.irods.jargon.dataone.events.EventServiceAO; + +/** + * @author mcc + * + */ +public class DummyEventServiceFactory extends AbstractDataOneEventServiceFactory { + + /** + * + */ + public DummyEventServiceFactory() { + } + + /* + * (non-Javadoc) + * + * @see org.irods.jargon.dataone.events.AbstractDataOneEventServiceFactory# + * instance(org.irods.jargon.dataone.configuration.PublicationContext, + * org.irods.jargon.core.connection.IRODSAccount) + */ + @Override + public EventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { + return new DummyEventServiceAOImpl(irodsAccount, publicationContext); + } + +} diff --git a/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceFactory.java b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceFactory.java new file mode 100644 index 0000000..413e5a6 --- /dev/null +++ b/dummy-pid-service-impl/src/main/java/org/irods/jargon/dataone/pidservice/impl/dummy/DummyPidServiceFactory.java @@ -0,0 +1,37 @@ +/** + * + */ +package org.irods.jargon.dataone.pidservice.impl.dummy; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.pid.pidservice.AbstractDataOnePidFactory; +import org.irods.jargon.pid.pidservice.UniqueIdAO; + +/** + * @author mcc + * + */ +public class DummyPidServiceFactory extends AbstractDataOnePidFactory { + + /** + * + */ + public DummyPidServiceFactory() { + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.pid.pidservice.AbstractDataOnePidFactory#instance(org. + * irods.jargon.dataone.configuration.PublicationContext, + * org.irods.jargon.core.connection.IRODSAccount) + */ + @Override + public UniqueIdAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { + + return new DummyPidServiceAOImpl(irodsAccount, publicationContext); + } + +} diff --git a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceFactory.java b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceFactory.java new file mode 100644 index 0000000..84bcef2 --- /dev/null +++ b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceFactory.java @@ -0,0 +1,37 @@ +/** + * + */ +package org.irods.jargon.dataone.repo.impl.dummy; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoFactory; +import org.irods.jargon.dataone.reposervice.DataOneRepoAO; + +/** + * @author mcc + * + */ +public class DummyRepoServiceFactory extends AbstractDataOneRepoFactory { + + /** + * + */ + public DummyRepoServiceFactory() { + // TODO Auto-generated constructor stub + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.reposervice.AbstractDataOneRepoFactory#instance( + * org.irods.jargon.dataone.configuration.PublicationContext, + * org.irods.jargon.core.connection.IRODSAccount) + */ + @Override + public DataOneRepoAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { + return new DummyRepoServiceImpl(irodsAccount, publicationContext); + } + +} From 027aa4072c160627770129de85659b93d5ec603b Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 18 May 2017 15:27:10 -0400 Subject: [PATCH 40/88] #3 factory methods for create --- .../configuration/PluginDiscoveryService.java | 141 +++++++++++------- .../jargon/dataone/utils/RestVersion.java | 2 +- .../PluginDiscoveryServiceTest.java | 62 -------- .../dataone/repo/dfc/DfcRepoServiceImpl.java | 4 +- .../impl/dummy/DummyEventServiceFactory.java | 4 +- .../impl/dummy/DummyRepoServiceFactory.java | 4 +- .../repo/impl/dummy/DummyRepoServiceImpl.java | 4 +- .../AbstractDataOneEventServiceFactory.java | 2 +- .../events/AbstractEventServiceAO.java | 2 +- ...viceAO.java => DataOneEventServiceAO.java} | 2 +- .../events/DataOneEventServiceFactory.java | 19 +++ .../dataone/events/EventServiceFactory.java | 16 -- .../pidservice/AbstractDataOnePidFactory.java | 13 +- .../pidservice/DataOnePidServiceFactory.java | 19 +++ .../AbstractDataOneRepoFactory.java | 15 +- ...java => AbstractDataOneRepoServiceAO.java} | 4 +- ...eRepoAO.java => DataOneRepoServiceAO.java} | 2 +- .../DataOneRepoServiceFactory.java | 19 +++ 18 files changed, 169 insertions(+), 165 deletions(-) delete mode 100644 dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java rename event-service-api/src/main/java/org/irods/jargon/dataone/events/{EventServiceAO.java => DataOneEventServiceAO.java} (96%) create mode 100644 event-service-api/src/main/java/org/irods/jargon/dataone/events/DataOneEventServiceFactory.java delete mode 100644 event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceFactory.java create mode 100644 pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataOnePidServiceFactory.java rename repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/{AbstractDataOneRepoAO.java => AbstractDataOneRepoServiceAO.java} (88%) rename repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/{DataOneRepoAO.java => DataOneRepoServiceAO.java} (96%) create mode 100644 repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceFactory.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java index 4e2705d..8176e72 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java @@ -13,9 +13,17 @@ import java.util.List; import java.util.Set; -import org.irods.jargon.dataone.events.AbstractEventServiceAO; -import org.irods.jargon.dataone.events.EventServiceAO; -import org.irods.jargon.pid.pidservice.AbstractUniqueIdAO; +import javax.annotation.PostConstruct; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.events.AbstractDataOneEventServiceFactory; +import org.irods.jargon.dataone.events.DataOneEventServiceAO; +import org.irods.jargon.dataone.events.DataOneEventServiceFactory; +import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoFactory; +import org.irods.jargon.dataone.reposervice.DataOneRepoServiceAO; +import org.irods.jargon.dataone.reposervice.DataOneRepoServiceFactory; +import org.irods.jargon.pid.pidservice.AbstractDataOnePidFactory; +import org.irods.jargon.pid.pidservice.DataOnePidServiceFactory; import org.irods.jargon.pid.pidservice.UniqueIdAO; import org.reflections.Reflections; import org.reflections.scanners.SubTypesScanner; @@ -40,62 +48,44 @@ public class PluginDiscoveryService { private JarClassLoader jcl; - private List urls = new ArrayList(); + private List urls = new ArrayList<>(); @Autowired private PublicationContext publicationContext; - public static final Logger log = LoggerFactory - .getLogger(PluginDiscoveryService.class); + private DataOneEventServiceFactory dataOneEventServiceFactory; + private DataOnePidServiceFactory dataOnePidServiceFactory; + private DataOneRepoServiceFactory dataOneRepoServiceFactory; + + public static final Logger log = LoggerFactory.getLogger(PluginDiscoveryService.class); public PluginDiscoveryService() { } - public EventServiceAO instanceEventService() throws PluginNotFoundException { + public DataOneEventServiceAO instanceEventService(IRODSAccount irodsAccount) throws PluginNotFoundException { log.info("instanceEventService()"); - Class clazz = loadImplClass(AbstractEventServiceAO.class); - try { - Constructor ctor = clazz - .getConstructor(PublicationContext.class); - return (EventServiceAO) ctor - .newInstance(new Object[] { publicationContext }); - } catch (NoSuchMethodException | SecurityException - | InstantiationException | IllegalAccessException - | IllegalArgumentException | InvocationTargetException e) { - log.error("cannot find appropriate plugin", e); - throw new PluginNotFoundException(e); - } + return dataOneEventServiceFactory.instance(getPublicationContext(), irodsAccount); } - public UniqueIdAO instanceUniqueIdService() throws PluginNotFoundException { + public UniqueIdAO instanceUniqueIdService(IRODSAccount irodsAccount) throws PluginNotFoundException { log.info("instancePidService()"); - Class clazz = loadImplClass(AbstractUniqueIdAO.class); - try { - Constructor ctor = clazz - .getConstructor(PublicationContext.class); - return (UniqueIdAO) ctor - .newInstance(new Object[] { publicationContext }); - } catch (NoSuchMethodException | SecurityException - | InstantiationException | IllegalAccessException - | IllegalArgumentException | InvocationTargetException e) { - log.error("cannot find appropriate plugin", e); - throw new PluginNotFoundException(e); - } + return dataOnePidServiceFactory.instance(getPublicationContext(), irodsAccount); + } + + public DataOneRepoServiceAO instanceRepoService(IRODSAccount irodsAccount) throws PluginNotFoundException { + log.info("instancePidService()"); + return dataOneRepoServiceFactory.instance(getPublicationContext(), irodsAccount); } @SuppressWarnings("unchecked") - private final Class loadImplClass(Class clazz) - throws PluginNotFoundException { + private final Class loadImplClass(Class clazz) throws PluginNotFoundException { /* * see: https://github.com/ronmamo/reflections */ ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); - configurationBuilder - .setUrls(urls) - .addClassLoader(JclContext.get()) - .addScanners(new SubTypesScanner(), - new TypeAnnotationsScanner()); + configurationBuilder.setUrls(urls).addClassLoader(JclContext.get()).addScanners(new SubTypesScanner(), + new TypeAnnotationsScanner()); Reflections reflections = new Reflections(configurationBuilder); Set mechanisms = reflections.getSubTypesOf(clazz); @@ -105,8 +95,7 @@ private final Class loadImplClass(Class clazz) log.info("mechanisms:{}", mechanisms); if (mechanisms.isEmpty()) { - throw new PluginNotFoundException("no plugin found for class:" - + clazz.getName()); + throw new PluginNotFoundException("no plugin found for class:" + clazz.getName()); } return (Class) mechanisms.iterator().next(); @@ -116,26 +105,72 @@ private final Class loadImplClass(Class clazz) /** * Initialize publisher based on (required) configuration * + * @throws PluginNotFoundException + * * @throws PublicationException */ - public void init() { + + @PostConstruct + public void init() throws PluginNotFoundException { log.info("init()"); if (publicationContext == null) { - throw new PluginRuntimeException( - "init() cannot be called, no provided publicationContext"); + throw new PluginRuntimeException("init() cannot be called, no provided publicationContext"); } if (publicationContext.getRestConfiguration().getPluginJarLocation() == null - || publicationContext.getRestConfiguration() - .getPluginJarLocation().isEmpty()) { - throw new PluginRuntimeException( - "no jar file plugin directory specified"); + || publicationContext.getRestConfiguration().getPluginJarLocation().isEmpty()) { + throw new PluginRuntimeException("no jar file plugin directory specified"); + } + + log.info("scanning for plugin jars at:{}", publicationContext.getRestConfiguration().getPluginJarLocation()); + loadCandidateClasspaths(publicationContext.getRestConfiguration().getPluginJarLocation()); + initializeFactories(); + + } + + /** + * Look up and instantiate service factories, part of the startup process + */ + private void initializeFactories() throws PluginNotFoundException { + log.info("initializeFactories()"); + + log.info("pid factory..."); + Class clazz = loadImplClass(AbstractDataOnePidFactory.class); + try { + Constructor ctor = clazz.getConstructor(); + dataOnePidServiceFactory = (DataOnePidServiceFactory) ctor.newInstance(new Object[] {}); + log.info("dataOnePidServiceFactory success"); + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + log.error("cannot find appropriate plugin", e); + throw new PluginNotFoundException(e); + } + + log.info("event factory..."); + Class clazzEvent = loadImplClass(AbstractDataOneEventServiceFactory.class); + try { + Constructor ctor = clazzEvent.getConstructor(); + dataOneEventServiceFactory = (DataOneEventServiceFactory) ctor.newInstance(new Object[] {}); + log.info("dataOneEventServiceFactory success"); + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + log.error("cannot find appropriate plugin", e); + throw new PluginNotFoundException(e); + } + + log.info("repo factory..."); + Class clazzRepo = loadImplClass(AbstractDataOneRepoFactory.class); + try { + Constructor ctor = clazzRepo.getConstructor(); + dataOneRepoServiceFactory = (DataOneRepoServiceFactory) ctor.newInstance(new Object[] {}); + log.info("dataOneRepoServiceFactory success"); + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + log.error("cannot find appropriate plugin", e); + throw new PluginNotFoundException(e); } - log.info("scanning for plugin jars at:{}", publicationContext - .getRestConfiguration().getPluginJarLocation()); - loadCandidateClasspaths(publicationContext.getRestConfiguration() - .getPluginJarLocation()); + log.info("plugin factories loaded"); } @@ -147,7 +182,7 @@ private void loadCandidateClasspaths(String libDir) { File dependencyDirectory = new File(libDir); File[] files = dependencyDirectory.listFiles(); - ArrayList uris = new ArrayList(); + ArrayList uris = new ArrayList<>(); for (int i = 0; i < files.length; i++) { if (files[i].getName().endsWith(".jar")) { log.info("adding jar:{} to candidates", files[i]); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 164daa6..6e0394a 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-05-18T16:50:35Z"; + public static String BUILD_TIME="2017-05-18T19:26:27Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java deleted file mode 100644 index 6d2ef1f..0000000 --- a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.irods.jargon.dataone.configuration; - -import java.util.Properties; - -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; -import org.irods.jargon.dataone.events.EventServiceAO; -import org.irods.jargon.dataone.utils.DataOneTestHelper; -import org.irods.jargon.pid.pidservice.UniqueIdAO; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.mockito.Mockito; - -public class PluginDiscoveryServiceTest { - - private static DataOneTestHelper dataOneTestHelper; - private static Properties dataOneProperties; - - @BeforeClass - public static void before() throws Exception { - dataOneTestHelper = new DataOneTestHelper(); - dataOneProperties = dataOneTestHelper.getTestProperties(); - } - - @Test - public void testInstanceEventService() throws Exception { - IRODSAccessObjectFactory aof = Mockito - .mock(IRODSAccessObjectFactory.class); - PublicationContext publicationContext = new PublicationContext(); - RestConfiguration restConfiguration = new RestConfiguration(); - restConfiguration.setPluginJarLocation(dataOneTestHelper - .getPluginJarLocation(dataOneProperties)); - publicationContext.setRestConfiguration(restConfiguration); - publicationContext.setIrodsAccessObjectFactory(aof); - PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); - pluginDiscoveryService.setPublicationContext(publicationContext); - pluginDiscoveryService.init(); - - EventServiceAO eventServiceAO = pluginDiscoveryService - .instanceEventService(); - Assert.assertNotNull("no eventServiceAO", eventServiceAO); - } - - @Test - public void testInstanceUniqueIdService() throws Exception { - IRODSAccessObjectFactory aof = Mockito - .mock(IRODSAccessObjectFactory.class); - PublicationContext publicationContext = new PublicationContext(); - RestConfiguration restConfiguration = new RestConfiguration(); - restConfiguration.setPluginJarLocation(dataOneTestHelper - .getPluginJarLocation(dataOneProperties)); - publicationContext.setRestConfiguration(restConfiguration); - publicationContext.setIrodsAccessObjectFactory(aof); - PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); - pluginDiscoveryService.setPublicationContext(publicationContext); - pluginDiscoveryService.init(); - - UniqueIdAO uniqueIdAO = pluginDiscoveryService - .instanceUniqueIdService(); - Assert.assertNotNull("no uniqueIdAO", uniqueIdAO); - } -} diff --git a/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java b/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java index 7be47df..c3b5f03 100644 --- a/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java +++ b/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java @@ -14,7 +14,7 @@ import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.query.JargonQueryException; import org.irods.jargon.dataone.configuration.PublicationContext; -import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoAO; +import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoServiceAO; import org.irods.jargon.dataone.reposervice.DataObjectListResponse; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.slf4j.Logger; @@ -24,7 +24,7 @@ * @author mcc * */ -public class DfcRepoServiceImpl extends AbstractDataOneRepoAO { +public class DfcRepoServiceImpl extends AbstractDataOneRepoServiceAO { public DfcRepoServiceImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { super(irodsAccount, publicationContext); diff --git a/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceFactory.java b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceFactory.java index fbadb58..c439eaa 100644 --- a/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceFactory.java +++ b/dummy-event-service-impl/src/main/java/org/irods/jargon/dataone/events/impl/dummy/DummyEventServiceFactory.java @@ -6,7 +6,7 @@ import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.events.AbstractDataOneEventServiceFactory; -import org.irods.jargon.dataone.events.EventServiceAO; +import org.irods.jargon.dataone.events.DataOneEventServiceAO; /** * @author mcc @@ -28,7 +28,7 @@ public DummyEventServiceFactory() { * org.irods.jargon.core.connection.IRODSAccount) */ @Override - public EventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { + public DataOneEventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { return new DummyEventServiceAOImpl(irodsAccount, publicationContext); } diff --git a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceFactory.java b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceFactory.java index 84bcef2..bc9a807 100644 --- a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceFactory.java +++ b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceFactory.java @@ -6,7 +6,7 @@ import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoFactory; -import org.irods.jargon.dataone.reposervice.DataOneRepoAO; +import org.irods.jargon.dataone.reposervice.DataOneRepoServiceAO; /** * @author mcc @@ -30,7 +30,7 @@ public DummyRepoServiceFactory() { * org.irods.jargon.core.connection.IRODSAccount) */ @Override - public DataOneRepoAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { + public DataOneRepoServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { return new DummyRepoServiceImpl(irodsAccount, publicationContext); } diff --git a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java index 4fec540..406a0ab 100644 --- a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java +++ b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java @@ -11,14 +11,14 @@ import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.dataone.configuration.PublicationContext; -import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoAO; +import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoServiceAO; import org.irods.jargon.dataone.reposervice.DataObjectListResponse; /** * @author mcc * */ -public class DummyRepoServiceImpl extends AbstractDataOneRepoAO { +public class DummyRepoServiceImpl extends AbstractDataOneRepoServiceAO { public DummyRepoServiceImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { super(irodsAccount, publicationContext); diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java index 5acb0f5..d9fe0ad 100644 --- a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java @@ -23,6 +23,6 @@ public abstract class AbstractDataOneEventServiceFactory { * {@link IRODSAccount} associated with the instance * @return */ - public abstract EventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); + public abstract DataOneEventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); } diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java index abfe620..27d18af 100644 --- a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractEventServiceAO.java @@ -22,7 +22,7 @@ * @author mconway * */ -public abstract class AbstractEventServiceAO extends AbstractDataOnePlugin implements EventServiceAO { +public abstract class AbstractEventServiceAO extends AbstractDataOnePlugin implements DataOneEventServiceAO { /** * Default constructor with required values diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceAO.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/DataOneEventServiceAO.java similarity index 96% rename from event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceAO.java rename to event-service-api/src/main/java/org/irods/jargon/dataone/events/DataOneEventServiceAO.java index d9b1977..0f24fe9 100644 --- a/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceAO.java +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/DataOneEventServiceAO.java @@ -15,7 +15,7 @@ * @author mconway * */ -public interface EventServiceAO { +public interface DataOneEventServiceAO { /** * Retrieve logs from the event registry given the parameters diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/DataOneEventServiceFactory.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/DataOneEventServiceFactory.java new file mode 100644 index 0000000..db9134f --- /dev/null +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/DataOneEventServiceFactory.java @@ -0,0 +1,19 @@ +/** + * + */ +package org.irods.jargon.dataone.events; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; + +/** + * Factory interface that will discover and create the event service + * + * @author mconway + * + */ +public interface DataOneEventServiceFactory { + + public DataOneEventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); + +} diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceFactory.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceFactory.java deleted file mode 100644 index 8ac9a63..0000000 --- a/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventServiceFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -/** - * - */ -package org.irods.jargon.dataone.events; - -/** - * Factory interface that will discover and create the event service - * - * @author mconway - * - */ -public interface EventServiceFactory { - - // EventService instance(DataOneContext dataOneContext); - -} diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractDataOnePidFactory.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractDataOnePidFactory.java index 09f16ad..3177507 100644 --- a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractDataOnePidFactory.java +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/AbstractDataOnePidFactory.java @@ -12,17 +12,12 @@ * @author mcc * */ -public abstract class AbstractDataOnePidFactory { +public abstract class AbstractDataOnePidFactory implements DataOnePidServiceFactory { - /** - * Create an instance of the pid service - * - * @param publicationContext - * {@link PublicationContext} with configuration information - * @param irodsAccount - * {@link IRODSAccount} associated with the instance - * @return + /* (non-Javadoc) + * @see org.irods.jargon.pid.pidservice.DataOnePidFactory#instance(org.irods.jargon.dataone.configuration.PublicationContext, org.irods.jargon.core.connection.IRODSAccount) */ + @Override public abstract UniqueIdAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); } diff --git a/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataOnePidServiceFactory.java b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataOnePidServiceFactory.java new file mode 100644 index 0000000..5889fe3 --- /dev/null +++ b/pid-service-api/src/main/java/org/irods/jargon/pid/pidservice/DataOnePidServiceFactory.java @@ -0,0 +1,19 @@ +package org.irods.jargon.pid.pidservice; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; + +public interface DataOnePidServiceFactory { + + /** + * Create an instance of the pid service + * + * @param publicationContext + * {@link PublicationContext} with configuration information + * @param irodsAccount + * {@link IRODSAccount} associated with the instance + * @return + */ + UniqueIdAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); + +} \ No newline at end of file diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoFactory.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoFactory.java index 59da33e..027dd9c 100644 --- a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoFactory.java +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoFactory.java @@ -12,17 +12,12 @@ * @author mcc * */ -public abstract class AbstractDataOneRepoFactory { +public abstract class AbstractDataOneRepoFactory implements DataOneRepoServiceFactory { - /** - * Create an instance of the pid service - * - * @param publicationContext - * {@link PublicationContext} with configuration information - * @param irodsAccount - * {@link IRODSAccount} associated with the instance - * @return + /* (non-Javadoc) + * @see org.irods.jargon.dataone.reposervice.DataOneRepoFactory#instance(org.irods.jargon.dataone.configuration.PublicationContext, org.irods.jargon.core.connection.IRODSAccount) */ - public abstract DataOneRepoAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); + @Override + public abstract DataOneRepoServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); } diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoServiceAO.java similarity index 88% rename from repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java rename to repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoServiceAO.java index c2cd881..d2974bd 100644 --- a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoAO.java +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoServiceAO.java @@ -20,7 +20,7 @@ * @author mconway * */ -public abstract class AbstractDataOneRepoAO extends AbstractDataOnePlugin implements DataOneRepoAO { +public abstract class AbstractDataOneRepoServiceAO extends AbstractDataOnePlugin implements DataOneRepoServiceAO { /** * Default constructor with required values @@ -31,7 +31,7 @@ public abstract class AbstractDataOneRepoAO extends AbstractDataOnePlugin implem * {@link PublicationContext} with configuration and other * information */ - public AbstractDataOneRepoAO(IRODSAccount irodsAccount, PublicationContext publicationContext) { + public AbstractDataOneRepoServiceAO(IRODSAccount irodsAccount, PublicationContext publicationContext) { super(irodsAccount, publicationContext); } diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoAO.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceAO.java similarity index 96% rename from repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoAO.java rename to repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceAO.java index bce15be..c4e82a6 100644 --- a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoAO.java +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceAO.java @@ -14,7 +14,7 @@ * @author mconway * */ -public interface DataOneRepoAO { +public interface DataOneRepoServiceAO { /** * Returns a complete list of Unique Identifiers that are associated with diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceFactory.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceFactory.java new file mode 100644 index 0000000..8d56f5c --- /dev/null +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceFactory.java @@ -0,0 +1,19 @@ +package org.irods.jargon.dataone.reposervice; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; + +public interface DataOneRepoServiceFactory { + + /** + * Create an instance of the pid service + * + * @param publicationContext + * {@link PublicationContext} with configuration information + * @param irodsAccount + * {@link IRODSAccount} associated with the instance + * @return + */ + DataOneRepoServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); + +} \ No newline at end of file From 4dcafff8a14584faa26b905ee9994314c881e15f Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 18 May 2017 16:24:44 -0400 Subject: [PATCH 41/88] #3 successful factory load tests for all plugins --- .../configuration/PluginDiscoveryService.java | 45 ++++++++++ .../jargon/dataone/utils/RestVersion.java | 2 +- .../PluginDiscoveryServiceTest.java | 80 ++++++++++++++++++ ...my-event-service-impl-4.2.1.0-SNAPSHOT.jar | Bin 0 -> 4870 bytes ...ummy-pid-service-impl-4.2.1.0-SNAPSHOT.jar | Bin 0 -> 4860 bytes ...mmy-repo-service-impl-4.2.1.0-SNAPSHOT.jar | Bin 0 -> 4554 bytes .../AbstractDataOneEventServiceFactory.java | 3 +- 7 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java create mode 100644 dataone-node/src/test/resources/dummyjars/dummy-event-service-impl-4.2.1.0-SNAPSHOT.jar create mode 100644 dataone-node/src/test/resources/dummyjars/dummy-pid-service-impl-4.2.1.0-SNAPSHOT.jar create mode 100644 dataone-node/src/test/resources/dummyjars/dummy-repo-service-impl-4.2.1.0-SNAPSHOT.jar diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java index 8176e72..63f0f24 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java @@ -226,4 +226,49 @@ public void setPublicationContext(PublicationContext publicationContext) { this.publicationContext = publicationContext; } + /** + * @return the dataOneEventServiceFactory + */ + DataOneEventServiceFactory getDataOneEventServiceFactory() { + return dataOneEventServiceFactory; + } + + /** + * @param dataOneEventServiceFactory + * the dataOneEventServiceFactory to set + */ + void setDataOneEventServiceFactory(DataOneEventServiceFactory dataOneEventServiceFactory) { + this.dataOneEventServiceFactory = dataOneEventServiceFactory; + } + + /** + * @return the dataOnePidServiceFactory + */ + DataOnePidServiceFactory getDataOnePidServiceFactory() { + return dataOnePidServiceFactory; + } + + /** + * @param dataOnePidServiceFactory + * the dataOnePidServiceFactory to set + */ + void setDataOnePidServiceFactory(DataOnePidServiceFactory dataOnePidServiceFactory) { + this.dataOnePidServiceFactory = dataOnePidServiceFactory; + } + + /** + * @return the dataOneRepoServiceFactory + */ + DataOneRepoServiceFactory getDataOneRepoServiceFactory() { + return dataOneRepoServiceFactory; + } + + /** + * @param dataOneRepoServiceFactory + * the dataOneRepoServiceFactory to set + */ + void setDataOneRepoServiceFactory(DataOneRepoServiceFactory dataOneRepoServiceFactory) { + this.dataOneRepoServiceFactory = dataOneRepoServiceFactory; + } + } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 6e0394a..2e50a92 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-05-18T19:26:27Z"; + public static String BUILD_TIME="2017-05-18T20:14:19Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java new file mode 100644 index 0000000..0c30692 --- /dev/null +++ b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java @@ -0,0 +1,80 @@ +package org.irods.jargon.dataone.configuration; + +import java.io.File; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.core.utils.LocalFileUtils; +import org.irods.jargon.dataone.events.DataOneEventServiceAO; +import org.irods.jargon.dataone.reposervice.DataOneRepoServiceAO; +import org.irods.jargon.pid.pidservice.UniqueIdAO; +import org.junit.Assert; +import org.junit.Test; + +public class PluginDiscoveryServiceTest { + + @Test + public void testInit() throws Exception { + PublicationContext publicationContext = new PublicationContext(); + File rescFile = LocalFileUtils.getClasspathResourceAsFile("/dummyjars"); + Assert.assertNotNull("no file path", rescFile); + RestConfiguration restConfiguration = new RestConfiguration(); + restConfiguration.setPluginJarLocation(rescFile.getAbsolutePath()); + publicationContext.setRestConfiguration(restConfiguration); + PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); + pluginDiscoveryService.setPublicationContext(publicationContext); + pluginDiscoveryService.init(); + Assert.assertNotNull("no pid factory", pluginDiscoveryService.getDataOnePidServiceFactory()); + Assert.assertNotNull("no event factory", pluginDiscoveryService.getDataOneEventServiceFactory()); + Assert.assertNotNull("no repo factory", pluginDiscoveryService.getDataOneRepoServiceFactory()); + + } + + @Test + public void testInstanceEventService() throws Exception { + IRODSAccount dummyAccount = new IRODSAccount("xxx", 1247, "xxx", "xxx", "xxx", "xxx", "xxx"); + PublicationContext publicationContext = new PublicationContext(); + File rescFile = LocalFileUtils.getClasspathResourceAsFile("/dummyjars"); + Assert.assertNotNull("no file path", rescFile); + RestConfiguration restConfiguration = new RestConfiguration(); + restConfiguration.setPluginJarLocation(rescFile.getAbsolutePath()); + publicationContext.setRestConfiguration(restConfiguration); + PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); + pluginDiscoveryService.setPublicationContext(publicationContext); + pluginDiscoveryService.init(); + DataOneEventServiceAO actual = pluginDiscoveryService.instanceEventService(dummyAccount); + Assert.assertNotNull("no impl created", actual); + } + + @Test + public void testInstanceUniqueIdService() throws Exception { + IRODSAccount dummyAccount = new IRODSAccount("xxx", 1247, "xxx", "xxx", "xxx", "xxx", "xxx"); + PublicationContext publicationContext = new PublicationContext(); + File rescFile = LocalFileUtils.getClasspathResourceAsFile("/dummyjars"); + Assert.assertNotNull("no file path", rescFile); + RestConfiguration restConfiguration = new RestConfiguration(); + restConfiguration.setPluginJarLocation(rescFile.getAbsolutePath()); + publicationContext.setRestConfiguration(restConfiguration); + PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); + pluginDiscoveryService.setPublicationContext(publicationContext); + pluginDiscoveryService.init(); + UniqueIdAO actual = pluginDiscoveryService.instanceUniqueIdService(dummyAccount); + Assert.assertNotNull("no impl created", actual); + } + + @Test + public void testInstanceRepoService() throws Exception { + IRODSAccount dummyAccount = new IRODSAccount("xxx", 1247, "xxx", "xxx", "xxx", "xxx", "xxx"); + PublicationContext publicationContext = new PublicationContext(); + File rescFile = LocalFileUtils.getClasspathResourceAsFile("/dummyjars"); + Assert.assertNotNull("no file path", rescFile); + RestConfiguration restConfiguration = new RestConfiguration(); + restConfiguration.setPluginJarLocation(rescFile.getAbsolutePath()); + publicationContext.setRestConfiguration(restConfiguration); + PluginDiscoveryService pluginDiscoveryService = new PluginDiscoveryService(); + pluginDiscoveryService.setPublicationContext(publicationContext); + pluginDiscoveryService.init(); + DataOneRepoServiceAO actual = pluginDiscoveryService.instanceRepoService(dummyAccount); + Assert.assertNotNull("no impl created", actual); + } + +} diff --git a/dataone-node/src/test/resources/dummyjars/dummy-event-service-impl-4.2.1.0-SNAPSHOT.jar b/dataone-node/src/test/resources/dummyjars/dummy-event-service-impl-4.2.1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..82092eee1e3964a935d3a9757f14891ec079979b GIT binary patch literal 4870 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 Bt!w}Q literal 0 HcmV?d00001 diff --git a/dataone-node/src/test/resources/dummyjars/dummy-repo-service-impl-4.2.1.0-SNAPSHOT.jar b/dataone-node/src/test/resources/dummyjars/dummy-repo-service-impl-4.2.1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..6e124a3dbfade4f57adc883bca570b7a1fd1047a GIT binary patch literal 4554 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 S#{vQg1D_P25F`ZIzy1b$>l@hs literal 0 HcmV?d00001 diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java index d9fe0ad..170e758 100644 --- a/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/AbstractDataOneEventServiceFactory.java @@ -12,7 +12,7 @@ * @author mcc * */ -public abstract class AbstractDataOneEventServiceFactory { +public abstract class AbstractDataOneEventServiceFactory implements DataOneEventServiceFactory { /** * Create an instance of the pid service @@ -23,6 +23,7 @@ public abstract class AbstractDataOneEventServiceFactory { * {@link IRODSAccount} associated with the instance * @return */ + @Override public abstract DataOneEventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount); } From 746ae6905d0cf90ecccc861ad0a605e088acbb07 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 19 May 2017 10:51:11 -0400 Subject: [PATCH 42/88] #3 temp break build, substituting plugin calls in impl services --- .../jargon/dataone/MemberNodeService.java | 166 +++++++----------- .../jargon/dataone/tier1/MNCoreImpl.java | 97 +++++----- .../jargon/dataone/tier1/MNReadImpl.java | 163 +++++++++-------- .../jargon/dataone/factory/package-info.java | 8 - 4 files changed, 188 insertions(+), 246 deletions(-) delete mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/factory/package-info.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java index b13a086..ef17b29 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java @@ -12,7 +12,6 @@ import java.util.Map; import java.util.TimeZone; -import javax.inject.Inject; import javax.inject.Named; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.Consumes; @@ -48,6 +47,7 @@ import org.dataone.service.types.v1.ObjectList; import org.dataone.service.types.v1.SystemMetadata; import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.dataone.configuration.PluginDiscoveryService; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.domain.MNChecksum; import org.irods.jargon.dataone.domain.MNError; @@ -64,6 +64,7 @@ import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; /** * User: Lisa Stillwell - RENCI, UNC @ Chapel Hill Date: 10/4/13 Time: 2:22 PM @@ -75,8 +76,10 @@ public class MemberNodeService { private Logger logger = LoggerFactory.getLogger(this.getClass()); - @Inject - PublicationContext publicationContext; + @Autowired + private PublicationContext publicationContext; + @Autowired + private PluginDiscoveryService pluginDiscoveryService; @GET @Path("/monitor/ping") @@ -84,26 +87,16 @@ public class MemberNodeService { @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) // public Response handlePing(@HeaderParam("Authorization") final String // authorization) - public Response handlePing() throws NotImplemented, ServiceFailure, - InsufficientResources, JargonException { - - // if (authorization == null || authorization.isEmpty()) { - // throw new IllegalArgumentException("null or empty authorization"); - // } + public Response handlePing() throws NotImplemented, ServiceFailure, InsufficientResources, JargonException { if (publicationContext == null) { throw new IllegalArgumentException("null publicationContext"); } - // MNCoreImpl mnCoreImpl = new MNCoreImpl(irodsAccessObjectFactory, - // restConfiguration, authorization); - MNCoreImpl mnCoreImpl = new MNCoreImpl( - publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNCoreImpl mnCoreImpl = new MNCoreImpl(publicationContext, pluginDiscoveryService); Date irodsDate = mnCoreImpl.ping(); - SimpleDateFormat df = new SimpleDateFormat( - "EEE, dd MMM yyyy HH:mm:ss zzz"); + SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz"); String dateStr = df.format(irodsDate); Response.ResponseBuilder builder = Response.ok(); @@ -122,9 +115,7 @@ public MNNode handleGetCapabilities() throws NotImplemented, ServiceFailure { MNNode nodeCapabilities = new MNNode(); - MNCoreImpl mnCoreImpl = new MNCoreImpl( - publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNCoreImpl mnCoreImpl = new MNCoreImpl(publicationContext, pluginDiscoveryService); Node node = mnCoreImpl.getCapabilities(); nodeCapabilities.copy(node); @@ -136,8 +127,7 @@ public MNNode handleGetCapabilities() throws NotImplemented, ServiceFailure { @Path("/") @Produces(MediaType.TEXT_XML) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public MNNode handleDefaultGetCapabilities() throws NotImplemented, - ServiceFailure { + public MNNode handleDefaultGetCapabilities() throws NotImplemented, ServiceFailure { MNNode nodeCapabilities = handleGetCapabilities(); @@ -149,24 +139,17 @@ public MNNode handleDefaultGetCapabilities() throws NotImplemented, @Path("/log") @Produces(MediaType.TEXT_XML) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public MNLog handleGetLogRecords( - @QueryParam("fromDate") final String fromDateStr, - @QueryParam("toDate") final String toDateStr, - @QueryParam("event") final String event, - @QueryParam("pidFilter") final String pidFilter, - @DefaultValue("0") @QueryParam("start") final int start, + public MNLog handleGetLogRecords(@QueryParam("fromDate") final String fromDateStr, + @QueryParam("toDate") final String toDateStr, @QueryParam("event") final String event, + @QueryParam("pidFilter") final String pidFilter, @DefaultValue("0") @QueryParam("start") final int start, @DefaultValue("500") @QueryParam("count") final int count) - throws NotImplemented, ServiceFailure, NotAuthorized, - InvalidRequest, InvalidToken { + throws NotImplemented, ServiceFailure, NotAuthorized, InvalidRequest, InvalidToken { - logger.info("/log request: fromData={} toDate={}", fromDateStr, - toDateStr); + logger.info("/log request: fromData={} toDate={}", fromDateStr, toDateStr); logger.info("/log request: event={} pidFilter={}", event, pidFilter); logger.info("/log request: start={} count={}", start, count); - MNCoreImpl mnCoreImpl = new MNCoreImpl( - publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MMNCoreImpl mnCoreImpl = new MNCoreImpl(publicationContext, pluginDiscoveryService); // parse date strings Date fromDate = null; @@ -185,8 +168,7 @@ public MNLog handleGetLogRecords( Event e = Event.convert(event); - Log log = mnCoreImpl.getLogRecords(fromDate, toDate, e, pidFilter, - start, count); + Log log = mnCoreImpl.getLogRecords(fromDate, toDate, e, pidFilter, start, count); logger.info("returned log={}", log.toString()); // set Log attributes in MNLog @@ -199,13 +181,10 @@ public MNLog handleGetLogRecords( @GET @Path("/object/{id}") @Produces(MediaType.APPLICATION_OCTET_STREAM) - public void handleRead(@PathParam("id") final String pid, - @Context final HttpServletResponse response) throws InvalidToken, - ServiceFailure, NotAuthorized, NotFound, NotImplemented, - InsufficientResources { + public void handleRead(@PathParam("id") final String pid, @Context final HttpServletResponse response) + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented, InsufficientResources { - MNReadImpl mnReadImpl = new MNReadImpl( - publicationContext.getIrodsAccessObjectFactory(), + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), publicationContext.getRestConfiguration()); Identifier id = new Identifier(); @@ -229,24 +208,20 @@ public void handleRead(@PathParam("id") final String pid, @GET @Path("/checksum/{id}") @Produces(MediaType.TEXT_XML) - public MNChecksum handleGetChecksum( - @PathParam("id") final String pid, + public MNChecksum handleGetChecksum(@PathParam("id") final String pid, @DefaultValue("MD5") @QueryParam("checksumAlgorithm") final String algorithm) - throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, - NotImplemented, InvalidRequest { + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented, InvalidRequest { MNChecksum mnChecksum = new MNChecksum(); if (!algorithm.toUpperCase().equals("MD5")) { - throw new InvalidRequest("1402", - "invalid checksum algorithm requested - only MD5 supported"); + throw new InvalidRequest("1402", "invalid checksum algorithm requested - only MD5 supported"); } Identifier id = new Identifier(); id.setValue(pid); - MNReadImpl mnReadImpl = new MNReadImpl( - publicationContext.getIrodsAccessObjectFactory(), + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), publicationContext.getRestConfiguration()); Checksum checksum = mnReadImpl.getChecksum(id, algorithm); @@ -258,13 +233,10 @@ public MNChecksum handleGetChecksum( @GET @Path("/replica/{id}") @Produces(MediaType.APPLICATION_OCTET_STREAM) - public void handleReplica(@PathParam("id") final String pid, - @Context final HttpServletResponse response) throws InvalidToken, - ServiceFailure, NotAuthorized, NotFound, NotImplemented, - InsufficientResources { + public void handleReplica(@PathParam("id") final String pid, @Context final HttpServletResponse response) + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented, InsufficientResources { - MNReadImpl mnReadImpl = new MNReadImpl( - publicationContext.getIrodsAccessObjectFactory(), + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), publicationContext.getRestConfiguration()); Identifier id = new Identifier(); @@ -291,19 +263,16 @@ public void handleReplica(@PathParam("id") final String pid, @GET @Path("/meta/{id}") @Produces(MediaType.TEXT_XML) - public MNSystemMetadata handleGetSystemMetadata( - @PathParam("id") final String pid) + public MNSystemMetadata handleGetSystemMetadata(@PathParam("id") final String pid) // @Context final HttpServletResponse response) - throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, - NotImplemented, InvalidRequest { + throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented, InvalidRequest { MNSystemMetadata mnSystemMetadata = new MNSystemMetadata(); Identifier id = new Identifier(); id.setValue(pid); - MNReadImpl mnReadImpl = new MNReadImpl( - publicationContext.getIrodsAccessObjectFactory(), + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), publicationContext.getRestConfiguration()); SystemMetadata sysMetadata = mnReadImpl.getSystemMetadata(id); @@ -318,16 +287,14 @@ public MNSystemMetadata handleGetSystemMetadata( @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) public Response handleDescribe(@PathParam("id") final String pid) // @Context final HttpServletResponse response) - throws NotAuthorized, NotImplemented, ServiceFailure, NotFound, - InvalidToken { + throws NotAuthorized, NotImplemented, ServiceFailure, NotFound, InvalidToken { Identifier id = new Identifier(); id.setValue(pid); DescribeResponse describeResponse; - MNReadImpl mnReadImpl = new MNReadImpl( - publicationContext.getIrodsAccessObjectFactory(), + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), publicationContext.getRestConfiguration()); try { describeResponse = mnReadImpl.describe(id); @@ -345,12 +312,10 @@ public Response handleDescribe(@PathParam("id") final String pid) } Checksum checksum = describeResponse.getDataONE_Checksum(); - String checksumStr = checksum.getAlgorithm() + "," - + checksum.getValue(); + String checksumStr = checksum.getAlgorithm() + "," + checksum.getValue(); // Convert data to GMT and format for HTTP header - DateFormat gmtFormat = new SimpleDateFormat( - "EEE, dd MMM yyyy HH:mm:ss "); + DateFormat gmtFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss "); TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); gmtFormat.setTimeZone(gmtTimeZone); Calendar calendar = new GregorianCalendar(); @@ -361,14 +326,11 @@ public Response handleDescribe(@PathParam("id") final String pid) Response.ResponseBuilder builder = Response.ok(); builder.header("Last-Modified", dateStr); - builder.header("Content-Length", describeResponse.getContent_Length() - .toString()); + builder.header("Content-Length", describeResponse.getContent_Length().toString()); builder.type(MediaType.APPLICATION_OCTET_STREAM); - builder.header("DataONE-formatId", describeResponse - .getDataONE_ObjectFormatIdentifier().getValue().toString()); + builder.header("DataONE-formatId", describeResponse.getDataONE_ObjectFormatIdentifier().getValue().toString()); builder.header("DataONE-Checksum", checksumStr); - builder.header("DataONE-SerialVersion", describeResponse - .getSerialVersion().toString()); + builder.header("DataONE-SerialVersion", describeResponse.getSerialVersion().toString()); return builder.build(); } @@ -378,41 +340,34 @@ public Response handleDescribe(@PathParam("id") final String pid) @Produces(MediaType.TEXT_XML) @Consumes(MediaType.MULTIPART_FORM_DATA) @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://irods.org/dfc-dataone", jsonName = "dfc-dataone") }) - public Response handleSynchronizationFailed( - final MultipartFormDataInput input) throws NotAuthorized, - NotImplemented, ServiceFailure, InvalidToken { + public Response handleSynchronizationFailed(final MultipartFormDataInput input) + throws NotAuthorized, NotImplemented, ServiceFailure, InvalidToken { Map> uploadForm = input.getFormDataMap(); List inputParts = uploadForm.get("message"); if (inputParts == null || inputParts.size() == 0) { - throw new ServiceFailure("2161", - "Synch Failure Exception cannot parse message"); + throw new ServiceFailure("2161", "Synch Failure Exception cannot parse message"); } String str_xml = null; try { str_xml = inputParts.get(0).getBodyAsString(); } catch (IOException e) { - throw new ServiceFailure("2161", - "Synch Failure Exception cannot extract message xml"); + throw new ServiceFailure("2161", "Synch Failure Exception cannot extract message xml"); } - MNError error = JAXB - .unmarshal(new StringReader(str_xml), MNError.class); + MNError error = JAXB.unmarshal(new StringReader(str_xml), MNError.class); SynchronizationFailed message = error.copyToSynchronizationFailed(); if (message == null) { - throw new ServiceFailure("2161", - "Synch Failure Exception message is null"); + throw new ServiceFailure("2161", "Synch Failure Exception message is null"); } - MNReadImpl mnReadImpl = new MNReadImpl( - publicationContext.getIrodsAccessObjectFactory(), + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), publicationContext.getRestConfiguration()); boolean success = mnReadImpl.synchronizationFailed(message); if (!success) { - throw new ServiceFailure("2161", - "Failed to log Synchronization Failure event"); + throw new ServiceFailure("2161", "Failed to log Synchronization Failure event"); } Response.ResponseBuilder builder = Response.ok(); @@ -425,15 +380,12 @@ public Response handleSynchronizationFailed( @GET @Path("/object") @Produces(MediaType.TEXT_XML) - public MNObjectList handleListObjects( - @QueryParam("fromDate") final String fromDateStr, - @QueryParam("toDate") final String toDateStr, - @QueryParam("formatId") final String formatIdStr, + public MNObjectList handleListObjects(@QueryParam("fromDate") final String fromDateStr, + @QueryParam("toDate") final String toDateStr, @QueryParam("formatId") final String formatIdStr, @QueryParam("replicaStatus") final Boolean replicaStatus, @DefaultValue("0") @QueryParam("start") final Integer start, @DefaultValue("500") @QueryParam("count") final Integer count) - throws InvalidToken, ServiceFailure, NotAuthorized, InvalidRequest, - NotImplemented { + throws InvalidToken, ServiceFailure, NotAuthorized, InvalidRequest, NotImplemented { MNObjectList mnObjectList = new MNObjectList(); @@ -456,13 +408,25 @@ public MNObjectList handleListObjects( throw new InvalidRequest("1540", e.getMessage()); } - MNReadImpl mnReadImpl = new MNReadImpl( - publicationContext.getIrodsAccessObjectFactory(), + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), publicationContext.getRestConfiguration()); - ObjectList objectList = mnReadImpl.listObjects(fromDate, toDate, - formatId, replicaStatus, start, count); + ObjectList objectList = mnReadImpl.listObjects(fromDate, toDate, formatId, replicaStatus, start, count); mnObjectList.copy(objectList); return mnObjectList; } + + /** + * @return the publicationContext + */ + public PublicationContext getPublicationContext() { + return publicationContext; + } + + /** + * @return the pluginDiscoveryService + */ + public PluginDiscoveryService getPluginDiscoveryService() { + return pluginDiscoveryService; + } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java index 232962a..2273338 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNCoreImpl.java @@ -20,10 +20,13 @@ import org.dataone.service.types.v1.Subject; import org.dataone.service.types.v1.Synchronization; import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.pub.EnvironmentalInfoAO; -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.dataone.auth.RestAuthUtils; -import org.irods.jargon.dataone.configuration.RestConfiguration; +import org.irods.jargon.dataone.configuration.PluginDiscoveryService; +import org.irods.jargon.dataone.configuration.PluginNotFoundException; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.events.DataOneEventServiceAO; import org.irods.jargon.dataone.events.EventsEnum; import org.irods.jargon.dataone.utils.PropertiesLoader; import org.slf4j.Logger; @@ -32,29 +35,24 @@ public class MNCoreImpl implements MNCore { private Logger log = LoggerFactory.getLogger(this.getClass()); - private final IRODSAccessObjectFactory irodsAccessObjectFactory; - private final RestConfiguration restConfiguration; - + private final PublicationContext publicationContext; + private final PluginDiscoveryService pluginDiscoveryService; // private final MNCoreModel mnCoreModel; - public MNCoreImpl(final IRODSAccessObjectFactory irodsAccessObjectFactory, - final RestConfiguration restConfiguration) { - - this.irodsAccessObjectFactory = irodsAccessObjectFactory; - this.restConfiguration = restConfiguration; - // this.mnCoreModel = new MNCoreModel(irodsAccessObjectFactory, - // restConfiguration); + public MNCoreImpl(final PublicationContext publicationContext, + final PluginDiscoveryService pluginDiscoveryService) { + this.publicationContext = publicationContext; + this.pluginDiscoveryService = pluginDiscoveryService; } @Override - public Date ping() throws NotImplemented, ServiceFailure, - InsufficientResources { + public Date ping() throws NotImplemented, ServiceFailure, InsufficientResources { try { IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(restConfiguration); + .getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); - EnvironmentalInfoAO environmentalInfoAO = irodsAccessObjectFactory + EnvironmentalInfoAO environmentalInfoAO = publicationContext.getIrodsAccessObjectFactory() .getEnvironmentalInfoAO(irodsAccount); long currentTime = environmentalInfoAO.getIRODSServerCurrentTime(); @@ -64,34 +62,34 @@ public Date ping() throws NotImplemented, ServiceFailure, log.error("ping failed: {}", e.getMessage()); throw new ServiceFailure("2042", "failed to contact iRODS server"); } finally { - irodsAccessObjectFactory.closeSessionAndEatExceptions(); + publicationContext.getIrodsAccessObjectFactory().closeSessionAndEatExceptions(); } } @Override - public Log getLogRecords(final Date fromDate, final Date toDate, - final Event event, final String pidFilter, final Integer startIdx, - final Integer count) throws InvalidRequest, InvalidToken, - NotAuthorized, NotImplemented, ServiceFailure { + public Log getLogRecords(final Date fromDate, final Date toDate, final Event event, final String pidFilter, + final Integer startIdx, final Integer count) + throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { - Log d1log = new Log(); log.info("getLogRecords: elasticsearch implementation"); + EventsEnum eventsEnum = null; if (event != null) { - EventsEnum.valueOfFromDataOne(event); + eventsEnum = EventsEnum.valueOfFromDataOne(event); + } + + try { + IRODSAccount irodsAccount = RestAuthUtils + .getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + DataOneEventServiceAO eventService = pluginDiscoveryService.instanceEventService(irodsAccount); + return eventService.getLogs(fromDate, toDate, eventsEnum, pidFilter, startIdx, count); + } catch (PluginNotFoundException e) { + log.error("error processing event plugin", e); + throw new ServiceFailure("1490", "retrieval of log records failed"); + } catch (JargonException e) { + log.error("error processing event ", e); + throw new ServiceFailure("1490", "retrieval of log records failed"); } - // FIXME: add log stuff - - /* - * - * EventLogAOElasticSearchImpl eventLogAO = new - * EventLogAOElasticSearchImpl(irodsAccessObjectFactory, - * restConfiguration); try { d1log = eventLogAO.getLogs(fromDate, - * toDate, newEvent, pidFilter, startIdx, count); } - * catch(NoNodeAvailableException ex) { throw new ServiceFailure("1490", - * "retrieval of log records failed"); } - */ - return d1log; } @Override @@ -105,9 +103,8 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { try { IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(restConfiguration); - - EnvironmentalInfoAO environmentalInfoAO = irodsAccessObjectFactory + .getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + EnvironmentalInfoAO environmentalInfoAO = publicationContext.getIrodsAccessObjectFactory() .getEnvironmentalInfoAO(irodsAccount); environmentalInfoAO.getIRODSServerProperties().getServerBootTime(); @@ -116,8 +113,6 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { log.error("getCapabilities: iRODS server is not running"); ping.setSuccess(false); node.setState(NodeState.DOWN); - } finally { - irodsAccessObjectFactory.closeSessionAndEatExceptions(); } // get properties @@ -125,14 +120,13 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { String subjectString = new String(); subjectString += pl.getProperty("irods.dataone.subject-string"); String contactSubjectString = new String(); - contactSubjectString += pl - .getProperty("irods.dataone.contact-subject-string"); + contactSubjectString += pl.getProperty("irods.dataone.contact-subject-string"); - List subjects = new ArrayList(); + List subjects = new ArrayList<>(); Subject subject = new Subject(); subject.setValue(subjectString); subjects.add(subject); - List contactSubjects = new ArrayList(); + List contactSubjects = new ArrayList<>(); Subject contactSubject = new Subject(); contactSubject.setValue(contactSubjectString); contactSubjects.add(contactSubject); @@ -142,7 +136,7 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { node.setContactSubjectList(contactSubjects); Synchronization sync = new Synchronization(); - // TODO: put correct dates here + // TODO: put correct dates here, pull from RepoService sync.setLastCompleteHarvest(new Date()); sync.setLastHarvested(new Date()); node.setSynchronization(sync); @@ -153,14 +147,11 @@ public Node getCapabilities() throws NotImplemented, ServiceFailure { } @Override - public Log getLogRecords(final Session session, final Date date1, - final Date date2, final Event event, final String s, - final Integer integer1, final Integer integer2) - throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, - ServiceFailure { - - throw new NotImplemented("1461", - "Authenticated getLogRecords not implemented"); + public Log getLogRecords(final Session session, final Date date1, final Date date2, final Event event, + final String s, final Integer integer1, final Integer integer2) + throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { + + throw new NotImplemented("1461", "Authenticated getLogRecords not implemented"); } } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index cf0f000..edc4782 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -1,8 +1,10 @@ package org.irods.jargon.dataone.tier1; import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; @@ -36,7 +38,6 @@ import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.protovalues.FilePermissionEnum; -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; //import org.irods.jargon.dataprofile.DataProfileService; //import org.irods.jargon.dataprofile.DataTypeResolutionService; //import org.irods.jargon.dataprofile.DataTypeResolutionServiceImpl; @@ -48,31 +49,35 @@ import org.irods.jargon.core.pub.io.IRODSFile; import org.irods.jargon.core.pub.io.IRODSFileInputStream; import org.irods.jargon.dataone.auth.RestAuthUtils; -import org.irods.jargon.dataone.configuration.RestConfiguration; +import org.irods.jargon.dataone.configuration.PluginDiscoveryService; +import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.domain.MNPermissionEnum; import org.irods.jargon.dataone.reposervice.DataObjectListResponse; import org.irods.jargon.dataone.utils.DataObjectMetadataUtils; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.dataone.utils.PropertiesLoader; +import org.irods.jargon.pid.pidservice.UniqueIdAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MNReadImpl implements MNRead { - private Logger log = LoggerFactory.getLogger(this.getClass()); + /** + * @param publicationContext + * @param pluginDiscoveryService + */ + public MNReadImpl(PublicationContext publicationContext, PluginDiscoveryService pluginDiscoveryService) { + super(); + this.publicationContext = publicationContext; + this.pluginDiscoveryService = pluginDiscoveryService; + } - private final IRODSAccessObjectFactory irodsAccessObjectFactory; - private final RestConfiguration restConfiguration; + private Logger log = LoggerFactory.getLogger(this.getClass()); + private final PublicationContext publicationContext; + private final PluginDiscoveryService pluginDiscoveryService; private PropertiesLoader properties = new PropertiesLoader(); - public MNReadImpl(final IRODSAccessObjectFactory irodsAccessObjectFactory, - final RestConfiguration restConfiguration) { - - this.irodsAccessObjectFactory = irodsAccessObjectFactory; - this.restConfiguration = restConfiguration; - } - @Override public DescribeResponse describe(final Identifier id) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { @@ -90,16 +95,12 @@ public DescribeResponse describe(final Identifier id) BigInteger serialVersion; try { + IRODSAccount irodsAccount = RestAuthUtils + .getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); - // FIXME: add handle factory and lookup + UniqueIdAO pidService = pluginDiscoveryService.instanceUniqueIdService(irodsAccount); + dataObject = pidService.getDataObjectFromIdentifier(id); - // need last modified, content length, Content-Type: - // application/octet-stream, object format (mime), checksum, serial - // version - // UniqueIdAOHandleImpl handleImpl = new - // UniqueIdAOHandleImpl(restConfiguration, - // irodsAccessObjectFactory); - // dataObject = handleImpl.getDataObjectFromIdentifier(id); } catch (Exception e) { log.info("cannot find id: {}", id.getValue()); throw new NotFound("1380", "The specified object does not exist on this node."); @@ -110,13 +111,12 @@ public DescribeResponse describe(final Identifier id) String contentLengthStr = contentLengthLong.toString(); contentLength = new BigInteger(contentLengthStr); - IRODSAccount irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(restConfiguration); - // lastModified = dataObject.getUpdatedAt(); - lastModified = DataObjectMetadataUtils.getStartDateTime(irodsAccessObjectFactory, irodsAccount, dataObject); + lastModified = DataObjectMetadataUtils.getStartDateTime(publicationContext.getIrodsAccessObjectFactory(), + irodsAccount, dataObject); - String format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, irodsAccessObjectFactory, - dataObject); + String format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, + publicationContext.getIrodsAccessObjectFactory(), dataObject); // use back up if no format stores in dataObject AVU if (format == null) { format = getDataObjectMimeType(irodsAccount, dataObject); @@ -137,9 +137,8 @@ public DescribeResponse describe(final Identifier id) } catch (Exception e) { log.error("Cannot access iRODS object: {}", dataObject.getAbsolutePath()); throw new ServiceFailure("1390", e.getMessage()); - } finally { - irodsAccessObjectFactory.closeSessionAndEatExceptions(); } + return new DescribeResponse(formatIdentifier, contentLength, lastModified, checksum, serialVersion); } @@ -151,67 +150,62 @@ public DescribeResponse describe(final Session arg0, final Identifier arg1) public void streamObject(final HttpServletResponse response, final Identifier id) throws ServiceFailure, NotFound { - new String(); - new DataObject(); + DataObject dataObject; + String path; + IRODSAccount irodsAccount; + IRODSFile irodsFile; // first try and find data object for this id try { - RestAuthUtils.getIRODSAccountFromBasicAuthValues(restConfiguration); - - // FIXME: add handle factory and lookup - - /* - * UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl( - * restConfiguration, irodsAccessObjectFactory); dataObject = - * handleImpl.getDataObjectFromIdentifier(id); path = - * dataObject.getAbsolutePath(); irodsFile = - * irodsAccessObjectFactory.getIRODSFileFactory( - * irodsAccount).instanceIRODSFile(path); - * - * if (!irodsFile.exists()) { log.info("file does not exist"); throw - * new NotFound("1020", - * "No data object could be found for given PID:" + id.getValue()); - * } - */ + irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + + UniqueIdAO pidService = pluginDiscoveryService.instanceUniqueIdService(irodsAccount); + dataObject = pidService.getDataObjectFromIdentifier(id); + + path = dataObject.getAbsolutePath(); + irodsFile = publicationContext.getIrodsAccessObjectFactory().getIRODSFileFactory(irodsAccount) + .instanceIRODSFile(path); + + if (!irodsFile.exists()) { + log.info("file does not exist"); + throw new NotFound("1020", "No data object could be found for given PID:" + id.getValue()); + } + } catch (Exception ex) { log.info("file does not exist"); throw new NotFound("1020", "No data object could be found for given PID:" + id.getValue()); } - /* - * - * // now try and stream it try { - * - * stream = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount) - * .instanceIRODSFileInputStream(irodsFile); // TODO: need to catch and - * return appropriate exceptions here for no // permission - * - * contentLength = (int) irodsFile.length(); - * log.info("contentLength={}", contentLength); - * - * response.setContentType("application/octet-stream"); - * response.setHeader("Content-Disposition", "attachment;filename=" + - * dataObject.getDataName()); response.setContentLength(contentLength); - * // response.addHeader("Vary", "Accept-Encoding"); - * log.info("reponse: {}", response.toString()); - * - * output = new BufferedOutputStream(response.getOutputStream()); - * - * // Stream2StreamAO stream2StreamAO = getIrodsAccessObjectFactory() // - * .getStream2StreamAO(irodsAccount); // - * stream2StreamAO.streamToStreamCopyUsingStandardIO(input, output); - * - * int readBytes = 0; byte[] buffer = new byte[4096]; - * - * while ((readBytes = stream.read(buffer, 0, 4096)) != -1) { // - * log.info("readBytes={}", readBytes); output.write(buffer, 0, - * readBytes); } output.flush(); if (stream != null) stream.close(); if - * (output != null) output.close(); - * - * } catch (Exception e) { log.error("Cannot stream iRODS object: {}", - * path); throw new ServiceFailure("1030", - * "unable to stream iRODS data object"); } finally { - * irodsAccessObjectFactory.closeSessionAndEatExceptions(); } - */ + try { + InputStream stream = publicationContext.getIrodsAccessObjectFactory().getIRODSFileFactory(irodsAccount) + .instanceIRODSFileInputStream(irodsFile); + int contentLength = (int) irodsFile.length(); + log.info("contentLength={}", contentLength); + + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + dataObject.getDataName()); + response.setContentLength(contentLength); + // response.addHeader("Vary", "Accept-Encoding"); + log.info("reponse: {}", response.toString()); + + OutputStream output = new BufferedOutputStream(response.getOutputStream()); + + int readBytes = 0; + byte[] buffer = new byte[4096]; + + while ((readBytes = stream.read(buffer, 0, 4096)) != -1) { // + log.info("readBytes={}", readBytes); + output.write(buffer, 0, readBytes); + } + output.flush(); + if (stream != null) + stream.close(); + if (output != null) + output.close(); + + } catch (Exception e) { + log.error("Cannot stream iRODS object: {}", path); + throw new ServiceFailure("1030", "unable to stream iRODS data object"); + } } @@ -614,9 +608,10 @@ private String getDataObjectMimeType(final IRODSAccount irodsAccount, final Data log.info("file name is: {}", filename); DefaultDetector typeDetector = new DefaultDetector(); - IRODSFile irodsFile = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount).instanceIRODSFile(filename); - IRODSFileInputStream irodsStream = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount) - .instanceIRODSFileInputStream(irodsFile); + IRODSFile irodsFile = publicationContext.getIrodsAccessObjectFactory().getIRODSFileFactory(irodsAccount) + .instanceIRODSFile(filename); + IRODSFileInputStream irodsStream = publicationContext.getIrodsAccessObjectFactory() + .getIRODSFileFactory(irodsAccount).instanceIRODSFileInputStream(irodsFile); InputStream stream = new BufferedInputStream(irodsStream); Metadata metadata = new Metadata(); metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, filename); diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/factory/package-info.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/factory/package-info.java deleted file mode 100644 index 3240715..0000000 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/factory/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * - */ -/** - * @author mconway - * - */ -package org.irods.jargon.dataone.factory; \ No newline at end of file From f53744a0fe6d6ba40dcccadb4cf3769e54f6a616 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 22 May 2017 14:42:17 -0400 Subject: [PATCH 43/88] #3 refactor drafted complete --- .../jargon/dataone/MemberNodeService.java | 23 +- .../jargon/dataone/tier1/MNReadImpl.java | 504 ++++++++++-------- 2 files changed, 281 insertions(+), 246 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java index ef17b29..e7a93fc 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java @@ -149,7 +149,7 @@ public MNLog handleGetLogRecords(@QueryParam("fromDate") final String fromDateSt logger.info("/log request: event={} pidFilter={}", event, pidFilter); logger.info("/log request: start={} count={}", start, count); - MMNCoreImpl mnCoreImpl = new MNCoreImpl(publicationContext, pluginDiscoveryService); + MNCoreImpl mnCoreImpl = new MNCoreImpl(publicationContext, pluginDiscoveryService); // parse date strings Date fromDate = null; @@ -184,8 +184,7 @@ public MNLog handleGetLogRecords(@QueryParam("fromDate") final String fromDateSt public void handleRead(@PathParam("id") final String pid, @Context final HttpServletResponse response) throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented, InsufficientResources { - MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext, pluginDiscoveryService); Identifier id = new Identifier(); id.setValue(pid); @@ -221,8 +220,7 @@ public MNChecksum handleGetChecksum(@PathParam("id") final String pid, Identifier id = new Identifier(); id.setValue(pid); - MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext, pluginDiscoveryService); Checksum checksum = mnReadImpl.getChecksum(id, algorithm); mnChecksum.copy(checksum); @@ -236,8 +234,7 @@ public MNChecksum handleGetChecksum(@PathParam("id") final String pid, public void handleReplica(@PathParam("id") final String pid, @Context final HttpServletResponse response) throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, NotImplemented, InsufficientResources { - MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext, pluginDiscoveryService); Identifier id = new Identifier(); id.setValue(pid); @@ -272,8 +269,7 @@ public MNSystemMetadata handleGetSystemMetadata(@PathParam("id") final String pi Identifier id = new Identifier(); id.setValue(pid); - MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext, pluginDiscoveryService); SystemMetadata sysMetadata = mnReadImpl.getSystemMetadata(id); mnSystemMetadata.copy(sysMetadata); @@ -294,8 +290,7 @@ public Response handleDescribe(@PathParam("id") final String pid) DescribeResponse describeResponse; - MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext, pluginDiscoveryService); try { describeResponse = mnReadImpl.describe(id); } catch (NotFound ex) { @@ -362,8 +357,7 @@ public Response handleSynchronizationFailed(final MultipartFormDataInput input) throw new ServiceFailure("2161", "Synch Failure Exception message is null"); } - MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext, pluginDiscoveryService); boolean success = mnReadImpl.synchronizationFailed(message); if (!success) { @@ -408,8 +402,7 @@ public MNObjectList handleListObjects(@QueryParam("fromDate") final String fromD throw new InvalidRequest("1540", e.getMessage()); } - MNReadImpl mnReadImpl = new MNReadImpl(publicationContext.getIrodsAccessObjectFactory(), - publicationContext.getRestConfiguration()); + MNReadImpl mnReadImpl = new MNReadImpl(publicationContext, pluginDiscoveryService); ObjectList objectList = mnReadImpl.listObjects(fromDate, toDate, formatId, replicaStatus, start, count); mnObjectList.copy(objectList); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index edc4782..8359ffe 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -25,19 +25,26 @@ import org.dataone.service.exceptions.ServiceFailure; import org.dataone.service.exceptions.SynchronizationFailed; import org.dataone.service.mn.tier1.v1.MNRead; +import org.dataone.service.types.v1.AccessPolicy; +import org.dataone.service.types.v1.AccessRule; import org.dataone.service.types.v1.Checksum; import org.dataone.service.types.v1.DescribeResponse; +import org.dataone.service.types.v1.Event; import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.NodeReference; import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.dataone.service.types.v1.ObjectInfo; import org.dataone.service.types.v1.ObjectList; import org.dataone.service.types.v1.Permission; +import org.dataone.service.types.v1.ReplicationPolicy; import org.dataone.service.types.v1.Session; +import org.dataone.service.types.v1.Subject; import org.dataone.service.types.v1.SystemMetadata; import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.protovalues.FilePermissionEnum; +import org.irods.jargon.core.pub.DataObjectAO; //import org.irods.jargon.dataprofile.DataProfileService; //import org.irods.jargon.dataprofile.DataTypeResolutionService; //import org.irods.jargon.dataprofile.DataTypeResolutionServiceImpl; @@ -50,9 +57,12 @@ import org.irods.jargon.core.pub.io.IRODSFileInputStream; import org.irods.jargon.dataone.auth.RestAuthUtils; import org.irods.jargon.dataone.configuration.PluginDiscoveryService; +import org.irods.jargon.dataone.configuration.PluginNotFoundException; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.domain.MNPermissionEnum; +import org.irods.jargon.dataone.events.DataOneEventServiceAO; import org.irods.jargon.dataone.reposervice.DataObjectListResponse; +import org.irods.jargon.dataone.reposervice.DataOneRepoServiceAO; import org.irods.jargon.dataone.utils.DataObjectMetadataUtils; import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.dataone.utils.PropertiesLoader; @@ -62,22 +72,23 @@ public class MNReadImpl implements MNRead { + private Logger log = LoggerFactory.getLogger(this.getClass()); + + private final PublicationContext publicationContext; + private final PluginDiscoveryService pluginDiscoveryService; + private PropertiesLoader properties = new PropertiesLoader(); + /** * @param publicationContext * @param pluginDiscoveryService */ - public MNReadImpl(PublicationContext publicationContext, PluginDiscoveryService pluginDiscoveryService) { + public MNReadImpl(final PublicationContext publicationContext, + final PluginDiscoveryService pluginDiscoveryService) { super(); this.publicationContext = publicationContext; this.pluginDiscoveryService = pluginDiscoveryService; } - private Logger log = LoggerFactory.getLogger(this.getClass()); - - private final PublicationContext publicationContext; - private final PluginDiscoveryService pluginDiscoveryService; - private PropertiesLoader properties = new PropertiesLoader(); - @Override public DescribeResponse describe(final Identifier id) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure, NotFound { @@ -93,10 +104,9 @@ public DescribeResponse describe(final Identifier id) BigInteger contentLength; Date lastModified; BigInteger serialVersion; - + IRODSAccount irodsAccount; try { - IRODSAccount irodsAccount = RestAuthUtils - .getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); UniqueIdAO pidService = pluginDiscoveryService.instanceUniqueIdService(irodsAccount); dataObject = pidService.getDataObjectFromIdentifier(id); @@ -197,10 +207,12 @@ public void streamObject(final HttpServletResponse response, final Identifier id output.write(buffer, 0, readBytes); } output.flush(); - if (stream != null) + if (stream != null) { stream.close(); - if (output != null) + } + if (output != null) { output.close(); + } } catch (Exception e) { log.error("Cannot stream iRODS object: {}", path); @@ -271,35 +283,41 @@ public Checksum getChecksum(final Identifier id, final String algorithm) throw new NotFound("1420", "invalid checksum algorithm provided"); } - new DataObject(); Checksum checksum = new Checksum(); - /* - * try { - * - * // FIXME: need to add handle stuff - * - * - * - * UniqueIdAOHandleImpl handleImpl = new UniqueIdAOHandleImpl( - * restConfiguration, irodsAccessObjectFactory); dataObject = - * handleImpl.getDataObjectFromIdentifier(id); String csum = - * dataObject.getChecksum(); if (csum == null) { - * log.info("checksum does not exist for file: {}", - * dataObject.getAbsolutePath()); throw new NotFound("1410", - * "Checksum does not exist for data object id provided"); } - * checksum.setValue(csum); checksum.setAlgorithm(properties - * .getProperty("irods.dataone.chksum-algorithm")); - * - * } catch (FileNotFoundException nf) { - * log.error("Cannot access iRODS object: {}", - * dataObject.getAbsolutePath()); throw new NotFound("1410", - * "No data object could be found for given PID:"); } catch - * (JargonException je) { log.error("cannot access iRODS object: {}", - * dataObject.getAbsolutePath()); throw new ServiceFailure("1410", - * je.getMessage()); } finally { - * irodsAccessObjectFactory.closeSessionAndEatExceptions(); } - */ + DataObject dataObject; + String path; + IRODSAccount irodsAccount; + IRODSFile irodsFile; + // first try and find data object for this id + try { + irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + + UniqueIdAO pidService = pluginDiscoveryService.instanceUniqueIdService(irodsAccount); + dataObject = pidService.getDataObjectFromIdentifier(id); + + path = dataObject.getAbsolutePath(); + irodsFile = publicationContext.getIrodsAccessObjectFactory().getIRODSFileFactory(irodsAccount) + .instanceIRODSFile(path); + + if (!irodsFile.exists()) { + log.info("file does not exist"); + throw new NotFound("1020", "No data object could be found for given PID:" + id.getValue()); + } + + } catch (Exception ex) { + log.info("file does not exist"); + throw new NotFound("1020", "No data object could be found for given PID:" + id.getValue()); + } + + String csum = dataObject.getChecksum(); + if (csum == null) { + log.info("checksum does not exist for file: {}", dataObject.getAbsolutePath()); + throw new NotFound("1410", "Checksum does not exist for data object id provided"); + } + checksum.setValue(csum); + checksum.setAlgorithm(properties.getProperty("irods.dataone.chksum-algorithm")); + return checksum; } @@ -329,98 +347,115 @@ public SystemMetadata getSystemMetadata(final Identifier id) throw new InvalidToken("1402", "invalid iRODS data object id"); } - new DataObject(); SystemMetadata metadata = new SystemMetadata(); // TODO: hardcode version to 1 for now metadata.setSerialVersion(getSerialVersion()); - new Checksum(); + DataObject dataObject; + IRODSAccount irodsAccount; + Checksum checksum = new Checksum(); + + // first try and find data object for this id + try { + irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + + UniqueIdAO pidService = pluginDiscoveryService.instanceUniqueIdService(irodsAccount); + dataObject = pidService.getDataObjectFromIdentifier(id); + + } catch (Exception ex) { + log.info("file does not exist"); + throw new NotFound("1060", "No metadata could be found for given PID:" + id.getValue()); + } + + try { + String csum = dataObject.getChecksum(); + if (csum == null) { + log.info("checksum does not exist for file: {}", dataObject.getAbsolutePath()); // throw + // new + // NotFound("404", + // "1420"); + } else { + checksum.setValue(csum); + checksum.setAlgorithm(properties.getProperty("irods.dataone.chksum-algorithm")); + } + + String format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, + publicationContext.getIrodsAccessObjectFactory(), dataObject); + if (format == null) { + format = getDataObjectMimeType(irodsAccount, dataObject); + } + metadata.setIdentifier(id); + ObjectFormatIdentifier formatId = new ObjectFormatIdentifier(); + formatId.setValue(format); + metadata.setFormatId(formatId); + + Long dataSizeLong = new Long(dataObject.getDataSize()); + String dataSizeStr = dataSizeLong.toString(); + metadata.setSize(new BigInteger(dataSizeStr)); + metadata.setChecksum(checksum); + + String dataOwner = "uid=" + dataObject.getDataOwnerName(); + Subject submitter = new Subject(); + submitter.setValue(dataOwner); + metadata.setSubmitter(submitter); + + Subject rightsHolder = new Subject(); + rightsHolder.setValue(dataOwner); + metadata.setRightsHolder(rightsHolder); + + DataObjectAO dataObjectAO = publicationContext.getIrodsAccessObjectFactory().getDataObjectAO(irodsAccount); + List permissions = dataObjectAO + .listPermissionsForDataObject(dataObject.getAbsolutePath()); + if (permissions != null) { + AccessPolicy accessPolicy = new AccessPolicy(); + for (UserFilePermission permission : permissions) { + AccessRule rule = new AccessRule(); + Subject subject = new Subject(); + + // in DataONE - anonymous translates to public + // TODO: also may need to make translation for "public" to + // "authenticatedUser" + if (permission.getUserName().equals("anonymous")) { + subject.setValue("public"); + } else { + subject.setValue("uid=" + permission.getUserName()); + } + rule.addSubject(subject); + List d1Premissions = getD1Permission(permission); + for (Permission d1Premission : d1Premissions) { + rule.addPermission(d1Premission); + } + accessPolicy.addAllow(rule); + } + metadata.setAccessPolicy(accessPolicy); + } + + ReplicationPolicy replicationPolicy = new ReplicationPolicy(); + replicationPolicy.setReplicationAllowed(false); + metadata.setReplicationPolicy(replicationPolicy); + + // Add support for obsoletes or obsoletedBy? + + // Use AVU epoch date // + metadata.setDateUploaded(dataObject.getCreatedAt()); // + metadata.setDateSysMetadataModified(dataObject.getUpdatedAt()); + Date startDate = DataObjectMetadataUtils.getStartDateTime(publicationContext.getIrodsAccessObjectFactory(), + irodsAccount, dataObject); + metadata.setDateSysMetadataModified(startDate); + metadata.setDateUploaded(startDate); + + NodeReference nodeReference = new NodeReference(); + nodeReference.setValue(properties.getProperty("irods.dataone.identifier")); + metadata.setOriginMemberNode(nodeReference); + metadata.setAuthoritativeMemberNode(nodeReference); + + } catch (Exception e) { + log.error("Cannot access iRODS object: {}", dataObject.getAbsolutePath()); + throw new ServiceFailure("1090", e.getMessage()); + } // first try and find data object for this id - // FIXME: add handle stuff - - /* - * - * try { irodsAccount = RestAuthUtils - * .getIRODSAccountFromBasicAuthValues(restConfiguration); - * - * dataObjectAO = irodsAccessObjectFactory - * .getDataObjectAO(irodsAccount); UniqueIdAOHandleImpl handleImpl = new - * UniqueIdAOHandleImpl( restConfiguration, irodsAccessObjectFactory); - * dataObject = handleImpl.getDataObjectFromIdentifier(id); - * - * } catch (Exception ex) { log.info("file does not exist"); throw new - * NotFound("1060", "No metadata could be found for given PID:" + - * id.getValue()); } - * - * - * try { String csum = dataObject.getChecksum(); if (csum == null) { - * log.info("checksum does not exist for file: {}", - * dataObject.getAbsolutePath()); // throw new NotFound("404", "1420"); - * } else { checksum.setValue(csum); checksum.setAlgorithm(properties - * .getProperty("irods.dataone.chksum-algorithm")); } - * - * String format = DataTypeUtils.getDataObjectFormatFromMetadata( - * irodsAccount, irodsAccessObjectFactory, dataObject); if (format == - * null) { format = getDataObjectMimeType(irodsAccount, dataObject); } - * metadata.setIdentifier(id); ObjectFormatIdentifier formatId = new - * ObjectFormatIdentifier(); formatId.setValue(format); - * metadata.setFormatId(formatId); - * - * Long dataSizeLong = new Long(dataObject.getDataSize()); String - * dataSizeStr = dataSizeLong.toString(); metadata.setSize(new - * BigInteger(dataSizeStr)); metadata.setChecksum(checksum); - * - * String dataOwner = "uid=" + dataObject.getDataOwnerName(); Subject - * submitter = new Subject(); submitter.setValue(dataOwner); - * metadata.setSubmitter(submitter); - * - * Subject rightsHolder = new Subject(); - * rightsHolder.setValue(dataOwner); - * metadata.setRightsHolder(rightsHolder); - * - * List permissions = dataObjectAO - * .listPermissionsForDataObject(dataObject.getAbsolutePath()); if - * (permissions != null) { AccessPolicy accessPolicy = new - * AccessPolicy(); for (UserFilePermission permission : permissions) { - * AccessRule rule = new AccessRule(); Subject subject = new Subject(); - * - * // in DataONE - anonymous translates to public // TODO: also may need - * to make translation for "public" to // "authenticatedUser" if - * (permission.getUserName().equals("anonymous")) { - * subject.setValue("public"); } else { subject.setValue("uid=" + - * permission.getUserName()); } rule.addSubject(subject); - * List d1Premissions = getD1Permission(permission); for - * (Permission d1Premission : d1Premissions) { - * rule.addPermission(d1Premission); } accessPolicy.addAllow(rule); } - * metadata.setAccessPolicy(accessPolicy); } - * - * ReplicationPolicy replicationPolicy = new ReplicationPolicy(); - * replicationPolicy.setReplicationAllowed(false); - * metadata.setReplicationPolicy(replicationPolicy); - * - * // Add support for obsoletes or obsoletedBy? - * - * // Use AVU epoch date // - * metadata.setDateUploaded(dataObject.getCreatedAt()); // - * metadata.setDateSysMetadataModified(dataObject.getUpdatedAt()); Date - * startDate = DataObjectMetadataUtils.getStartDateTime( - * irodsAccessObjectFactory, irodsAccount, dataObject); - * metadata.setDateSysMetadataModified(startDate); - * metadata.setDateUploaded(startDate); - * - * NodeReference nodeReference = new NodeReference(); - * nodeReference.setValue(properties - * .getProperty("irods.dataone.identifier")); - * metadata.setOriginMemberNode(nodeReference); - * metadata.setAuthoritativeMemberNode(nodeReference); - * - * } catch (Exception e) { log.error("Cannot access iRODS object: {}", - * dataObject.getAbsolutePath()); throw new ServiceFailure("1090", - * e.getMessage()); } finally { - * irodsAccessObjectFactory.closeSessionAndEatExceptions(); } - */ return metadata; } @@ -434,87 +469,91 @@ public SystemMetadata getSystemMetadata(final Session arg0, final Identifier arg public ObjectList listObjects(final Date fromDate, final Date toDate, final ObjectFormatIdentifier formatId, final Boolean replicaStatus, final Integer start, final Integer count) throws InvalidRequest, InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { - new DataObjectListResponse(); - new ArrayList(); - new ArrayList(); - new ObjectList(); - - // FIXME: handle stuff - - /* - * - * UniqueIdAOHandleInMetadataImpl handleImpl; - * - * try { // handleImpl = new UniqueIdAOHandleImpl(restConfiguration, // - * irodsAccessObjectFactory); handleImpl = new - * UniqueIdAOHandleInMetadataImpl(restConfiguration, - * irodsAccessObjectFactory); - * - * // dataObjectListResponse = // - * handleImpl.getListOfDataoneExposedDataObjects( dataObjectListResponse - * = handleImpl .getListOfDataoneExposedDataObjects(fromDate, toDate, - * formatId, replicaStatus, start, count); } catch (Exception ex) { - * log.info("{}", ex.toString()); throw new ServiceFailure("1580", - * "Could not retrieve list of data objects"); } - * - * dataObjectList = dataObjectListResponse.getDataObjects(); - * - * for (DataObject dObject : dataObjectList) { - * - * ObjectInfo oInfo = new ObjectInfo(); - * - * if (dObject.getChecksum() != null) { Checksum checksum = new - * Checksum(); checksum.setValue(dObject.getChecksum()); - * checksum.setAlgorithm(properties - * .getProperty("irods.dataone.chksum-algorithm")); - * oInfo.setChecksum(checksum); } - * - * // probably should combine query for format and start date at some // - * future refactor IRODSAccount irodsAccount = null; ; String format = - * null; try { irodsAccount = RestAuthUtils - * .getIRODSAccountFromBasicAuthValues(restConfiguration); format = - * DataTypeUtils.getDataObjectFormatFromMetadata( irodsAccount, - * irodsAccessObjectFactory, dObject); // use back up if no format - * stores in dataObject AVU if (format == null) { format = - * getDataObjectMimeType(irodsAccount, dObject); } } catch (Exception - * e1) { log.error(e1.toString()); log.error( - * "cannot retrieve mime type for object:{} setting to application/octet-stream" - * , dObject.getAbsolutePath()); format = "application/octet-stream"; } - * ObjectFormatIdentifier fId = new ObjectFormatIdentifier(); - * fId.setValue(format); oInfo.setFormatId(fId); - * - * // oInfo.setDateSysMetadataModified(dObject.getUpdatedAt()); Date - * startDate = new Date(); try { startDate = - * DataObjectMetadataUtils.getStartDateTime( irodsAccessObjectFactory, - * irodsAccount, dObject); } catch (Exception e1) { - * log.error(e1.toString()); - * log.error("cannot retrieve start date for object: {}", - * dObject.getAbsolutePath()); } - * oInfo.setDateSysMetadataModified(startDate); - * - * Identifier id; try { id = - * handleImpl.getIdentifierFromDataObject(dObject); } catch - * (JargonException e) { - * log.error("could not convert data object id to identifier: {}", - * e.toString()); throw new ServiceFailure("1580", - * "Could not retrieve list of data objects"); } - * oInfo.setIdentifier(id); - * - * Long dataSizeLong = new Long(dObject.getDataSize()); String - * dataSizeStr = dataSizeLong.toString(); oInfo.setSize(new - * BigInteger(dataSizeStr)); - * - * objectInfoList.add(oInfo); } - * - * objectList.setObjectInfoList(objectInfoList); - * objectList.setTotal(dataObjectListResponse.getTotal()); - * objectList.setCount(objectInfoList.size()); - * objectList.setStart(start); - * - * return objectList; - */ - return null; + IRODSAccount irodsAccount; + DataObjectListResponse response = new DataObjectListResponse(); + List objectInfoList = new ArrayList<>(); + ObjectList objectList = new ObjectList(); + + // first try and find data object for this id + try { + irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + + DataOneRepoServiceAO repoService = pluginDiscoveryService.instanceRepoService(irodsAccount); + response = repoService.getListOfDataoneExposedDataObjects(fromDate, toDate, formatId, replicaStatus, start, + count); + } catch (Exception ex) { + log.error("{}", ex.toString()); + throw new ServiceFailure("1580", "Could not retrieve list of data objects"); + } + + List dataObjects = response.getDataObjects(); + + for (DataObject dObject : dataObjects) { + + ObjectInfo oInfo = new ObjectInfo(); + + if (dObject.getChecksum() != null) { + Checksum checksum = new Checksum(); + checksum.setValue(dObject.getChecksum()); + checksum.setAlgorithm(properties.getProperty("irods.dataone.chksum-algorithm")); + oInfo.setChecksum(checksum); + } + + String format = null; + try { + format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, + publicationContext.getIrodsAccessObjectFactory(), dObject); + // use back up if no format stores in dataObject AVU + if (format == null) { + format = getDataObjectMimeType(irodsAccount, dObject); + } + + } catch (Exception e1) { + log.error(e1.toString()); + log.error("cannot retrieve mime type for object:{} setting to application/octet-stream", + dObject.getAbsolutePath()); + format = "application/octet-stream"; + } + + ObjectFormatIdentifier fId = new ObjectFormatIdentifier(); + fId.setValue(format); + oInfo.setFormatId(fId); + + Date startDate = new Date(); + try { + startDate = DataObjectMetadataUtils.getStartDateTime(publicationContext.getIrodsAccessObjectFactory(), + irodsAccount, dObject); + } catch (Exception e1) { + log.error(e1.toString()); + log.error("cannot retrieve start date for object: {}", dObject.getAbsolutePath()); + } + oInfo.setDateSysMetadataModified(startDate); + + Identifier id; + try { + UniqueIdAO pidService = pluginDiscoveryService.instanceUniqueIdService(irodsAccount); + id = pidService.getIdentifierFromDataObject(dObject); + } catch (JargonException | PluginNotFoundException e) { + log.error("could not convert data object id to identifier: {}", e.toString()); + throw new ServiceFailure("1580", "Could not retrieve list of data objects"); + } + oInfo.setIdentifier(id); + + Long dataSizeLong = new Long(dObject.getDataSize()); + String dataSizeStr = dataSizeLong.toString(); + oInfo.setSize(new BigInteger(dataSizeStr)); + objectInfoList.add(oInfo); + + } + + objectList.setObjectInfoList(objectInfoList); + objectList.setTotal(response.getTotal()); + objectList.setCount(objectInfoList.size()); + objectList.setStart(start); + + return objectList; + } @Override @@ -528,33 +567,36 @@ public ObjectList listObjects(final Session arg0, final Date arg1, final Date ar public boolean synchronizationFailed(final SynchronizationFailed syncFailed) throws InvalidToken, NotAuthorized, NotImplemented, ServiceFailure { - // FIXME: fix handle stuff - - /* - * - * Identifier pid = null; - * - * if (syncFailed.getPid() != null) { pid = new Identifier(); - * pid.setValue(syncFailed.getPid()); } else { throw new - * ServiceFailure("2161", "The identifier cannot be null."); } - * - * // check to make sure pid is valid try { UniqueIdAOHandleImpl - * handleImpl = new UniqueIdAOHandleImpl( restConfiguration, - * irodsAccessObjectFactory); // just try to access the object to see if - * is there or not handleImpl.getDataObjectFromIdentifier(pid); } catch - * (Exception ex) { throw new ServiceFailure("2161", - * "The identifier specified by " + syncFailed.getPid() + - * " was not found on this node."); } - * - * EventLogAOElasticSearchImpl eventLog = new - * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, - * restConfiguration); try { - * eventLog.recordEvent(Event.SYNCHRONIZATION_FAILED, pid, - * syncFailed.getDescription()); } catch (Exception e) { - * log.error("failed to log synchronization failed event: {}", - * e.toString()); throw new ServiceFailure("2161", - * "Failed to log Synchronization Failure event"); } - */ + Identifier pid = null; + IRODSAccount irodsAccount; + DataObject dataObject; + + if (syncFailed.getPid() != null) { + pid = new Identifier(); + pid.setValue(syncFailed.getPid()); + } else { + throw new ServiceFailure("2161", "The identifier cannot be null."); + } + + try { + irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + + UniqueIdAO pidService = pluginDiscoveryService.instanceUniqueIdService(irodsAccount); + dataObject = pidService.getDataObjectFromIdentifier(pid); + + } catch (Exception ex) { + throw new ServiceFailure("2161", + "The identifier specified by " + syncFailed.getPid() + " was not found on this node."); + } + + try { + DataOneEventServiceAO eventServiceAO = pluginDiscoveryService.instanceEventService(irodsAccount); + eventServiceAO.recordEvent(Event.SYNCHRONIZATION_FAILED, pid, syncFailed.getDescription()); + + } catch (PluginNotFoundException | JargonException e) { + log.error("failed to log synchronization failed event: {}", e.toString()); + throw new ServiceFailure("2161", "Failed to log Synchronization Failure event"); + } return true; } From 655ffea3a618b51e4746968835422e6a1097a2bd Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 22 May 2017 16:02:48 -0400 Subject: [PATCH 44/88] #3 migrate props, add addl logging --- dataone-node/Dockerfile | 16 +++++++ .../irods-ext}/d1client.properties | 0 .../jargon/dataone/MemberNodeService.java | 42 ++++++++++--------- .../jargon/dataone/utils/DataTypeUtils.java | 4 +- .../dataone/utils/PropertiesLoader.java | 27 +++++++++--- 5 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 dataone-node/Dockerfile rename dataone-node/{src/main/resources => etc/irods-ext}/d1client.properties (100%) diff --git a/dataone-node/Dockerfile b/dataone-node/Dockerfile new file mode 100644 index 0000000..327eab8 --- /dev/null +++ b/dataone-node/Dockerfile @@ -0,0 +1,16 @@ +FROM tomcat:jre8-alpine +LABEL organization="RENCI" +LABEL maintainer="michael_conway@unc.edu" +LABEL description="DFC Member Node" +ADD target/dataone-node-4.2.1.0-SNAPSHOT.war /usr/local/tomcat/webapps/ +ADD runit.sh / +CMD ["/runit.sh"] +#CMD ["sh"] +# build: docker build -t diceunc/dataone:4.2.1.0-SNAPSHOT . + +# run: docker run -d --rm -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext --add-host irods420.irodslocal:172.16.250.101 diceunc/webdav:4.2.0.0-SNAPSHOT + +# docker run -d --rm -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext --add-host irods.data2discovery.org:152.54.2.71 diceunc/webdav:4.2.0.0-SNAPSHOT + + +# run: docker run -d --rm -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/webdav:4.2.0.0-SNAPSHOT diff --git a/dataone-node/src/main/resources/d1client.properties b/dataone-node/etc/irods-ext/d1client.properties similarity index 100% rename from dataone-node/src/main/resources/d1client.properties rename to dataone-node/etc/irods-ext/d1client.properties diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java index e7a93fc..0e7aa85 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/MemberNodeService.java @@ -46,8 +46,11 @@ import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.dataone.service.types.v1.ObjectList; import org.dataone.service.types.v1.SystemMetadata; +import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.dataone.auth.RestAuthUtils; import org.irods.jargon.dataone.configuration.PluginDiscoveryService; +import org.irods.jargon.dataone.configuration.PluginNotFoundException; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.domain.MNChecksum; import org.irods.jargon.dataone.domain.MNError; @@ -55,6 +58,7 @@ import org.irods.jargon.dataone.domain.MNNode; import org.irods.jargon.dataone.domain.MNObjectList; import org.irods.jargon.dataone.domain.MNSystemMetadata; +import org.irods.jargon.dataone.events.DataOneEventServiceAO; import org.irods.jargon.dataone.tier1.MNCoreImpl; import org.irods.jargon.dataone.tier1.MNReadImpl; import org.irods.jargon.dataone.utils.ISO8601; @@ -192,15 +196,15 @@ public void handleRead(@PathParam("id") final String pid, @Context final HttpSer // couldn't figure out how to override the get method mnReadImpl.streamObject(response, id); - // FIXME: add log stuff - /* - * // now log the event EventLogAOElasticSearchImpl eventLog = new - * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, - * restConfiguration); try { eventLog.recordEvent(Event.READ, id, - * "DataONE replication"); } catch (Exception e) { - * logger.error("Unable to log EVENT: {} for data object id: {}", - * Event.READ, pid); } - */ + try { + IRODSAccount irodsAccount = RestAuthUtils + .getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + DataOneEventServiceAO eventServiceAO = pluginDiscoveryService.instanceEventService(irodsAccount); + eventServiceAO.recordEvent(Event.READ, id, "DataONE replication"); + + } catch (PluginNotFoundException | JargonException e) { + logger.error("Unable to log EVENT: {} for data object id: {}", Event.READ, pid); + } } @@ -243,17 +247,15 @@ public void handleReplica(@PathParam("id") final String pid, @Context final Http // couldn't figure out how to override the get method mnReadImpl.streamObject(response, id); - // FIXME: add log stuff - - /* - * - * // now log the event EventLogAOElasticSearchImpl eventLog = new - * EventLogAOElasticSearchImpl( irodsAccessObjectFactory, - * restConfiguration); try { eventLog.recordEvent(Event.REPLICATE, id, - * "DataONE replication"); } catch (Exception e) { - * logger.error("Unable to log EVENT: {} for data object id: {}", - * Event.REPLICATE, pid); } - */ + try { + IRODSAccount irodsAccount = RestAuthUtils + .getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + DataOneEventServiceAO eventServiceAO = pluginDiscoveryService.instanceEventService(irodsAccount); + eventServiceAO.recordEvent(Event.READ, id, "DataONE replication"); + + } catch (PluginNotFoundException | JargonException e) { + logger.error("Unable to log EVENT: {} for data object id: {}", Event.READ, pid); + } } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java index 288bf73..5f01803 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java @@ -26,6 +26,8 @@ public class DataTypeUtils { + // FIXME: consider moving to repo service + public static String getDataObjectMimeType(final IRODSAccount irodsAccount, final IRODSAccessObjectFactory irodsAccessObjectFactory, final DataObject dataObject) throws FileNotFoundException, JargonException { @@ -65,7 +67,7 @@ public static String getDataObjectFormatFromMetadata(final IRODSAccount irodsAcc String dataFormat = null; String formatAttr = "Format"; - List avuQueryList = new ArrayList(); + List avuQueryList = new ArrayList<>(); AVUQueryElement avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, formatAttr); diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java index 88e5dd0..433b1e4 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java @@ -1,5 +1,8 @@ package org.irods.jargon.dataone.utils; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; @@ -11,23 +14,35 @@ public class PropertiesLoader { private Properties properties; - private String propertiesFilename = "d1client.properties"; + private String propertiesFilename = "/etc/irods-ext/d1client.properties"; private Logger log = LoggerFactory.getLogger(this.getClass()); public PropertiesLoader() { properties = new Properties(); InputStream input = null; - input = getClass().getClassLoader().getResourceAsStream( - propertiesFilename); + File propsFile = new File(propertiesFilename); + if (!propsFile.exists()) { + log.error("illegal state exception, cannot find /etc/irods-ext/dlclient.properties"); + throw new IllegalStateException("unable to load properties file at /etc/irods-ext/dlclient.properties"); + } + + try { + input = new FileInputStream(propsFile); + } catch (FileNotFoundException e1) { + log.error("cannot open /etc/irods-ext/dlclient.properties"); + throw new IllegalStateException("unable to stream properties file at /etc/irods-ext/dlclient.properties"); + } + + // input = getClass().getClassLoader().getResourceAsStream( + // propertiesFilename); // load a properties file try { properties.load(input); } catch (IOException e) { - log.error("Cannot load Member Node properties file: {}", - propertiesFilename); - log.error("IOException: {}", e.getStackTrace()); + log.error("Cannot load Member Node properties file: {}", propertiesFilename); + log.error("IOException: {}", e); properties = new Properties(); } finally { if (input != null) { From 59d9853b7788dc7c082cadcd7874550904618e10 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 22 May 2017 16:32:00 -0400 Subject: [PATCH 45/88] #3 adding docker --- dataone-node/Dockerfile | 6 +----- dataone-node/etc/irods-ext/d1client.properties | 15 +++++++++++++++ .../src/main/webapp/WEB-INF/rest-servlet.xml | 1 + 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/dataone-node/Dockerfile b/dataone-node/Dockerfile index 327eab8..cab2af0 100644 --- a/dataone-node/Dockerfile +++ b/dataone-node/Dockerfile @@ -8,9 +8,5 @@ CMD ["/runit.sh"] #CMD ["sh"] # build: docker build -t diceunc/dataone:4.2.1.0-SNAPSHOT . -# run: docker run -d --rm -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext --add-host irods420.irodslocal:172.16.250.101 diceunc/webdav:4.2.0.0-SNAPSHOT -# docker run -d --rm -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext --add-host irods.data2discovery.org:152.54.2.71 diceunc/webdav:4.2.0.0-SNAPSHOT - - -# run: docker run -d --rm -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/webdav:4.2.0.0-SNAPSHOT +# run: docker run -d --rm -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT diff --git a/dataone-node/etc/irods-ext/d1client.properties b/dataone-node/etc/irods-ext/d1client.properties index 4b5c9c6..ae0497d 100644 --- a/dataone-node/etc/irods-ext/d1client.properties +++ b/dataone-node/etc/irods-ext/d1client.properties @@ -57,3 +57,18 @@ irods.dataone.events.elasticsearch.searchindex=databook irods.dataone.events.elasticsearch.searchtype=entity irods.dataone.events.elasticsearch.cluster.name=databookIndexer +# REST Props +irods.host=localhost +irods.port=1247 +irods.zone=tempZone +utilize.packing.streams=true +# STANDARD | PAM AUTH +auth.type=STANDARD +default.storage.resource= +# web.interface.url is currently optional and not fully implemented, it can be left blank. +# sets jargon ssl negotiation policy for the client. Leaving to DONT_CARE defers to the server, and is recommended +# NO_NEGOTIATION, CS_NEG_REFUSE, CS_NEG_REQUIRE, CS_NEG_DONT_CARE +ssl.negotiation.policy=CS_NEG_DONT_CARE +# location for discovered plug-ins +plugin.jar.location=/etc/irods-ext/d1plugins + diff --git a/dataone-node/src/main/webapp/WEB-INF/rest-servlet.xml b/dataone-node/src/main/webapp/WEB-INF/rest-servlet.xml index 3b31aeb..95aa61b 100644 --- a/dataone-node/src/main/webapp/WEB-INF/rest-servlet.xml +++ b/dataone-node/src/main/webapp/WEB-INF/rest-servlet.xml @@ -11,6 +11,7 @@ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> + From fc64294632563458611ddb6b4d0d95e7ce04813a Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 22 May 2017 17:40:54 -0400 Subject: [PATCH 46/88] #3 loads and pings! --- dataone-node/Dockerfile | 2 +- .../etc/irods-ext/d1client.properties | 4 +- dataone-node/pom.xml | 6 +++ dataone-node/runit.sh | 14 +++++++ .../jargon/dataone/utils/RestVersion.java | 2 +- .../src/main/resources/jargon-beans.xml | 6 +-- .../src/main/resources/log4j.properties | 2 +- .../configuration/RestConfiguration.java | 38 ++++++++++++------- 8 files changed, 52 insertions(+), 22 deletions(-) create mode 100755 dataone-node/runit.sh diff --git a/dataone-node/Dockerfile b/dataone-node/Dockerfile index cab2af0..901f80a 100644 --- a/dataone-node/Dockerfile +++ b/dataone-node/Dockerfile @@ -9,4 +9,4 @@ CMD ["/runit.sh"] # build: docker build -t diceunc/dataone:4.2.1.0-SNAPSHOT . -# run: docker run -d --rm -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT +# run: docker run -i -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT diff --git a/dataone-node/etc/irods-ext/d1client.properties b/dataone-node/etc/irods-ext/d1client.properties index ae0497d..0bfce77 100644 --- a/dataone-node/etc/irods-ext/d1client.properties +++ b/dataone-node/etc/irods-ext/d1client.properties @@ -61,7 +61,9 @@ irods.dataone.events.elasticsearch.cluster.name=databookIndexer irods.host=localhost irods.port=1247 irods.zone=tempZone -utilize.packing.streams=true +# user and password for dataone user +irods.username=test1 +irods.password=test # STANDARD | PAM AUTH auth.type=STANDARD default.storage.resource= diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index ef3b742..120209f 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -65,6 +65,12 @@ org.irods.jargon jargon-core ${project.version} + + + uk.org.mygrid.resources + cog-jglobus + + diff --git a/dataone-node/runit.sh b/dataone-node/runit.sh new file mode 100755 index 0000000..3939730 --- /dev/null +++ b/dataone-node/runit.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +if [ -f /tmp/cert/server.crt ]; +then + echo "Cert will be imported" + keytool -delete -noprompt -alias mycert -keystore /usr/lib/jvm/default-jvm/jre/lib/security/cacerts -storepass changeit + keytool -import -trustcacerts -keystore /usr/lib/jvm/default-jvm/jre/lib/security/cacerts -storepass changeit -noprompt -alias mycert -file /tmp/cert/server.crt +else + echo "No cert to import" +fi + +echo "running catalina" +catalina.sh run + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 2e50a92..0d279f4 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-05-18T20:14:19Z"; + public static String BUILD_TIME="2017-05-22T21:38:06Z"; } diff --git a/dataone-node/src/main/resources/jargon-beans.xml b/dataone-node/src/main/resources/jargon-beans.xml index 3dbd22b..3199b98 100644 --- a/dataone-node/src/main/resources/jargon-beans.xml +++ b/dataone-node/src/main/resources/jargon-beans.xml @@ -30,12 +30,10 @@ - - - - + + diff --git a/dataone-node/src/main/resources/log4j.properties b/dataone-node/src/main/resources/log4j.properties index 251c3d8..e62d7b6 100644 --- a/dataone-node/src/main/resources/log4j.properties +++ b/dataone-node/src/main/resources/log4j.properties @@ -1,6 +1,6 @@ # Set root logger level to DEBUG and its only appender to A1. # log4j.rootLogger=INFO, A1 -log4j.rootLogger=WARN, A1 +log4j.rootLogger=INFO, A1 # A1 is set to be a ConsoleAppender. log4j.appender.A1=org.apache.log4j.ConsoleAppender diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java index e629082..ad43d2d 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/RestConfiguration.java @@ -8,9 +8,9 @@ */ public class RestConfiguration { - private String irodsHost = "iren2.renci.org"; + private String irodsHost = ""; private int irodsPort = 1247; - private String irodsZone = "dfcmain"; + private String irodsZone = ""; private String defaultStorageResource = ""; private String realm = "dfc-dataone"; private boolean smimeEncryptAdminFunctions = false; @@ -19,6 +19,7 @@ public class RestConfiguration { private String irodsUserName; private String irodsUserPswd; private String pluginJarLocation; + private String authType = ""; /** * Optional URL for a web interface to access grid data (typically an @@ -112,8 +113,7 @@ public boolean isSmimeEncryptAdminFunctions() { * @param smimeEncryptAdminFunctions * the smimeEncryptAdminFunctions to set */ - public void setSmimeEncryptAdminFunctions( - final boolean smimeEncryptAdminFunctions) { + public void setSmimeEncryptAdminFunctions(final boolean smimeEncryptAdminFunctions) { this.smimeEncryptAdminFunctions = smimeEncryptAdminFunctions; } @@ -203,21 +203,17 @@ public String toString() { builder.append("irodsZone=").append(irodsZone).append(", "); } if (defaultStorageResource != null) { - builder.append("defaultStorageResource=") - .append(defaultStorageResource).append(", "); + builder.append("defaultStorageResource=").append(defaultStorageResource).append(", "); } if (realm != null) { builder.append("realm=").append(realm).append(", "); } - builder.append("smimeEncryptAdminFunctions=") - .append(smimeEncryptAdminFunctions).append(", "); + builder.append("smimeEncryptAdminFunctions=").append(smimeEncryptAdminFunctions).append(", "); if (privateCertAbsPath != null) { - builder.append("privateCertAbsPath=").append(privateCertAbsPath) - .append(", "); + builder.append("privateCertAbsPath=").append(privateCertAbsPath).append(", "); } if (publicKeyAbsPath != null) { - builder.append("publicKeyAbsPath=").append(publicKeyAbsPath) - .append(", "); + builder.append("publicKeyAbsPath=").append(publicKeyAbsPath).append(", "); } if (irodsUserName != null) { builder.append("irodsUserName=").append(irodsUserName).append(", "); @@ -226,8 +222,7 @@ public String toString() { builder.append("irodsUserPswd=").append(irodsUserPswd).append(", "); } if (pluginJarLocation != null) { - builder.append("pluginJarLocation=").append(pluginJarLocation) - .append(", "); + builder.append("pluginJarLocation=").append(pluginJarLocation).append(", "); } if (webInterfaceURL != null) { builder.append("webInterfaceURL=").append(webInterfaceURL); @@ -236,4 +231,19 @@ public String toString() { return builder.toString(); } + /** + * @return the authType + */ + public String getAuthType() { + return authType; + } + + /** + * @param authType + * the authType to set + */ + public void setAuthType(String authType) { + this.authType = authType; + } + } From 9e4c587f7f622dbaa390a73566275dcaca7247de Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 24 May 2017 15:44:15 -0400 Subject: [PATCH 47/88] #3 add external lib --- dataone-node/Dockerfile | 10 ++++- dataone-node/pom.xml | 42 ++++++++----------- dataone-node/runit.sh | 12 ++++++ .../jargon/dataone/utils/RestVersion.java | 2 +- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/dataone-node/Dockerfile b/dataone-node/Dockerfile index 901f80a..acc1ef0 100644 --- a/dataone-node/Dockerfile +++ b/dataone-node/Dockerfile @@ -2,7 +2,7 @@ FROM tomcat:jre8-alpine LABEL organization="RENCI" LABEL maintainer="michael_conway@unc.edu" LABEL description="DFC Member Node" -ADD target/dataone-node-4.2.1.0-SNAPSHOT.war /usr/local/tomcat/webapps/ +ADD target/dataone-node.war /usr/local/tomcat/webapps/ ADD runit.sh / CMD ["/runit.sh"] #CMD ["sh"] @@ -10,3 +10,11 @@ CMD ["/runit.sh"] # run: docker run -i -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT + +# to add addl libs -v /localdir:/tmp/lib + + + + + +# docker run -i -p 8080:8080 -v /home/mcc/external:/tmp/external -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT \ No newline at end of file diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 120209f..0cc1dcd 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -29,7 +29,7 @@ org.jboss.resteasy resteasy-jackson-provider - + org.jboss.resteasy tjws test @@ -145,17 +145,9 @@ dataone-utils ${project.version} - + org.xeustechnologies jcl-core @@ -167,6 +159,16 @@ + + maven-war-plugin + 2.5 + + src/main/webapp + true + dataone-node + + + maven-antrun-plugin @@ -227,19 +229,9 @@ - + diff --git a/dataone-node/runit.sh b/dataone-node/runit.sh index 3939730..452f456 100755 --- a/dataone-node/runit.sh +++ b/dataone-node/runit.sh @@ -9,6 +9,18 @@ else echo "No cert to import" fi +echo "augmenting libs" + +if [ -d /tmp/lib ]; +then +echo "additional libs found in /tmp/lib" + cp -R /tmp/lib /usr/local/tomcat +else + echo "No libs to import" +fi + + echo "running catalina" + catalina.sh run diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 0d279f4..bfc33c8 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-05-22T21:38:06Z"; + public static String BUILD_TIME="2017-05-24T19:12:04Z"; } From a97f2066cea930193bfa93f8e633b261e62f4f46 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 24 May 2017 15:51:20 -0400 Subject: [PATCH 48/88] #3 cleanup lib --- dataone-node/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataone-node/Dockerfile b/dataone-node/Dockerfile index acc1ef0..709c68b 100644 --- a/dataone-node/Dockerfile +++ b/dataone-node/Dockerfile @@ -17,4 +17,4 @@ CMD ["/runit.sh"] -# docker run -i -p 8080:8080 -v /home/mcc/external:/tmp/external -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT \ No newline at end of file +# docker run -i -p 8080:8080 -v /home/mcc/external:/tmp/lib -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT \ No newline at end of file From 4efb773ec49717704ace1112a30b9870c82d16b1 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 25 May 2017 08:47:56 -0400 Subject: [PATCH 49/88] #8 mirror props in PublicationContext --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../configuration/PublicationContext.java | 41 +++++++++++++++++-- .../dataone/utils/PropertiesLoader.java | 16 ++++++++ 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index bfc33c8..3a984f3 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-05-24T19:12:04Z"; + public static String BUILD_TIME="2017-05-25T12:41:51Z"; } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PublicationContext.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PublicationContext.java index ae1bf36..e8fea4a 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PublicationContext.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/configuration/PublicationContext.java @@ -3,7 +3,14 @@ */ package org.irods.jargon.dataone.configuration; +import java.util.Properties; + +import javax.annotation.PostConstruct; + import org.irods.jargon.core.pub.IRODSAccessObjectFactory; +import org.irods.jargon.dataone.utils.PropertiesLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -16,10 +23,22 @@ @Component public class PublicationContext { @Autowired - IRODSAccessObjectFactory irodsAccessObjectFactory; + private IRODSAccessObjectFactory irodsAccessObjectFactory; @Autowired - RestConfiguration restConfiguration; + private RestConfiguration restConfiguration; + + private Properties additionalProperties; + + public static final Logger log = LoggerFactory.getLogger(PublicationContext.class); + + @PostConstruct + public void init() { + log.info("init()"); + PropertiesLoader loader = new PropertiesLoader(); + additionalProperties = loader.getProperties(); + log.info("etc properties loaded successfully"); + } /** * @return the irodsAccessObjectFactory @@ -32,8 +51,7 @@ public IRODSAccessObjectFactory getIrodsAccessObjectFactory() { * @param irodsAccessObjectFactory * the irodsAccessObjectFactory to set */ - public void setIrodsAccessObjectFactory( - IRODSAccessObjectFactory irodsAccessObjectFactory) { + public void setIrodsAccessObjectFactory(IRODSAccessObjectFactory irodsAccessObjectFactory) { this.irodsAccessObjectFactory = irodsAccessObjectFactory; } @@ -52,4 +70,19 @@ public void setRestConfiguration(RestConfiguration restConfiguration) { this.restConfiguration = restConfiguration; } + /** + * @return the additionalProperties + */ + public Properties getAdditionalProperties() { + return additionalProperties; + } + + /** + * @param additionalProperties + * the additionalProperties to set + */ + public void setAdditionalProperties(Properties additionalProperties) { + this.additionalProperties = additionalProperties; + } + } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java index 433b1e4..8fd8592 100644 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java +++ b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/PropertiesLoader.java @@ -55,6 +55,22 @@ public PropertiesLoader() { } } + /** + * Get all available properties + * + * @return {@link Properties} configured in etc + */ + public Properties getProperties() { + return properties; + } + + /** + * Get an individual property from etc by key + * + * @param key + * String with the prop key + * @return String with the property value, or null + */ public String getProperty(final String key) { return properties.getProperty(key); } From 9685e9baa5c4093842ac4ada0924be2aa7eb5003 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 25 May 2017 14:59:51 -0400 Subject: [PATCH 50/88] #7 refactor metadata things out of repo --- .../jargon/dataone/tier1/MNReadImpl.java | 121 +++++----------- .../jargon/dataone/utils/RestVersion.java | 2 +- .../utils/DataObjectMetadataUtils.java | 51 ------- .../jargon/dataone/utils/DataTypeUtils.java | 93 ------------ .../dataone/repo/dfc/DfcRepoServiceImpl.java | 134 +++++++++++++++++- .../repo/impl/dummy/DummyRepoServiceImpl.java | 12 ++ .../AbstractDataOneRepoServiceAO.java | 20 +++ .../reposervice/DataOneRepoServiceAO.java | 26 ++++ 8 files changed, 221 insertions(+), 238 deletions(-) delete mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java delete mode 100644 dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java index 8359ffe..323eebc 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/tier1/MNReadImpl.java @@ -1,8 +1,6 @@ package org.irods.jargon.dataone.tier1; -import java.io.BufferedInputStream; import java.io.BufferedOutputStream; -import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.math.BigInteger; @@ -12,10 +10,6 @@ import javax.servlet.http.HttpServletResponse; -import org.apache.tika.detect.DefaultDetector; -import org.apache.tika.metadata.Metadata; -import org.apache.tika.metadata.TikaMetadataKeys; -import org.apache.tika.mime.MediaType; import org.dataone.service.exceptions.InsufficientResources; import org.dataone.service.exceptions.InvalidRequest; import org.dataone.service.exceptions.InvalidToken; @@ -41,16 +35,9 @@ import org.dataone.service.types.v1.Subject; import org.dataone.service.types.v1.SystemMetadata; import org.irods.jargon.core.connection.IRODSAccount; -import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.core.protovalues.FilePermissionEnum; import org.irods.jargon.core.pub.DataObjectAO; -//import org.irods.jargon.dataprofile.DataProfileService; -//import org.irods.jargon.dataprofile.DataTypeResolutionService; -//import org.irods.jargon.dataprofile.DataTypeResolutionServiceImpl; -//import org.irods.jargon.dataprofile.DataProfileServiceImpl; -//import org.irods.jargon.dataprofile.DataProfile; -//import org.irods.jargon.core.pub.Stream2StreamAO; import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.core.pub.domain.UserFilePermission; import org.irods.jargon.core.pub.io.IRODSFile; @@ -63,8 +50,6 @@ import org.irods.jargon.dataone.events.DataOneEventServiceAO; import org.irods.jargon.dataone.reposervice.DataObjectListResponse; import org.irods.jargon.dataone.reposervice.DataOneRepoServiceAO; -import org.irods.jargon.dataone.utils.DataObjectMetadataUtils; -import org.irods.jargon.dataone.utils.DataTypeUtils; import org.irods.jargon.dataone.utils.PropertiesLoader; import org.irods.jargon.pid.pidservice.UniqueIdAO; import org.slf4j.Logger; @@ -105,6 +90,17 @@ public DescribeResponse describe(final Identifier id) Date lastModified; BigInteger serialVersion; IRODSAccount irodsAccount; + DataOneRepoServiceAO repoService; + + // first try and find data object for this id + try { + irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + repoService = pluginDiscoveryService.instanceRepoService(irodsAccount); + } catch (Exception ex) { + log.error("{}", ex.toString()); + throw new ServiceFailure("1390", ex.getMessage()); + } + try { irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); @@ -122,15 +118,9 @@ public DescribeResponse describe(final Identifier id) contentLength = new BigInteger(contentLengthStr); // lastModified = dataObject.getUpdatedAt(); - lastModified = DataObjectMetadataUtils.getStartDateTime(publicationContext.getIrodsAccessObjectFactory(), - irodsAccount, dataObject); - - String format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, - publicationContext.getIrodsAccessObjectFactory(), dataObject); - // use back up if no format stores in dataObject AVU - if (format == null) { - format = getDataObjectMimeType(irodsAccount, dataObject); - } + lastModified = repoService.getLastModifiedDateForDataObject(dataObject); + + String format = repoService.dataObjectFormat(dataObject); formatIdentifier.setValue(format); String csum = dataObject.getChecksum(); @@ -195,7 +185,7 @@ public void streamObject(final HttpServletResponse response, final Identifier id response.setHeader("Content-Disposition", "attachment;filename=" + dataObject.getDataName()); response.setContentLength(contentLength); // response.addHeader("Vary", "Accept-Encoding"); - log.info("reponse: {}", response.toString()); + log.info("response: {}", response.toString()); OutputStream output = new BufferedOutputStream(response.getOutputStream()); @@ -355,9 +345,19 @@ public SystemMetadata getSystemMetadata(final Identifier id) IRODSAccount irodsAccount; Checksum checksum = new Checksum(); + DataOneRepoServiceAO repoService; + // first try and find data object for this id try { irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); + repoService = pluginDiscoveryService.instanceRepoService(irodsAccount); + } catch (Exception ex) { + log.error("{}", ex.toString()); + throw new ServiceFailure("1390", ex.getMessage()); + } + + // first try and find data object for this id + try { UniqueIdAO pidService = pluginDiscoveryService.instanceUniqueIdService(irodsAccount); dataObject = pidService.getDataObjectFromIdentifier(id); @@ -379,11 +379,8 @@ public SystemMetadata getSystemMetadata(final Identifier id) checksum.setAlgorithm(properties.getProperty("irods.dataone.chksum-algorithm")); } - String format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, - publicationContext.getIrodsAccessObjectFactory(), dataObject); - if (format == null) { - format = getDataObjectMimeType(irodsAccount, dataObject); - } + String format = repoService.dataObjectFormat(dataObject); + metadata.setIdentifier(id); ObjectFormatIdentifier formatId = new ObjectFormatIdentifier(); formatId.setValue(format); @@ -439,8 +436,7 @@ public SystemMetadata getSystemMetadata(final Identifier id) // Use AVU epoch date // metadata.setDateUploaded(dataObject.getCreatedAt()); // metadata.setDateSysMetadataModified(dataObject.getUpdatedAt()); - Date startDate = DataObjectMetadataUtils.getStartDateTime(publicationContext.getIrodsAccessObjectFactory(), - irodsAccount, dataObject); + Date startDate = repoService.getLastModifiedDateForDataObject(dataObject); metadata.setDateSysMetadataModified(startDate); metadata.setDateUploaded(startDate); @@ -474,12 +470,13 @@ public ObjectList listObjects(final Date fromDate, final Date toDate, final Obje DataObjectListResponse response = new DataObjectListResponse(); List objectInfoList = new ArrayList<>(); ObjectList objectList = new ObjectList(); + DataOneRepoServiceAO repoService; // first try and find data object for this id try { irodsAccount = RestAuthUtils.getIRODSAccountFromBasicAuthValues(publicationContext.getRestConfiguration()); - DataOneRepoServiceAO repoService = pluginDiscoveryService.instanceRepoService(irodsAccount); + repoService = pluginDiscoveryService.instanceRepoService(irodsAccount); response = repoService.getListOfDataoneExposedDataObjects(fromDate, toDate, formatId, replicaStatus, start, count); } catch (Exception ex) { @@ -502,12 +499,7 @@ public ObjectList listObjects(final Date fromDate, final Date toDate, final Obje String format = null; try { - format = DataTypeUtils.getDataObjectFormatFromMetadata(irodsAccount, - publicationContext.getIrodsAccessObjectFactory(), dObject); - // use back up if no format stores in dataObject AVU - if (format == null) { - format = getDataObjectMimeType(irodsAccount, dObject); - } + format = repoService.dataObjectFormat(dObject); } catch (Exception e1) { log.error(e1.toString()); @@ -522,8 +514,7 @@ public ObjectList listObjects(final Date fromDate, final Date toDate, final Obje Date startDate = new Date(); try { - startDate = DataObjectMetadataUtils.getStartDateTime(publicationContext.getIrodsAccessObjectFactory(), - irodsAccount, dObject); + startDate = repoService.getLastModifiedDateForDataObject(dObject); } catch (Exception e1) { log.error(e1.toString()); log.error("cannot retrieve start date for object: {}", dObject.getAbsolutePath()); @@ -643,52 +634,4 @@ private BigInteger getSerialVersion() { return new BigInteger(verStr); } - private String getDataObjectMimeType(final IRODSAccount irodsAccount, final DataObject dataObject) - throws FileNotFoundException, JargonException { - String mimeType = null; - String filename = dataObject.getAbsolutePath(); - log.info("file name is: {}", filename); - - DefaultDetector typeDetector = new DefaultDetector(); - IRODSFile irodsFile = publicationContext.getIrodsAccessObjectFactory().getIRODSFileFactory(irodsAccount) - .instanceIRODSFile(filename); - IRODSFileInputStream irodsStream = publicationContext.getIrodsAccessObjectFactory() - .getIRODSFileFactory(irodsAccount).instanceIRODSFileInputStream(irodsFile); - InputStream stream = new BufferedInputStream(irodsStream); - Metadata metadata = new Metadata(); - metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, filename); - - MediaType type; - try { - type = typeDetector.detect(stream, metadata); - } catch (IOException e) { - log.error("detect failed: {}", e.toString()); - throw new FileNotFoundException("Cannot stream file in order to detect file type"); - } - - // if mime type is returned as "application/x-netcdf" change to - // DataONE accepted name: "netCDF-4" - mimeType = type.toString(); - if (mimeType.equals("application/x-netcdf")) { - mimeType = "netCDF-4"; - } - - // data-profile stuff removed from jargon!!!!!!! - - // DataTypeResolutionService resolutionService = new - // DataTypeResolutionServiceImpl( - // irodsAccessObjectFactory, irodsAccount); - // DataProfileService dataProfileService = new DataProfileServiceImpl( - // irodsAccessObjectFactory, irodsAccount, resolutionService); - // - // @SuppressWarnings("unchecked") - // DataProfile dataProfile = - // dataProfileService.retrieveDataProfile(dataObject.getAbsolutePath()); - // mimeType = dataProfile.getMimeType(); - - log.info("mime type is: {}", mimeType); - return mimeType; - - } - } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 3a984f3..4f589b5 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-05-25T12:41:51Z"; + public static String BUILD_TIME="2017-05-25T18:54:39Z"; } diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java deleted file mode 100644 index 1858522..0000000 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataObjectMetadataUtils.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.irods.jargon.dataone.utils; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import org.irods.jargon.core.connection.IRODSAccount; -import org.irods.jargon.core.exception.JargonException; -import org.irods.jargon.core.pub.DataObjectAO; -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; -import org.irods.jargon.core.pub.domain.DataObject; -import org.irods.jargon.core.query.AVUQueryElement; -import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; -import org.irods.jargon.core.query.JargonQueryException; -import org.irods.jargon.core.query.MetaDataAndDomainData; -import org.irods.jargon.core.query.QueryConditionOperators; - -public class DataObjectMetadataUtils { - - static public Date getStartDateTime(final IRODSAccessObjectFactory irodsAccessObjectFactory, - final IRODSAccount irodsAccount, final DataObject dObject) throws JargonQueryException, JargonException { - - long epoch = 0; - AVUQueryElement avuQuery = null; - List avuQueryList = new ArrayList(); - List metadataAndDomainDataList = new ArrayList(); - String dateAttr = "StartDateTime"; - - avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, - dateAttr); - avuQueryList.add(avuQuery); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - - metadataAndDomainDataList = dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, - dObject.getAbsolutePath()); - - String value = null; - for (MetaDataAndDomainData data : metadataAndDomainDataList) { - value = data.getAvuValue(); - // just take the 1st one - break; - } - epoch = Long.parseLong(value); - // need to convert it 2 milliseconds for Java date - Date theDate = new Date(epoch * 1000); - - return theDate; - } - -} diff --git a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java b/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java deleted file mode 100644 index 5f01803..0000000 --- a/dataone-utils/src/main/java/org/irods/jargon/dataone/utils/DataTypeUtils.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.irods.jargon.dataone.utils; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import org.apache.tika.detect.DefaultDetector; -import org.apache.tika.metadata.Metadata; -import org.apache.tika.metadata.TikaMetadataKeys; -import org.apache.tika.mime.MediaType; -import org.irods.jargon.core.connection.IRODSAccount; -import org.irods.jargon.core.exception.FileNotFoundException; -import org.irods.jargon.core.exception.JargonException; -import org.irods.jargon.core.pub.DataObjectAO; -import org.irods.jargon.core.pub.IRODSAccessObjectFactory; -import org.irods.jargon.core.pub.domain.DataObject; -import org.irods.jargon.core.pub.io.IRODSFile; -import org.irods.jargon.core.pub.io.IRODSFileInputStream; -import org.irods.jargon.core.query.AVUQueryElement; -import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; -import org.irods.jargon.core.query.JargonQueryException; -import org.irods.jargon.core.query.MetaDataAndDomainData; -import org.irods.jargon.core.query.QueryConditionOperators; - -public class DataTypeUtils { - - // FIXME: consider moving to repo service - - public static String getDataObjectMimeType(final IRODSAccount irodsAccount, - final IRODSAccessObjectFactory irodsAccessObjectFactory, final DataObject dataObject) - throws FileNotFoundException, JargonException { - - String mimeType = null; - String filename = dataObject.getAbsolutePath(); - - DefaultDetector typeDetector = new DefaultDetector(); - IRODSFile irodsFile = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount).instanceIRODSFile(filename); - IRODSFileInputStream irodsStream = irodsAccessObjectFactory.getIRODSFileFactory(irodsAccount) - .instanceIRODSFileInputStream(irodsFile); - InputStream stream = new BufferedInputStream(irodsStream); - Metadata metadata = new Metadata(); - metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, filename); - - MediaType type; - try { - type = typeDetector.detect(stream, metadata); - } catch (IOException e) { - throw new FileNotFoundException("Cannot stream file in order to detect file type"); - } - - // if mime type is returned as "application/x-netcdf" change to - // DataONE accepted name: "netCDF-4" - mimeType = type.toString(); - if (mimeType.equals("application/x-netcdf")) { - mimeType = "netCDF-4"; - } - - return mimeType; - - } - - public static String getDataObjectFormatFromMetadata(final IRODSAccount irodsAccount, - final IRODSAccessObjectFactory irodsAccessObjectFactory, final DataObject dataObject) - throws FileNotFoundException, JargonException, JargonQueryException { - - String dataFormat = null; - String formatAttr = "Format"; - List avuQueryList = new ArrayList<>(); - - AVUQueryElement avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, - QueryConditionOperators.EQUAL, formatAttr); - avuQueryList.add(avuQuery); - - DataObjectAO dataObjectAO = irodsAccessObjectFactory.getDataObjectAO(irodsAccount); - // List result = - // dataObjectAO.findMetadataValuesForDataObject(dataObject.getAbsolutePath()); - List result = dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, - dataObject.getAbsolutePath()); - - for (MetaDataAndDomainData metadata : result) { - if (metadata.getAvuAttribute().equals("Format")) { - dataFormat = metadata.getAvuValue(); - break; - } - } - - return dataFormat; - - } - -} diff --git a/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java b/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java index c3b5f03..e6735b3 100644 --- a/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java +++ b/dfc-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/dfc/DfcRepoServiceImpl.java @@ -3,20 +3,34 @@ */ package org.irods.jargon.dataone.repo.dfc; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; +import org.apache.tika.detect.DefaultDetector; +import org.apache.tika.metadata.Metadata; +import org.apache.tika.metadata.TikaMetadataKeys; +import org.apache.tika.mime.MediaType; import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.core.pub.DataObjectAO; import org.irods.jargon.core.pub.domain.DataObject; +import org.irods.jargon.core.pub.io.IRODSFile; +import org.irods.jargon.core.pub.io.IRODSFileInputStream; +import org.irods.jargon.core.query.AVUQueryElement; +import org.irods.jargon.core.query.AVUQueryElement.AVUQueryPart; import org.irods.jargon.core.query.JargonQueryException; +import org.irods.jargon.core.query.MetaDataAndDomainData; +import org.irods.jargon.core.query.QueryConditionOperators; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoServiceAO; import org.irods.jargon.dataone.reposervice.DataObjectListResponse; -import org.irods.jargon.dataone.utils.DataTypeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,7 +60,7 @@ public DataObjectListResponse getListOfDataoneExposedDataObjects(final Date from List ids = getListOfDataoneExposedIdentifiers(); log.info("finding list of data objects with list of {} identifiers", ids.size()); - + // TODO: what is this? for (Identifier id : ids) { DataObject dataObject; dataObject = null; // TODO://recast @@ -117,8 +131,7 @@ private boolean matchesToDate(final Date toDate, final Date dataObjectModDate) { private boolean matchesFormatId(final ObjectFormatIdentifier formatId, final DataObject dataObject) throws JargonException, JargonQueryException { - String dataFormat = DataTypeUtils.getDataObjectFormatFromMetadata(getIrodsAccount(), - this.getPublicationContext().getIrodsAccessObjectFactory(), dataObject); + String dataFormat = dataObjectFormat(dataObject); if ((formatId.getValue() == null) || (formatId.getValue().equals(dataFormat))) { return true; @@ -138,6 +151,7 @@ private boolean matchesReplicaStatus(final Boolean replicaStatus) { return false; } + // TODO: do we need this method? @Override public List getListOfDataoneExposedIdentifiers() throws JargonException { @@ -147,4 +161,116 @@ public List getListOfDataoneExposedIdentifiers() throws JargonExcept return identifiers; } + @Override + public Date getLastModifiedDateForDataObject(DataObject dataObject) throws JargonException { + long epoch = 0; + AVUQueryElement avuQuery = null; + List avuQueryList = new ArrayList<>(); + List metadataAndDomainDataList = new ArrayList<>(); + String dateAttr = "StartDateTime"; + + try { + avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, QueryConditionOperators.EQUAL, + dateAttr); + avuQueryList.add(avuQuery); + + DataObjectAO dataObjectAO = this.getPublicationContext().getIrodsAccessObjectFactory() + .getDataObjectAO(this.getIrodsAccount()); + + metadataAndDomainDataList = dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, + dataObject.getAbsolutePath()); + } catch (JargonQueryException e) { + log.error("error querying metadata", e); + throw new JargonException(e); + } + + String value = null; + for (MetaDataAndDomainData data : metadataAndDomainDataList) { + value = data.getAvuValue(); + // just take the 1st one + break; + } + epoch = Long.parseLong(value); + // need to convert it 2 milliseconds for Java date + Date theDate = new Date(epoch * 1000); + + return theDate; + } + + @Override + public String dataObjectFormat(DataObject dataObject) throws FileNotFoundException, JargonException { + String format = getDataObjectFormatFromMetadata(dataObject); + if (format == null) { + format = getDataObjectMimeType(dataObject); + } + + return format; + + } + + private String getDataObjectMimeType(DataObject dataObject) throws JargonException { + String mimeType = null; + String filename = dataObject.getAbsolutePath(); + + DefaultDetector typeDetector = new DefaultDetector(); + IRODSFile irodsFile = this.getPublicationContext().getIrodsAccessObjectFactory() + .getIRODSFileFactory(this.getIrodsAccount()).instanceIRODSFile(filename); + IRODSFileInputStream irodsStream = this.getPublicationContext().getIrodsAccessObjectFactory() + .getIRODSFileFactory(this.getIrodsAccount()).instanceIRODSFileInputStream(irodsFile); + InputStream stream = new BufferedInputStream(irodsStream); + Metadata metadata = new Metadata(); + metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, filename); + + MediaType type; + try { + type = typeDetector.detect(stream, metadata); + } catch (IOException e) { + throw new FileNotFoundException("Cannot stream file in order to detect file type"); + } + + // if mime type is returned as "application/x-netcdf" change to + // DataONE accepted name: "netCDF-4" + mimeType = type.toString(); + if (mimeType.equals("application/x-netcdf")) { + mimeType = "netCDF-4"; + } + + return mimeType; + } + + private String getDataObjectFormatFromMetadata(final DataObject dataObject) + throws FileNotFoundException, JargonException { + + String dataFormat = null; + String formatAttr = "Format"; + List avuQueryList = new ArrayList<>(); + + // List result = + // dataObjectAO.findMetadataValuesForDataObject(dataObject.getAbsolutePath()); + List result; + try { + AVUQueryElement avuQuery = AVUQueryElement.instanceForValueQuery(AVUQueryPart.ATTRIBUTE, + QueryConditionOperators.EQUAL, formatAttr); + avuQueryList.add(avuQuery); + + DataObjectAO dataObjectAO = this.getPublicationContext().getIrodsAccessObjectFactory() + .getDataObjectAO(this.getIrodsAccount()); + result = dataObjectAO.findMetadataValuesForDataObjectUsingAVUQuery(avuQueryList, + dataObject.getAbsolutePath()); + } catch (JargonQueryException e) { + log.error("metadata query error", e); + throw new JargonException("cannot query for metadata", e); + } + + for (MetaDataAndDomainData metadata : result) { + if (metadata.getAvuAttribute().equals("Format")) { + dataFormat = metadata.getAvuValue(); + break; + } + } + + return dataFormat; + + } + } diff --git a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java index 406a0ab..a5de89f 100644 --- a/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java +++ b/dummy-repo-service-impl/src/main/java/org/irods/jargon/dataone/repo/impl/dummy/DummyRepoServiceImpl.java @@ -9,7 +9,9 @@ import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoServiceAO; import org.irods.jargon.dataone.reposervice.DataObjectListResponse; @@ -44,4 +46,14 @@ public List getListOfDataoneExposedIdentifiers() throws JargonExcept return null; } + @Override + public Date getLastModifiedDateForDataObject(DataObject dataObject) throws JargonException { + return new Date(); + } + + @Override + public String dataObjectFormat(DataObject dataObject) throws FileNotFoundException, JargonException { + return ""; + } + } diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoServiceAO.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoServiceAO.java index d2974bd..e394f5b 100644 --- a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoServiceAO.java +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/AbstractDataOneRepoServiceAO.java @@ -9,7 +9,9 @@ import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.ObjectFormatIdentifier; import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.core.pub.domain.DataObject; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.plugin.AbstractDataOnePlugin; @@ -57,4 +59,22 @@ public abstract DataObjectListResponse getListOfDataoneExposedDataObjects(Date f ObjectFormatIdentifier formatId, Boolean replicaStatus, Integer start, Integer count) throws JargonException; + /* + * (non-Javadoc) + * + * @see org.irods.jargon.dataone.reposervice.DataOneRepoServiceAO# + * getLastModifiedDateForDataObject(org.irods.jargon.core.pub.domain. + * DataObject) + */ + @Override + public abstract Date getLastModifiedDateForDataObject(DataObject dataObject) throws JargonException; + + /* + * (non-Javadoc) + * + * @see org.irods.jargon.dataone.reposervice.DataOneRepoServiceAO# + * dataObjectFormat(org.irods.jargon.core.pub.domain.DataObject) + */ + @Override + public abstract String dataObjectFormat(DataObject dataObject) throws FileNotFoundException, JargonException; } diff --git a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceAO.java b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceAO.java index c4e82a6..cc91706 100644 --- a/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceAO.java +++ b/repo-service-api/src/main/java/org/irods/jargon/dataone/reposervice/DataOneRepoServiceAO.java @@ -5,7 +5,9 @@ import org.dataone.service.types.v1.Identifier; import org.dataone.service.types.v1.ObjectFormatIdentifier; +import org.irods.jargon.core.exception.FileNotFoundException; import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.core.pub.domain.DataObject; /** * Abstraction of management of the DataOne repository (objects to list, @@ -35,4 +37,28 @@ public DataObjectListResponse getListOfDataoneExposedDataObjects(Date fromDate, ObjectFormatIdentifier formatId, Boolean replicaStatus, Integer start, Integer count) throws JargonException; + /** + * TODO:// why is this not just last mod from data object? mcc + * + * Get last modified data for a data object + * + * @param dataObject + * {@link DataObject} to determine mod date + * @return {@link Date} last modded + * @throws JargonException + */ + public Date getLastModifiedDateForDataObject(final DataObject dataObject) throws JargonException; + + /** + * Get a string representing the MIME type of the data object using the + * technique or metadata in the target system + * + * @param dataObject + * {@link DataObject} + * @return String with the MIME type + * @throws FileNotFoundException + * @throws JargonException + */ + public String dataObjectFormat(final DataObject dataObject) throws FileNotFoundException, JargonException; + } From 6c3819193a4e6a2e024206cf0fdbed28a6a7c069 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 2 Jun 2017 09:28:18 -0400 Subject: [PATCH 51/88] #9 add default event service --- .../jargon/dataone/utils/RestVersion.java | 2 +- default-event-service/pom.xml | 89 +++++++++++++++++++ .../src/main/java/.gitinclude | 0 .../src/main/resources/.gitinclude | 0 .../src/test/java/.gitinclude | 0 pom.xml | 22 +++++ 6 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 default-event-service/pom.xml create mode 100644 default-event-service/src/main/java/.gitinclude create mode 100644 default-event-service/src/main/resources/.gitinclude create mode 100644 default-event-service/src/test/java/.gitinclude diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 4f589b5..7161b58 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-05-25T18:54:39Z"; + public static String BUILD_TIME="2017-06-02T13:26:07Z"; } diff --git a/default-event-service/pom.xml b/default-event-service/pom.xml new file mode 100644 index 0000000..acc39f1 --- /dev/null +++ b/default-event-service/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + default-event-service + + org.irods + dfc-dataone + 4.2.1.0-SNAPSHOT + + jar + Default event service + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.irods + dataone-utils + ${project.version} + + + org.springframework + spring-test + + + org.springframework + spring-context + + + org.springframework + spring-beans + + + org.springframework + spring-orm + + + org.hibernate + hibernate-core + + + org.hibernate + hibernate-annotations + + + org.springframework + spring-core + + + org.springframework + spring-aop + + + org.springframework + spring-jdbc + + + org.springframework + spring-tx + + + javax.persistence + persistence-api + + + + diff --git a/default-event-service/src/main/java/.gitinclude b/default-event-service/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/default-event-service/src/main/resources/.gitinclude b/default-event-service/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/default-event-service/src/test/java/.gitinclude b/default-event-service/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml index d3ce6b6..3c081a8 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,9 @@ DFC DataONE Adapter Framework DataONE Member Node service and supporting libraries https://code.renci.org/gf/project/dfc-dataone/ + + ${spring.core.version} + gForge https://code.renci.org/gf/project/dfc-dataone/tracker/ @@ -72,6 +75,24 @@ reflections 0.9.10 + + + org.springframework.integration + spring-integration-core + ${spring.integration.version} + + + + org.springframework.integration + spring-integration-stream + ${spring.integration.version} + + + + org.springframework.integration + spring-integration-amqp + ${spring.integration.version} + @@ -113,5 +134,6 @@ dummy-event-service-impl dummy-pid-service-impl dfc-repo-service-impl + default-event-service From 0444aa58dcdeaabb3018674859a509eaf7e26d73 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 2 Jun 2017 09:59:57 -0400 Subject: [PATCH 52/88] #9 break out event service --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../default-event-service-api-impl/pom.xml | 38 ++++++++ .../src/main/java/.gitinclude | 0 .../src/main/resources/.gitinclude | 0 .../src/test/java/.gitinclude | 0 .../default-event-service-indexer/pom.xml | 32 +++++++ .../src/main/java/.gitinclude | 0 .../src/main/resources/.gitinclude | 0 .../src/test/java/.gitinclude | 0 .../default-event-service-persist/pom.xml | 88 +++++++++++++++++++ .../src/main/java/.gitinclude | 0 .../src/main/resources/.gitinclude | 0 .../src/test/java/.gitinclude | 0 default-event-service/pom.xml | 85 ++---------------- 14 files changed, 166 insertions(+), 79 deletions(-) create mode 100644 default-event-service/default-event-service-api-impl/pom.xml rename default-event-service/{ => default-event-service-api-impl}/src/main/java/.gitinclude (100%) rename default-event-service/{ => default-event-service-api-impl}/src/main/resources/.gitinclude (100%) rename default-event-service/{ => default-event-service-api-impl}/src/test/java/.gitinclude (100%) create mode 100644 default-event-service/default-event-service-indexer/pom.xml create mode 100644 default-event-service/default-event-service-indexer/src/main/java/.gitinclude create mode 100644 default-event-service/default-event-service-indexer/src/main/resources/.gitinclude create mode 100644 default-event-service/default-event-service-indexer/src/test/java/.gitinclude create mode 100644 default-event-service/default-event-service-persist/pom.xml create mode 100644 default-event-service/default-event-service-persist/src/main/java/.gitinclude create mode 100644 default-event-service/default-event-service-persist/src/main/resources/.gitinclude create mode 100644 default-event-service/default-event-service-persist/src/test/java/.gitinclude diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 7161b58..f827d01 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-02T13:26:07Z"; + public static String BUILD_TIME="2017-06-02T13:58:24Z"; } diff --git a/default-event-service/default-event-service-api-impl/pom.xml b/default-event-service/default-event-service-api-impl/pom.xml new file mode 100644 index 0000000..f33a19b --- /dev/null +++ b/default-event-service/default-event-service-api-impl/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + default-event-service-api-impl + + org.irods + default-event-service + 4.2.1.0-SNAPSHOT + + jar + Default event service api implementation + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.irods + dataone-utils + ${project.version} + + + diff --git a/default-event-service/src/main/java/.gitinclude b/default-event-service/default-event-service-api-impl/src/main/java/.gitinclude similarity index 100% rename from default-event-service/src/main/java/.gitinclude rename to default-event-service/default-event-service-api-impl/src/main/java/.gitinclude diff --git a/default-event-service/src/main/resources/.gitinclude b/default-event-service/default-event-service-api-impl/src/main/resources/.gitinclude similarity index 100% rename from default-event-service/src/main/resources/.gitinclude rename to default-event-service/default-event-service-api-impl/src/main/resources/.gitinclude diff --git a/default-event-service/src/test/java/.gitinclude b/default-event-service/default-event-service-api-impl/src/test/java/.gitinclude similarity index 100% rename from default-event-service/src/test/java/.gitinclude rename to default-event-service/default-event-service-api-impl/src/test/java/.gitinclude diff --git a/default-event-service/default-event-service-indexer/pom.xml b/default-event-service/default-event-service-indexer/pom.xml new file mode 100644 index 0000000..aca57c2 --- /dev/null +++ b/default-event-service/default-event-service-indexer/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + default-event-service-indexer + + org.irods + default-event-service + 4.2.1.0-SNAPSHOT + + jar + Default event service + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + diff --git a/default-event-service/default-event-service-indexer/src/main/java/.gitinclude b/default-event-service/default-event-service-indexer/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/default-event-service/default-event-service-indexer/src/main/resources/.gitinclude b/default-event-service/default-event-service-indexer/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/default-event-service/default-event-service-indexer/src/test/java/.gitinclude b/default-event-service/default-event-service-indexer/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/default-event-service/default-event-service-persist/pom.xml b/default-event-service/default-event-service-persist/pom.xml new file mode 100644 index 0000000..1e1a8a3 --- /dev/null +++ b/default-event-service/default-event-service-persist/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + default-event-service-persist + + org.irods + default-event-service + 4.2.1.0-SNAPSHOT + + jar + Default event service persistence + + + org.irods.jargon + jargon-core + ${project.version} + + + + junit + junit + test + + + org.slf4j + slf4j-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + org.irods + dataone-utils + ${project.version} + + + org.springframework + spring-test + + + org.springframework + spring-context + + + org.springframework + spring-beans + + + org.springframework + spring-orm + + + org.hibernate + hibernate-core + + + org.hibernate + hibernate-annotations + + + org.springframework + spring-core + + + org.springframework + spring-aop + + + org.springframework + spring-jdbc + + + org.springframework + spring-tx + + + javax.persistence + persistence-api + + + diff --git a/default-event-service/default-event-service-persist/src/main/java/.gitinclude b/default-event-service/default-event-service-persist/src/main/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/default-event-service/default-event-service-persist/src/main/resources/.gitinclude b/default-event-service/default-event-service-persist/src/main/resources/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/default-event-service/default-event-service-persist/src/test/java/.gitinclude b/default-event-service/default-event-service-persist/src/test/java/.gitinclude new file mode 100644 index 0000000..e69de29 diff --git a/default-event-service/pom.xml b/default-event-service/pom.xml index acc39f1..1bec38d 100644 --- a/default-event-service/pom.xml +++ b/default-event-service/pom.xml @@ -8,82 +8,11 @@ dfc-dataone 4.2.1.0-SNAPSHOT - jar - Default event service - - - org.irods.jargon - jargon-core - ${project.version} - - - - junit - junit - test - - - org.slf4j - slf4j-api - - - log4j - log4j - - - org.slf4j - slf4j-log4j12 - - - org.irods - dataone-utils - ${project.version} - - - org.springframework - spring-test - - - org.springframework - spring-context - - - org.springframework - spring-beans - - - org.springframework - spring-orm - - - org.hibernate - hibernate-core - - - org.hibernate - hibernate-annotations - - - org.springframework - spring-core - - - org.springframework - spring-aop - - - org.springframework - spring-jdbc - - - org.springframework - spring-tx - - - javax.persistence - persistence-api - - - + pom + Default event service parent + + default-event-service-persist + default-event-service-indexer + default-event-service-api-impl + From 2ca98547ac721c59c13b6d83dce1f3fea7ad54ae Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 2 Jun 2017 12:13:46 -0400 Subject: [PATCH 53/88] #9 init table schema --- .../default-event-service-persist/README.md | 44 +++++++++++++++++++ .../event/persist/dao/domain/AccessLog.java | 38 ++++++++++++++++ .../persist/dao/domain/package-info.java | 10 +++++ .../def/event/persist/package-info.java | 10 +++++ 4 files changed, 102 insertions(+) create mode 100644 default-event-service/default-event-service-persist/README.md create mode 100644 default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java create mode 100644 default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/package-info.java create mode 100644 default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/package-info.java diff --git a/default-event-service/default-event-service-persist/README.md b/default-event-service/default-event-service-persist/README.md new file mode 100644 index 0000000..83a5b9b --- /dev/null +++ b/default-event-service/default-event-service-persist/README.md @@ -0,0 +1,44 @@ +## Database setup notes + +If you don't have an IRODS-EXT extensions db, add one and a user + +``` +$ (sudo) su - postgres +postgres$ psql +psql> CREATE USER irodsext WITH PASSWORD 'password'; +psql> CREATE DATABASE "IRODS-EXT"; +psql> GRANT ALL PRIVILEGES ON DATABASE "IRODS-EXT" TO irodsext; + +``` + + +Create the table for the event log + +``` + +CREATE TABLE IF NOT EXISTS access_log ( id BIGSERIAL PRIMARY KEY, file_key VARCHAR(1024) NOT NULL, event_id VARCHAR(30) NOT NULL, event_detail VARCHAR(200) NULL, access_principal VARCHAR(50) NULL, date_added TIMESTAMP DEFAULT NULL ); + + +``` + +(no other indexes yet...may add) + +yields + +``` + ^ +IRODS-EXT=# \d access_log + Table "public.access_log" + Column | Type | Modifiers +------------------+-----------------------------+--------------------------------------------------------- + id | bigint | not null default nextval('access_log_id_seq'::regclass) + file_key | character varying(1024) | not null + event_id | character varying(30) | not null + event_detail | character varying(200) | + access_principal | character varying(50) | + date_added | timestamp without time zone | +Indexes: + "access_log_pkey" PRIMARY KEY, btree (id) + + +``` \ No newline at end of file diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java new file mode 100644 index 0000000..99170ec --- /dev/null +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -0,0 +1,38 @@ +/** + * + */ +package org.irods.jargon.dataone.def.event.persist.dao.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; + +/** + * + * @author mcc + * + */ +@Entity +@Table(name = "access_log") +public class AccessLog { + + @Id + @SequenceGenerator(name = "access_log_id_seq", sequenceName = "access_log_id_seq") + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "access_log_id_seq") + @Column(name = "id", unique = true, nullable = false) + private Long id; + + @Column(name = "file_key", length = 1024, nullable = false) + private String fileKey; + + /** + * + */ + public AccessLog() { + } + +} diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/package-info.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/package-info.java new file mode 100644 index 0000000..29e531d --- /dev/null +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/package-info.java @@ -0,0 +1,10 @@ +/** + * + */ +/** + * Persistance daos representing data in event service db + * + * @author mcc + * + */ +package org.irods.jargon.dataone.def.event.persist.dao.domain; \ No newline at end of file diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/package-info.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/package-info.java new file mode 100644 index 0000000..a374111 --- /dev/null +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/package-info.java @@ -0,0 +1,10 @@ +/** + * + */ +/** + * Persistence for event service + * + * @author mcc + * + */ +package org.irods.jargon.dataone.def.event.persist; \ No newline at end of file From 89fd8263349ac899ac7adcabc8c768d800783156 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 2 Jun 2017 14:00:08 -0400 Subject: [PATCH 54/88] #9 adding dao --- .../def/event/persist/dao/AccessLogDAO.java | 58 ++++++++ .../event/persist/dao/domain/AccessLog.java | 137 ++++++++++++++++++ .../def/event/persist/dao/package-info.java | 10 ++ .../dataone/events/EventLoggingException.java | 68 +++++++++ 4 files changed, 273 insertions(+) create mode 100644 default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java create mode 100644 default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/package-info.java create mode 100644 event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLoggingException.java diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java new file mode 100644 index 0000000..c581f8e --- /dev/null +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java @@ -0,0 +1,58 @@ +/** + * + */ +package org.irods.jargon.dataone.def.event.persist.dao; + +import java.security.KeyStore; + +/** + * DAO for KeyStore managing the stored 'pass phrase' for the + * transfer database. + *

      + * The GridAccount preserves account information for transfers and + * synchs, and also allows preserving and automatically logging in to remembered + * grids. Note that this uses a scheme of encrypted passwords based on a global + * 'pass phrase' which must be provided for the various operations. In this way, + * passwords are always encrypted for all operations. + *

      + * This KeyStore holds a hash of the pass phrase used by the + * transfer manager user, and can verify the correct pass phrase. Note the + * actual pass phrase, and any unencrypted password information, is not found in + * the transfer database. + * + * @author Mike Conway - DICE (www.irods.org) + * + */ +public interface AccessLogDAO { + + /** + * Save the KeyStore entry in the transfer database + * + * @param keyStore + * {@link KeyStore} entry containing the hash of the pass phrase + * @throws TransferDAOException + */ + void save(KeyStore keyStore) throws TransferDAOException; + + /** + * Find the KeyStore associated with the given key. Note that + * null will be returned if it cannot be found. + * + * @param id + * String with the desired key + * @return {@link KeyStore} associated with the key + * @throws TransferDAOException + * if the record cannot be found + */ + KeyStore findById(String id) throws TransferDAOException; + + /** + * Delete the given KeyStore + * + * @param keyStore + * {@link KeyStore} to be deleted + * @throws TransferDAOException + */ + void delete(KeyStore keyStore) throws TransferDAOException; + +} diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index 99170ec..67a8b16 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -3,6 +3,8 @@ */ package org.irods.jargon.dataone.def.event.persist.dao.domain; +import java.util.Date; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -10,6 +12,7 @@ import javax.persistence.Id; import javax.persistence.SequenceGenerator; import javax.persistence.Table; +import javax.persistence.Temporal; /** * @@ -29,10 +32,144 @@ public class AccessLog { @Column(name = "file_key", length = 1024, nullable = false) private String fileKey; + @Column(name = "event_id", length = 30, nullable = true) + private String eventId; + + @Column(name = "event_detail", length = 200, nullable = true) + private String eventDetail; + + @Column(name = "access_principal", length = 50, nullable = true) + private String accessPrincipal; + + @Column(name = "date_added") + @Temporal(javax.persistence.TemporalType.TIMESTAMP) + private Date dateAdded; + /** * */ public AccessLog() { } + /** + * @return the id + */ + public Long getId() { + return id; + } + + /** + * @param id + * the id to set + */ + public void setId(Long id) { + this.id = id; + } + + /** + * @return the fileKey + */ + public String getFileKey() { + return fileKey; + } + + /** + * @param fileKey + * the fileKey to set + */ + public void setFileKey(String fileKey) { + this.fileKey = fileKey; + } + + /** + * @return the eventId + */ + public String getEventId() { + return eventId; + } + + /** + * @param eventId + * the eventId to set + */ + public void setEventId(String eventId) { + this.eventId = eventId; + } + + /** + * @return the eventDetail + */ + public String getEventDetail() { + return eventDetail; + } + + /** + * @param eventDetail + * the eventDetail to set + */ + public void setEventDetail(String eventDetail) { + this.eventDetail = eventDetail; + } + + /** + * @return the accessPrincipal + */ + public String getAccessPrincipal() { + return accessPrincipal; + } + + /** + * @param accessPrincipal + * the accessPrincipal to set + */ + public void setAccessPrincipal(String accessPrincipal) { + this.accessPrincipal = accessPrincipal; + } + + /** + * @return the dateAdded + */ + public Date getDateAdded() { + return dateAdded; + } + + /** + * @param dateAdded + * the dateAdded to set + */ + public void setDateAdded(Date dateAdded) { + this.dateAdded = dateAdded; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("AccessLog ["); + if (id != null) { + builder.append("id=").append(id).append(", "); + } + if (fileKey != null) { + builder.append("fileKey=").append(fileKey).append(", "); + } + if (eventId != null) { + builder.append("eventId=").append(eventId).append(", "); + } + if (eventDetail != null) { + builder.append("eventDetail=").append(eventDetail).append(", "); + } + if (accessPrincipal != null) { + builder.append("accessPrincipal=").append(accessPrincipal).append(", "); + } + if (dateAdded != null) { + builder.append("dateAdded=").append(dateAdded); + } + builder.append("]"); + return builder.toString(); + } + } diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/package-info.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/package-info.java new file mode 100644 index 0000000..3c09706 --- /dev/null +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/package-info.java @@ -0,0 +1,10 @@ +/** + * + */ +/** + * DAO layer for event logging + * + * @author mcc + * + */ +package org.irods.jargon.dataone.def.event.persist.dao; \ No newline at end of file diff --git a/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLoggingException.java b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLoggingException.java new file mode 100644 index 0000000..7a1a854 --- /dev/null +++ b/event-service-api/src/main/java/org/irods/jargon/dataone/events/EventLoggingException.java @@ -0,0 +1,68 @@ +/** + * + */ +package org.irods.jargon.dataone.events; + +import org.irods.jargon.core.exception.JargonException; + +/** + * Exception in event logging + * + * @author mcc + * + */ +public class EventLoggingException extends JargonException { + + /** + * + */ + private static final long serialVersionUID = -5743883673770774132L; + + /** + * @param message + */ + public EventLoggingException(String message) { + super(message); + } + + /** + * @param message + * @param cause + */ + public EventLoggingException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param cause + */ + public EventLoggingException(Throwable cause) { + super(cause); + } + + /** + * @param message + * @param cause + * @param underlyingIRODSExceptionCode + */ + public EventLoggingException(String message, Throwable cause, int underlyingIRODSExceptionCode) { + super(message, cause, underlyingIRODSExceptionCode); + } + + /** + * @param cause + * @param underlyingIRODSExceptionCode + */ + public EventLoggingException(Throwable cause, int underlyingIRODSExceptionCode) { + super(cause, underlyingIRODSExceptionCode); + } + + /** + * @param message + * @param underlyingIRODSExceptionCode + */ + public EventLoggingException(String message, int underlyingIRODSExceptionCode) { + super(message, underlyingIRODSExceptionCode); + } + +} From 22b1c94e08235cc48d8a042d2148c71159400b74 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 2 Jun 2017 14:09:05 -0400 Subject: [PATCH 55/88] #9 adding dao --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../def/event/persist/dao/AccessLogDAO.java | 49 +++++++------------ 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index f827d01..96e1c39 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-02T13:58:24Z"; + public static String BUILD_TIME="2017-06-02T18:08:41Z"; } diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java index c581f8e..d30104f 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java @@ -3,56 +3,43 @@ */ package org.irods.jargon.dataone.def.event.persist.dao; -import java.security.KeyStore; +import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; +import org.irods.jargon.dataone.events.EventLoggingException; /** - * DAO for KeyStore managing the stored 'pass phrase' for the - * transfer database. - *

      - * The GridAccount preserves account information for transfers and - * synchs, and also allows preserving and automatically logging in to remembered - * grids. Note that this uses a scheme of encrypted passwords based on a global - * 'pass phrase' which must be provided for the various operations. In this way, - * passwords are always encrypted for all operations. - *

      - * This KeyStore holds a hash of the pass phrase used by the - * transfer manager user, and can verify the correct pass phrase. Note the - * actual pass phrase, and any unencrypted password information, is not found in - * the transfer database. + * DAO interface for Access log * - * @author Mike Conway - DICE (www.irods.org) + * @author Mike Conway * */ public interface AccessLogDAO { /** - * Save the KeyStore entry in the transfer database + * Save the AccessLog entry in the audit database * - * @param keyStore - * {@link KeyStore} entry containing the hash of the pass phrase + * @param accessLog + * {@link AccessLog} entry containing the event * @throws TransferDAOException */ - void save(KeyStore keyStore) throws TransferDAOException; + void save(AccessLog accessLog) throws EventLoggingException; /** - * Find the KeyStore associated with the given key. Note that - * null will be returned if it cannot be found. + * locate the access log entry by ID * * @param id - * String with the desired key - * @return {@link KeyStore} associated with the key - * @throws TransferDAOException - * if the record cannot be found + * Long with the access id + * @return {@link AccessLog} or null + * @throws EventLoggingException */ - KeyStore findById(String id) throws TransferDAOException; + AccessLog findById(Long id) throws EventLoggingException; /** - * Delete the given KeyStore + * Delete the given entry * - * @param keyStore - * {@link KeyStore} to be deleted - * @throws TransferDAOException + * @param accessLog + * {@link AccessLog} to delete + * @throws EventLoggingException */ - void delete(KeyStore keyStore) throws TransferDAOException; + void delete(AccessLog accessLog) throws EventLoggingException; } From 131878e260a89a0861fe21e09e8530c6a46ba5f4 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 2 Jun 2017 16:29:31 -0400 Subject: [PATCH 56/88] #9 basics of indexing service --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../default-event-service-api-impl/pom.xml | 10 +++ .../defdb/DefaultEventServiceAOImpl.java | 65 ++++++++++++++ .../dataone/events/defdb/package-info.java | 10 +++ .../default-event-service-indexer/pom.xml | 41 +++++++++ .../events/def/indexer/EventIndexer.java | 35 ++++++++ .../events/def/indexer/package-info.java | 9 ++ .../event-dao-hibernate-spring.cfg.xml | 9 ++ .../main/resources/event-service-beans.xml | 66 ++++++++++++++ .../src/main/resources/event.properties | 4 + .../event/persist/dao/AccessLogDAOImpl.java | 87 +++++++++++++++++++ 11 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java create mode 100644 default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/package-info.java create mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java create mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/package-info.java create mode 100644 default-event-service/default-event-service-indexer/src/main/resources/event-dao-hibernate-spring.cfg.xml create mode 100644 default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml create mode 100644 default-event-service/default-event-service-indexer/src/main/resources/event.properties create mode 100644 default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 96e1c39..5b2fd5d 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-02T18:08:41Z"; + public static String BUILD_TIME="2017-06-02T19:55:06Z"; } diff --git a/default-event-service/default-event-service-api-impl/pom.xml b/default-event-service/default-event-service-api-impl/pom.xml index f33a19b..2f86f4a 100644 --- a/default-event-service/default-event-service-api-impl/pom.xml +++ b/default-event-service/default-event-service-api-impl/pom.xml @@ -34,5 +34,15 @@ dataone-utils ${project.version} + + org.irods + dataone-utils + ${project.version} + + + org.irods + event-service-api + ${project.version} + diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java new file mode 100644 index 0000000..ebc63f2 --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java @@ -0,0 +1,65 @@ +/** + * + */ +package org.irods.jargon.dataone.events.defdb; + +import java.util.Date; + +import org.dataone.service.exceptions.ServiceFailure; +import org.dataone.service.types.v1.Event; +import org.dataone.service.types.v1.Identifier; +import org.dataone.service.types.v1.Log; +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.core.exception.InvalidArgumentException; +import org.irods.jargon.core.exception.JargonException; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.events.AbstractEventServiceAO; +import org.irods.jargon.dataone.events.EventsEnum; + +/** + * Persistence based event service + * + * @author mcc + * + */ +public class DefaultEventServiceAOImpl extends AbstractEventServiceAO { + + /** + * @param irodsAccount + * @param publicationContext + */ + public DefaultEventServiceAOImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { + super(irodsAccount, publicationContext); + // TODO Auto-generated constructor stub + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.events.AbstractEventServiceAO#getLogs(java.util. + * Date, java.util.Date, org.irods.jargon.dataone.events.EventsEnum, + * java.lang.String, int, int) + */ + @Override + public Log getLogs(Date arg0, Date arg1, EventsEnum arg2, String arg3, int arg4, int arg5) { + // TODO Auto-generated method stub + return null; + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.events.AbstractEventServiceAO#recordEvent(org. + * dataone.service.types.v1.Event, org.dataone.service.types.v1.Identifier, + * java.lang.String) + */ + @Override + public void recordEvent(Event arg0, Identifier arg1, String arg2) + throws InvalidArgumentException, JargonException, ServiceFailure { + // TODO Auto-generated method stub + + } + +} diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/package-info.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/package-info.java new file mode 100644 index 0000000..de5fa78 --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/package-info.java @@ -0,0 +1,10 @@ +/** + * + */ +/** + * Database persistence of events + * + * @author mcc + * + */ +package org.irods.jargon.dataone.events.defdb; \ No newline at end of file diff --git a/default-event-service/default-event-service-indexer/pom.xml b/default-event-service/default-event-service-indexer/pom.xml index aca57c2..a33d4a6 100644 --- a/default-event-service/default-event-service-indexer/pom.xml +++ b/default-event-service/default-event-service-indexer/pom.xml @@ -28,5 +28,46 @@ org.slf4j slf4j-log4j12 + + org.irods + default-event-service-persist + ${project.version} + + + org.springframework.integration + spring-integration-core + + + org.irods.jargon + jargon-core + ${project.version} + + + org.springframework.boot + spring-boot-starter-actuator + + + org.slf4j + log4j-over-slf4j + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.integration + spring-integration-core + + + org.springframework.integration + spring-integration-stream + + + org.springframework.integration + spring-integration-amqp + diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java new file mode 100644 index 0000000..a7608d7 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java @@ -0,0 +1,35 @@ +/** + * + */ +package org.irods.jargon.dataone.events.def.indexer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.ImportResource; + +/** + * Master flow core + * + * @author mcc + * + */ + +@SpringBootApplication +@ImportResource("/integration.xml") +public class EventIndexer { + + /** + * + */ + public EventIndexer() { + } + + public static void main(String[] args) throws Exception { + ConfigurableApplicationContext ctx = new SpringApplication(EventIndexer.class).run(args); + System.out.println("Hit Enter to terminate"); + System.in.read(); + ctx.close(); + } + +} diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/package-info.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/package-info.java new file mode 100644 index 0000000..c41fde5 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/package-info.java @@ -0,0 +1,9 @@ +/** + * + */ +/** + * + * @author mcc + * + */ +package org.irods.jargon.dataone.events.def.indexer; \ No newline at end of file diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event-dao-hibernate-spring.cfg.xml b/default-event-service/default-event-service-indexer/src/main/resources/event-dao-hibernate-spring.cfg.xml new file mode 100644 index 0000000..08c0171 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/resources/event-dao-hibernate-spring.cfg.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml new file mode 100644 index 0000000..40cb290 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + org.hibernate.dialect.DerbyDialect + false + true + update + false + 4 + 8 + 900 + 50 + false + false + + + + + + + + + + + + + + + + + + + diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event.properties b/default-event-service/default-event-service-indexer/src/main/resources/event.properties new file mode 100644 index 0000000..dba7890 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/resources/event.properties @@ -0,0 +1,4 @@ +jdbc.url= +jdbc.user=irodsext +jdbc.password=password +jdbc.driver= diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java new file mode 100644 index 0000000..d58f80a --- /dev/null +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java @@ -0,0 +1,87 @@ +/** + * + */ +package org.irods.jargon.dataone.def.event.persist.dao; + +import org.hibernate.Criteria; +import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; +import org.irods.jargon.dataone.events.EventLoggingException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.orm.hibernate3.support.HibernateDaoSupport; + +/** + * Impl of an access log + * + * @author mcc + * + */ +@SuppressWarnings("deprecation") +public class AccessLogDAOImpl extends HibernateDaoSupport implements AccessLogDAO { + + private static final Logger log = LoggerFactory.getLogger(AccessLogDAOImpl.class); + + /** + * + */ + public AccessLogDAOImpl() { + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO#save(org. + * irods.jargon.dataone.def.event.persist.dao.domain.AccessLog) + */ + @Override + public void save(AccessLog accessLog) throws EventLoggingException { + + log.info("save accessLog:{}", accessLog); + + try { + getSessionFactory().getCurrentSession().saveOrUpdate(accessLog); + } catch (Exception e) { + log.error("error in save(AccessLog)", e); + throw new EventLoggingException("Failed save(TransferItem)", e); + } + + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO#findById(java + * .lang.Long) + */ + @Override + public AccessLog findById(Long id) throws EventLoggingException { + + log.info("find accessLog:{}", id); + + Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(AccessLog.class); + return (AccessLog) criteria.uniqueResult(); + + } + + /* + * (non-Javadoc) + * + * @see + * org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO#delete(org. + * irods.jargon.dataone.def.event.persist.dao.domain.AccessLog) + */ + @Override + public void delete(AccessLog accessLog) throws EventLoggingException { + logger.info("entering delete(AccessLog)"); + + try { + getSessionFactory().getCurrentSession().delete(accessLog); + } catch (Exception e) { + log.error("error in delete(AccessLog)", e); + throw new EventLoggingException("Failed delete(AccessLog)", e); + } + } + +} From 1a0ddc2464199a2d02656e65acda3edaf6d86b0e Mon Sep 17 00:00:00 2001 From: michael-conway Date: Mon, 5 Jun 2017 15:55:11 -0400 Subject: [PATCH 57/88] #9 connects in indexer to database --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../default-event-service-indexer/pom.xml | 37 +++++++++++ .../events/def/indexer/EventIndexer.java | 2 +- .../main/resources/event-service-beans.xml | 4 +- .../src/main/resources/event.properties | 4 +- .../src/main/resources/integration.xml | 61 +++++++++++++++++++ 6 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 default-event-service/default-event-service-indexer/src/main/resources/integration.xml diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 5b2fd5d..d74b9f2 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-02T19:55:06Z"; + public static String BUILD_TIME="2017-06-05T19:54:01Z"; } diff --git a/default-event-service/default-event-service-indexer/pom.xml b/default-event-service/default-event-service-indexer/pom.xml index a33d4a6..2593d5c 100644 --- a/default-event-service/default-event-service-indexer/pom.xml +++ b/default-event-service/default-event-service-indexer/pom.xml @@ -33,6 +33,11 @@ default-event-service-persist ${project.version} + + org.irods + event-service-api + ${project.version} + org.springframework.integration spring-integration-core @@ -50,6 +55,10 @@ org.slf4j log4j-over-slf4j + + ch.qos.logback + logback-classic + @@ -69,5 +78,33 @@ org.springframework.integration spring-integration-amqp + + + postgresql + postgresql + 9.1-901-1.jdbc4 + + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.3.RELEASE + + ${start-class} + JAR + + + + + repackage + + + + + + + diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java index a7608d7..2cdbb19 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java @@ -16,7 +16,7 @@ */ @SpringBootApplication -@ImportResource("/integration.xml") +@ImportResource({ "/integration.xml", "/event-dao-hibernate-spring.cfg.xml", "/event-service-beans.xml" }) public class EventIndexer { /** diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml index 40cb290..17196bc 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml +++ b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml @@ -32,7 +32,7 @@ value="classpath:event-dao-hibernate-spring.cfg.xml" /> - org.hibernate.dialect.DerbyDialect + org.hibernate.dialect.PostgreSQLDialect false true update @@ -59,7 +59,7 @@ - + diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event.properties b/default-event-service/default-event-service-indexer/src/main/resources/event.properties index dba7890..d773426 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event.properties +++ b/default-event-service/default-event-service-indexer/src/main/resources/event.properties @@ -1,4 +1,4 @@ -jdbc.url= +jdbc.url=jdbc:postgresql://irods420.irodslocal/IRODS-EXT?user=irodsext&password=password jdbc.user=irodsext jdbc.password=password -jdbc.driver= +jdbc.driver=org.postgresql.Driver diff --git a/default-event-service/default-event-service-indexer/src/main/resources/integration.xml b/default-event-service/default-event-service-indexer/src/main/resources/integration.xml new file mode 100644 index 0000000..8dac90e --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/resources/integration.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d0258b66e44649ee3dd7ec5da441b0786639ee64 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 6 Jun 2017 13:26:42 -0400 Subject: [PATCH 58/88] #9 building up to connnect to queue --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../events/def/indexer/Application.java | 85 +++++++++++++++++++ .../events/def/indexer/EventIndexer.java | 35 -------- .../events/def/indexer/EventQueueLogger.java | 23 +++++ .../src/main/resources/integration.xml | 32 ++----- 5 files changed, 117 insertions(+), 60 deletions(-) create mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java delete mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java create mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventQueueLogger.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index d74b9f2..f45af10 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-05T19:54:01Z"; + public static String BUILD_TIME="2017-06-06T12:44:09Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java new file mode 100644 index 0000000..75188bc --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -0,0 +1,85 @@ +/** + * + */ +package org.irods.jargon.dataone.events.def.indexer; + +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ImportResource; +import org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter; +import org.springframework.integration.annotation.IntegrationComponentScan; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.config.EnableIntegration; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; +import org.springframework.messaging.MessagingException; + +/** + * Master flow core + * + * @author mcc + * + */ + +@SpringBootApplication +@EnableIntegration +@IntegrationComponentScan +@ImportResource({ "/event-dao-hibernate-spring.cfg.xml", "/event-service-beans.xml" }) +public class Application { + + /** + * + */ + public Application() { + } + + public static void main(String[] args) throws Exception { + ConfigurableApplicationContext ctx = new SpringApplication(Application.class).run(args); + System.out.println("Hit Enter to terminate"); + System.in.read(); + ctx.close(); + } + + @Bean + public MessageChannel amqpInputChannel() { + return new DirectChannel(); + } + + @Bean + public AmqpInboundChannelAdapter inbound(SimpleMessageListenerContainer listenerContainer, + @Qualifier("amqpInputChannel") MessageChannel channel) { + AmqpInboundChannelAdapter adapter = new AmqpInboundChannelAdapter(listenerContainer); + adapter.setOutputChannel(channel); + return adapter; + } + + @Bean + public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) { + SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory); + container.setQueueNames("irods.dataone.logger"); + container.setConcurrentConsumers(2); + // ... + return container; + } + + @Bean + @ServiceActivator(inputChannel = "amqpInputChannel") + public MessageHandler handler() { + return new MessageHandler() { + + @Override + public void handleMessage(Message message) throws MessagingException { + System.out.println(message.getPayload()); + } + + }; + } + +} diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java deleted file mode 100644 index 2cdbb19..0000000 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventIndexer.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * - */ -package org.irods.jargon.dataone.events.def.indexer; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.annotation.ImportResource; - -/** - * Master flow core - * - * @author mcc - * - */ - -@SpringBootApplication -@ImportResource({ "/integration.xml", "/event-dao-hibernate-spring.cfg.xml", "/event-service-beans.xml" }) -public class EventIndexer { - - /** - * - */ - public EventIndexer() { - } - - public static void main(String[] args) throws Exception { - ConfigurableApplicationContext ctx = new SpringApplication(EventIndexer.class).run(args); - System.out.println("Hit Enter to terminate"); - System.in.read(); - ctx.close(); - } - -} diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventQueueLogger.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventQueueLogger.java new file mode 100644 index 0000000..37ea6a7 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventQueueLogger.java @@ -0,0 +1,23 @@ +/** + * + */ +package org.irods.jargon.dataone.events.def.indexer; + +import org.springframework.stereotype.Component; + +/** + * Logger attached to an amqp event log queue + * + * @author mcc + * + */ +@Component +public class EventQueueLogger { + + /** + * + */ + public EventQueueLogger() { + } + +} diff --git a/default-event-service/default-event-service-indexer/src/main/resources/integration.xml b/default-event-service/default-event-service-indexer/src/main/resources/integration.xml index 8dac90e..bcc3824 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/integration.xml +++ b/default-event-service/default-event-service-indexer/src/main/resources/integration.xml @@ -10,34 +10,18 @@ http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - + + channel="toIndexer"> - + - - - - - - - - - - - - - - + channel="toIndexer" amqp-template="amqpTemplate" exchange-name="irods.dataone.exchange" + routing-key="irods.dataone.routing" /> @@ -50,11 +34,11 @@ - + - + - + From e46d20208a9b812a1cb6b5ece35b82656b105c99 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 6 Jun 2017 16:34:38 -0400 Subject: [PATCH 59/88] #9 working on transform --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../dataone/events/def/indexer/Accessor.java | 60 ++++++++++++ .../events/def/indexer/Application.java | 7 +- .../events/def/indexer/LoggingEvent.java | 93 +++++++++++++++++++ .../test/resources/sample-messages/msg1.json | 1 + 5 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Accessor.java create mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java create mode 100644 default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index f45af10..917c0d1 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-06T12:44:09Z"; + public static String BUILD_TIME="2017-06-06T20:32:31Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Accessor.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Accessor.java new file mode 100644 index 0000000..f206bb5 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Accessor.java @@ -0,0 +1,60 @@ +package org.irods.jargon.dataone.events.def.indexer; + +public class Accessor { + + private String name = ""; + private String zone = ""; + + public Accessor() { + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name + * the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the zone + */ + public String getZone() { + return zone; + } + + /** + * @param zone + * the zone to set + */ + public void setZone(String zone) { + this.zone = zone; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Accessor ["); + if (name != null) { + builder.append("name=").append(name).append(", "); + } + if (zone != null) { + builder.append("zone=").append(zone); + } + builder.append("]"); + return builder.toString(); + } + +} diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index 75188bc..d8664c5 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -3,6 +3,8 @@ */ package org.irods.jargon.dataone.events.def.indexer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.beans.factory.annotation.Qualifier; @@ -34,6 +36,8 @@ @ImportResource({ "/event-dao-hibernate-spring.cfg.xml", "/event-service-beans.xml" }) public class Application { + private static final Logger log = LoggerFactory.getLogger(Application.class); + /** * */ @@ -76,7 +80,8 @@ public MessageHandler handler() { @Override public void handleMessage(Message message) throws MessagingException { - System.out.println(message.getPayload()); + String jsonRaw = new String((byte[]) message.getPayload()); + log.info("msg:{}", jsonRaw); } }; diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java new file mode 100644 index 0000000..6b4c7fd --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java @@ -0,0 +1,93 @@ +/** + * + */ +package org.irods.jargon.dataone.events.def.indexer; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author mcc + * + */ +public class LoggingEvent { + + private String entity = ""; + private String path = ""; + private List accessor = new ArrayList<>(); + + /** + * + */ + public LoggingEvent() { + } + + /** + * @return the entity + */ + public String getEntity() { + return entity; + } + + /** + * @param entity + * the entity to set + */ + public void setEntity(String entity) { + this.entity = entity; + } + + /** + * @return the path + */ + public String getPath() { + return path; + } + + /** + * @param path + * the path to set + */ + public void setPath(String path) { + this.path = path; + } + + /** + * @return the accessor + */ + public List getAccessor() { + return accessor; + } + + /** + * @param accessor + * the accessor to set + */ + public void setAccessor(List accessor) { + this.accessor = accessor; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + final int maxLen = 10; + StringBuilder builder = new StringBuilder(); + builder.append("LoggingEvent ["); + if (entity != null) { + builder.append("entity=").append(entity).append(", "); + } + if (path != null) { + builder.append("path=").append(path).append(", "); + } + if (accessor != null) { + builder.append("accessor=").append(accessor.subList(0, Math.min(accessor.size(), maxLen))); + } + builder.append("]"); + return builder.toString(); + } + +} diff --git a/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json new file mode 100644 index 0000000..7f63f60 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json @@ -0,0 +1 @@ +'data-object.open':'{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","accessor":{"name":"rods","zone":"iplant"}} \ No newline at end of file From d444bbf1d2cfc92077d9d279c3dc588ee52bd28b Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 10:43:59 -0400 Subject: [PATCH 60/88] #9 json convert --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../events/def/indexer/Application.java | 12 +++- .../def/indexer/EventConverterUtil.java | 40 +++++++++++ .../events/def/indexer/LoggingEvent.java | 12 ++-- .../def/indexer/LoggingEventWrapper.java | 67 +++++++++++++++++++ .../def/indexer/EventConverterUtilTest.java | 22 ++++++ .../test/resources/sample-messages/msg1.json | 2 +- .../test/resources/sample-messages/msg2.json | 1 + 8 files changed, 146 insertions(+), 12 deletions(-) create mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtil.java create mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEventWrapper.java create mode 100644 default-event-service/default-event-service-indexer/src/test/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtilTest.java create mode 100644 default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg2.json diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 917c0d1..bb05dd8 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-06T20:32:31Z"; + public static String BUILD_TIME="2017-06-06T20:43:16Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index d8664c5..c9b6d33 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -3,6 +3,7 @@ */ package org.irods.jargon.dataone.events.def.indexer; +import org.irods.jargon.dataone.events.EventLoggingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; @@ -80,8 +81,15 @@ public MessageHandler handler() { @Override public void handleMessage(Message message) throws MessagingException { - String jsonRaw = new String((byte[]) message.getPayload()); - log.info("msg:{}", jsonRaw); + EventConverterUtil util = new EventConverterUtil(); + LoggingEvent event; + try { + event = util.loggingEventFromPayload((byte[]) message.getPayload()); + } catch (EventLoggingException e) { + log.error("error converting message", e); + throw new MessagingException("error converting message", e); + } + log.info("msg:{}", event); } }; diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtil.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtil.java new file mode 100644 index 0000000..db93d12 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtil.java @@ -0,0 +1,40 @@ +/** + * + */ +package org.irods.jargon.dataone.events.def.indexer; + +import java.io.IOException; + +import org.irods.jargon.dataone.events.EventLoggingException; + +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Utility for JSON conversion + * + * @author mcc + * + */ +public class EventConverterUtil { + + ObjectMapper mapper = new ObjectMapper(); + + /** + * + */ + public EventConverterUtil() { + } + + public LoggingEvent loggingEventFromPayload(final byte[] payload) throws EventLoggingException { + String jsonRaw = new String(payload); + LoggingEvent event; + try { + event = mapper.readValue(jsonRaw, LoggingEvent.class); + } catch (IOException e) { + throw new EventLoggingException("unable to translate json", e); + } + return event; + + } + +} diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java index 6b4c7fd..df02ea7 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java @@ -3,9 +3,6 @@ */ package org.irods.jargon.dataone.events.def.indexer; -import java.util.ArrayList; -import java.util.List; - /** * @author mcc * @@ -14,7 +11,7 @@ public class LoggingEvent { private String entity = ""; private String path = ""; - private List accessor = new ArrayList<>(); + private Accessor accessor; /** * @@ -55,7 +52,7 @@ public void setPath(String path) { /** * @return the accessor */ - public List getAccessor() { + public Accessor getAccessor() { return accessor; } @@ -63,7 +60,7 @@ public List getAccessor() { * @param accessor * the accessor to set */ - public void setAccessor(List accessor) { + public void setAccessor(Accessor accessor) { this.accessor = accessor; } @@ -74,7 +71,6 @@ public void setAccessor(List accessor) { */ @Override public String toString() { - final int maxLen = 10; StringBuilder builder = new StringBuilder(); builder.append("LoggingEvent ["); if (entity != null) { @@ -84,7 +80,7 @@ public String toString() { builder.append("path=").append(path).append(", "); } if (accessor != null) { - builder.append("accessor=").append(accessor.subList(0, Math.min(accessor.size(), maxLen))); + builder.append("accessor=").append(accessor); } builder.append("]"); return builder.toString(); diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEventWrapper.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEventWrapper.java new file mode 100644 index 0000000..c915b3a --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEventWrapper.java @@ -0,0 +1,67 @@ +/** + * + */ +package org.irods.jargon.dataone.events.def.indexer; + +/** + * @author mcc + * + */ +public class LoggingEventWrapper { + + private LoggingEvent loggingEvent; + private String eventType; + + /** + * + */ + public LoggingEventWrapper() { + } + + /** + * @return the loggingEvent + */ + public LoggingEvent getLoggingEvent() { + return loggingEvent; + } + + /** + * @param loggingEvent + * the loggingEvent to set + */ + public void setLoggingEvent(LoggingEvent loggingEvent) { + this.loggingEvent = loggingEvent; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("LoggingEventWrapper ["); + if (loggingEvent != null) { + builder.append("loggingEvent=").append(loggingEvent); + } + builder.append("]"); + return builder.toString(); + } + + /** + * @return the eventType + */ + public String getEventType() { + return eventType; + } + + /** + * @param eventType + * the eventType to set + */ + public void setEventType(String eventType) { + this.eventType = eventType; + } + +} diff --git a/default-event-service/default-event-service-indexer/src/test/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtilTest.java b/default-event-service/default-event-service-indexer/src/test/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtilTest.java new file mode 100644 index 0000000..fc86bd8 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/test/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtilTest.java @@ -0,0 +1,22 @@ +package org.irods.jargon.dataone.events.def.indexer; + +import java.nio.file.Files; +import java.nio.file.Paths; + +import org.junit.Assert; +import org.junit.Test; + +public class EventConverterUtilTest { + + @Test + public void testJsonToLoggingEvent() throws Exception { + String myFile = "/sample-messages/msg1.json"; + + String jsonString = new String(Files.readAllBytes(Paths.get(getClass().getResource(myFile).toURI()))); + EventConverterUtil converter = new EventConverterUtil(); + LoggingEvent actual = converter.loggingEventFromPayload(jsonString.getBytes()); + Assert.assertNotNull("no logging event returned", actual); + + } + +} diff --git a/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json index 7f63f60..080711d 100644 --- a/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json +++ b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json @@ -1 +1 @@ -'data-object.open':'{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","accessor":{"name":"rods","zone":"iplant"}} \ No newline at end of file +{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","accessor":{"name":"rods","zone":"iplant"}} \ No newline at end of file diff --git a/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg2.json b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg2.json new file mode 100644 index 0000000..7f63f60 --- /dev/null +++ b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg2.json @@ -0,0 +1 @@ +'data-object.open':'{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","accessor":{"name":"rods","zone":"iplant"}} \ No newline at end of file From 48c5c2449b222f3ca6a1e4fb7017b1172e6d89ce Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Wed, 7 Jun 2017 09:14:17 -0700 Subject: [PATCH 61/88] added a missing dependency in default-event-service-persist --- default-event-service/default-event-service-persist/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/default-event-service/default-event-service-persist/pom.xml b/default-event-service/default-event-service-persist/pom.xml index 1e1a8a3..e8d649a 100644 --- a/default-event-service/default-event-service-persist/pom.xml +++ b/default-event-service/default-event-service-persist/pom.xml @@ -40,6 +40,11 @@ dataone-utils ${project.version} + + org.irods + event-service-api + ${project.version} + org.springframework spring-test From c81215b16da7a39275d646019c8e4491d7cba3e7 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 12:39:48 -0400 Subject: [PATCH 62/88] #9 working on persistence --- .../event/persist/dao/domain/AccessLog.java | 182 +++++++++++------- 1 file changed, 114 insertions(+), 68 deletions(-) diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index 67a8b16..621e347 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -4,16 +4,18 @@ package org.irods.jargon.dataone.def.event.persist.dao.domain; import java.util.Date; +import java.util.UUID; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; import javax.persistence.Id; -import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Temporal; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Type; + /** * * @author mcc @@ -24,27 +26,35 @@ public class AccessLog { @Id - @SequenceGenerator(name = "access_log_id_seq", sequenceName = "access_log_id_seq") - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "access_log_id_seq") - @Column(name = "id", unique = true, nullable = false) - private Long id; + @GeneratedValue(generator = "entityIdGenerator") + @GenericGenerator(name = "entityIdGenerator", strategy = "uuid2") + @Column(columnDefinition = "entry_id", updatable = false) + @Type(type = "pg-uuid") + private UUID entryId; + + @Column(columnDefinition = "permanent_id", nullable = true) + @Type(type = "pg-uuid") + private UUID permanent_id; - @Column(name = "file_key", length = 1024, nullable = false) - private String fileKey; + @Column(columnDefinition = "ip_address", nullable = true) + private String ipAddress; - @Column(name = "event_id", length = 30, nullable = true) - private String eventId; + @Column(columnDefinition = "user_agent", nullable = true) + private String userAgent; - @Column(name = "event_detail", length = 200, nullable = true) - private String eventDetail; + @Column(columnDefinition = "subject", nullable = true) + private String subject; - @Column(name = "access_principal", length = 50, nullable = true) - private String accessPrincipal; + @Column(columnDefinition = "event_type", nullable = false) + private String eventType; - @Column(name = "date_added") + @Column(name = "date_logged") @Temporal(javax.persistence.TemporalType.TIMESTAMP) private Date dateAdded; + @Column(columnDefinition = "node_identifier", nullable = false) + private String nodeIdentifier; + /** * */ @@ -52,93 +62,123 @@ public AccessLog() { } /** - * @return the id + * @return the dateAdded */ - public Long getId() { - return id; + public Date getDateAdded() { + return dateAdded; } /** - * @param id - * the id to set + * @param dateAdded + * the dateAdded to set */ - public void setId(Long id) { - this.id = id; + public void setDateAdded(Date dateAdded) { + this.dateAdded = dateAdded; } /** - * @return the fileKey + * @return the entryId */ - public String getFileKey() { - return fileKey; + public UUID getEntryId() { + return entryId; } /** - * @param fileKey - * the fileKey to set + * @param entryId + * the entryId to set */ - public void setFileKey(String fileKey) { - this.fileKey = fileKey; + public void setEntryId(UUID entryId) { + this.entryId = entryId; } /** - * @return the eventId + * @return the permanent_id */ - public String getEventId() { - return eventId; + public UUID getPermanent_id() { + return permanent_id; } /** - * @param eventId - * the eventId to set + * @param permanent_id + * the permanent_id to set */ - public void setEventId(String eventId) { - this.eventId = eventId; + public void setPermanent_id(UUID permanent_id) { + this.permanent_id = permanent_id; } /** - * @return the eventDetail + * @return the ipAddress */ - public String getEventDetail() { - return eventDetail; + public String getIpAddress() { + return ipAddress; } /** - * @param eventDetail - * the eventDetail to set + * @param ipAddress + * the ipAddress to set */ - public void setEventDetail(String eventDetail) { - this.eventDetail = eventDetail; + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; } /** - * @return the accessPrincipal + * @return the userAgent */ - public String getAccessPrincipal() { - return accessPrincipal; + public String getUserAgent() { + return userAgent; } /** - * @param accessPrincipal - * the accessPrincipal to set + * @param userAgent + * the userAgent to set */ - public void setAccessPrincipal(String accessPrincipal) { - this.accessPrincipal = accessPrincipal; + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; } /** - * @return the dateAdded + * @return the subject */ - public Date getDateAdded() { - return dateAdded; + public String getSubject() { + return subject; } /** - * @param dateAdded - * the dateAdded to set + * @param subject + * the subject to set */ - public void setDateAdded(Date dateAdded) { - this.dateAdded = dateAdded; + public void setSubject(String subject) { + this.subject = subject; + } + + /** + * @return the eventType + */ + public String getEventType() { + return eventType; + } + + /** + * @param eventType + * the eventType to set + */ + public void setEventType(String eventType) { + this.eventType = eventType; + } + + /** + * @return the nodeIdentifier + */ + public String getNodeIdentifier() { + return nodeIdentifier; + } + + /** + * @param nodeIdentifier + * the nodeIdentifier to set + */ + public void setNodeIdentifier(String nodeIdentifier) { + this.nodeIdentifier = nodeIdentifier; } /* @@ -150,23 +190,29 @@ public void setDateAdded(Date dateAdded) { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("AccessLog ["); - if (id != null) { - builder.append("id=").append(id).append(", "); + if (entryId != null) { + builder.append("entryId=").append(entryId).append(", "); } - if (fileKey != null) { - builder.append("fileKey=").append(fileKey).append(", "); + if (permanent_id != null) { + builder.append("permanent_id=").append(permanent_id).append(", "); } - if (eventId != null) { - builder.append("eventId=").append(eventId).append(", "); + if (ipAddress != null) { + builder.append("ipAddress=").append(ipAddress).append(", "); } - if (eventDetail != null) { - builder.append("eventDetail=").append(eventDetail).append(", "); + if (userAgent != null) { + builder.append("userAgent=").append(userAgent).append(", "); } - if (accessPrincipal != null) { - builder.append("accessPrincipal=").append(accessPrincipal).append(", "); + if (subject != null) { + builder.append("subject=").append(subject).append(", "); + } + if (eventType != null) { + builder.append("eventType=").append(eventType).append(", "); } if (dateAdded != null) { - builder.append("dateAdded=").append(dateAdded); + builder.append("dateAdded=").append(dateAdded).append(", "); + } + if (nodeIdentifier != null) { + builder.append("nodeIdentifier=").append(nodeIdentifier); } builder.append("]"); return builder.toString(); From ea10f2d116383e6f6abf247de8e17eba7acd49f8 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 13:59:53 -0400 Subject: [PATCH 63/88] #9 adding persistence --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../events/def/indexer/Application.java | 3 +- .../def/indexer/LoggingEventWrapper.java | 67 ------------------- .../event/persist/dao/domain/AccessLog.java | 36 +++++----- 4 files changed, 21 insertions(+), 87 deletions(-) delete mode 100644 default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEventWrapper.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index bb05dd8..bdcfc8c 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-06T20:43:16Z"; + public static String BUILD_TIME="2017-06-07T17:14:44Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index c9b6d33..d3ea723 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -3,6 +3,7 @@ */ package org.irods.jargon.dataone.events.def.indexer; +import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; import org.irods.jargon.dataone.events.EventLoggingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,7 +77,7 @@ public SimpleMessageListenerContainer container(ConnectionFactory connectionFact @Bean @ServiceActivator(inputChannel = "amqpInputChannel") - public MessageHandler handler() { + public MessageHandler handler(AccessLogDAO accessLogDAO) { return new MessageHandler() { @Override diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEventWrapper.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEventWrapper.java deleted file mode 100644 index c915b3a..0000000 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEventWrapper.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * - */ -package org.irods.jargon.dataone.events.def.indexer; - -/** - * @author mcc - * - */ -public class LoggingEventWrapper { - - private LoggingEvent loggingEvent; - private String eventType; - - /** - * - */ - public LoggingEventWrapper() { - } - - /** - * @return the loggingEvent - */ - public LoggingEvent getLoggingEvent() { - return loggingEvent; - } - - /** - * @param loggingEvent - * the loggingEvent to set - */ - public void setLoggingEvent(LoggingEvent loggingEvent) { - this.loggingEvent = loggingEvent; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("LoggingEventWrapper ["); - if (loggingEvent != null) { - builder.append("loggingEvent=").append(loggingEvent); - } - builder.append("]"); - return builder.toString(); - } - - /** - * @return the eventType - */ - public String getEventType() { - return eventType; - } - - /** - * @param eventType - * the eventType to set - */ - public void setEventType(String eventType) { - this.eventType = eventType; - } - -} diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index 621e347..515873b 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -34,7 +34,7 @@ public class AccessLog { @Column(columnDefinition = "permanent_id", nullable = true) @Type(type = "pg-uuid") - private UUID permanent_id; + private UUID permanentId; @Column(columnDefinition = "ip_address", nullable = true) private String ipAddress; @@ -91,21 +91,6 @@ public void setEntryId(UUID entryId) { this.entryId = entryId; } - /** - * @return the permanent_id - */ - public UUID getPermanent_id() { - return permanent_id; - } - - /** - * @param permanent_id - * the permanent_id to set - */ - public void setPermanent_id(UUID permanent_id) { - this.permanent_id = permanent_id; - } - /** * @return the ipAddress */ @@ -181,6 +166,21 @@ public void setNodeIdentifier(String nodeIdentifier) { this.nodeIdentifier = nodeIdentifier; } + /** + * @return the permanentId + */ + public UUID getPermanentId() { + return permanentId; + } + + /** + * @param permanentId + * the permanentId to set + */ + public void setPermanentId(UUID permanentId) { + this.permanentId = permanentId; + } + /* * (non-Javadoc) * @@ -193,8 +193,8 @@ public String toString() { if (entryId != null) { builder.append("entryId=").append(entryId).append(", "); } - if (permanent_id != null) { - builder.append("permanent_id=").append(permanent_id).append(", "); + if (permanentId != null) { + builder.append("permanentId=").append(permanentId).append(", "); } if (ipAddress != null) { builder.append("ipAddress=").append(ipAddress).append(", "); From 9ea4aa16adc58263070b1bfe2eeaa6b371a8da79 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 14:54:54 -0400 Subject: [PATCH 64/88] #9 at least it starts --- .../org/irods/jargon/dataone/utils/RestVersion.java | 2 +- .../def/event/persist/dao/domain/AccessLog.java | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index bdcfc8c..befef8c 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-07T17:14:44Z"; + public static String BUILD_TIME="2017-06-07T18:51:29Z"; } diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index 515873b..3e260e5 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -8,12 +8,10 @@ import javax.persistence.Column; import javax.persistence.Entity; -import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; -import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; /** @@ -22,18 +20,18 @@ * */ @Entity -@Table(name = "access_log") +@Table(name = "event_log") public class AccessLog { @Id - @GeneratedValue(generator = "entityIdGenerator") - @GenericGenerator(name = "entityIdGenerator", strategy = "uuid2") + // @GeneratedValue(generator = "entityIdGenerator") + // @GenericGenerator(name = "entityIdGenerator", strategy = "uuid2") @Column(columnDefinition = "entry_id", updatable = false) - @Type(type = "pg-uuid") + @Type(type = "binary") private UUID entryId; @Column(columnDefinition = "permanent_id", nullable = true) - @Type(type = "pg-uuid") + @Type(type = "binary") private UUID permanentId; @Column(columnDefinition = "ip_address", nullable = true) From 377e4d0a3edc92c40d60b9e0a5e69fc35f396f58 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 15:40:51 -0400 Subject: [PATCH 65/88] #9 working persist --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../events/def/indexer/Application.java | 18 +++++ .../event/persist/dao/AccessLogDAOImpl.java | 2 +- .../event/persist/dao/domain/AccessLog.java | 70 ++++++++++++------- 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index befef8c..04c2c5b 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-07T18:51:29Z"; + public static String BUILD_TIME="2017-06-07T19:40:14Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index d3ea723..057c891 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -3,7 +3,11 @@ */ package org.irods.jargon.dataone.events.def.indexer; +import java.util.Date; +import java.util.UUID; + import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; +import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; import org.irods.jargon.dataone.events.EventLoggingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +28,8 @@ import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessagingException; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; /** * Master flow core @@ -81,11 +87,23 @@ public MessageHandler handler(AccessLogDAO accessLogDAO) { return new MessageHandler() { @Override + @Transactional(rollbackFor = { MessagingException.class }, propagation = Propagation.REQUIRED) + public void handleMessage(Message message) throws MessagingException { EventConverterUtil util = new EventConverterUtil(); LoggingEvent event; try { event = util.loggingEventFromPayload((byte[]) message.getPayload()); + log.info("event:{}", event); + AccessLog accessLog = new AccessLog(); + accessLog.setEntryId(UUID.randomUUID().toString()); + accessLog.setIrodsPath(event.getPath()); + accessLog.setDateAdded(new Date()); + accessLog.setEventType("READ"); + accessLog.setSubject(event.getAccessor().getName()); + log.info("access log to write:{}", accessLog); + accessLogDAO.save(accessLog); + log.info("saved!"); } catch (EventLoggingException e) { log.error("error converting message", e); throw new MessagingException("error converting message", e); diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java index d58f80a..f583cfc 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java @@ -43,7 +43,7 @@ public void save(AccessLog accessLog) throws EventLoggingException { getSessionFactory().getCurrentSession().saveOrUpdate(accessLog); } catch (Exception e) { log.error("error in save(AccessLog)", e); - throw new EventLoggingException("Failed save(TransferItem)", e); + throw new EventLoggingException("Failed save(accessLog)", e); } } diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index 3e260e5..f68d264 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -4,7 +4,6 @@ package org.irods.jargon.dataone.def.event.persist.dao.domain; import java.util.Date; -import java.util.UUID; import javax.persistence.Column; import javax.persistence.Entity; @@ -12,8 +11,6 @@ import javax.persistence.Table; import javax.persistence.Temporal; -import org.hibernate.annotations.Type; - /** * * @author mcc @@ -26,17 +23,18 @@ public class AccessLog { @Id // @GeneratedValue(generator = "entityIdGenerator") // @GenericGenerator(name = "entityIdGenerator", strategy = "uuid2") - @Column(columnDefinition = "entry_id", updatable = false) - @Type(type = "binary") - private UUID entryId; + @Column(columnDefinition = "entry_id", nullable = false) + private String entryId; @Column(columnDefinition = "permanent_id", nullable = true) - @Type(type = "binary") - private UUID permanentId; + private String permanentId; @Column(columnDefinition = "ip_address", nullable = true) private String ipAddress; + @Column(columnDefinition = "irods_path", nullable = true) + private String irodsPath; + @Column(columnDefinition = "user_agent", nullable = true) private String userAgent; @@ -75,21 +73,10 @@ public void setDateAdded(Date dateAdded) { } /** - * @return the entryId - */ - public UUID getEntryId() { - return entryId; - } - - /** - * @param entryId - * the entryId to set - */ - public void setEntryId(UUID entryId) { - this.entryId = entryId; - } - - /** + * + * + * /** + * * @return the ipAddress */ public String getIpAddress() { @@ -164,10 +151,25 @@ public void setNodeIdentifier(String nodeIdentifier) { this.nodeIdentifier = nodeIdentifier; } + /** + * @return the entryId + */ + public String getEntryId() { + return entryId; + } + + /** + * @param entryId + * the entryId to set + */ + public void setEntryId(String entryId) { + this.entryId = entryId; + } + /** * @return the permanentId */ - public UUID getPermanentId() { + public String getPermanentId() { return permanentId; } @@ -175,10 +177,25 @@ public UUID getPermanentId() { * @param permanentId * the permanentId to set */ - public void setPermanentId(UUID permanentId) { + public void setPermanentId(String permanentId) { this.permanentId = permanentId; } + /** + * @return the irodsPath + */ + public String getIrodsPath() { + return irodsPath; + } + + /** + * @param irodsPath + * the irodsPath to set + */ + public void setIrodsPath(String irodsPath) { + this.irodsPath = irodsPath; + } + /* * (non-Javadoc) * @@ -197,6 +214,9 @@ public String toString() { if (ipAddress != null) { builder.append("ipAddress=").append(ipAddress).append(", "); } + if (irodsPath != null) { + builder.append("irodsPath=").append(irodsPath).append(", "); + } if (userAgent != null) { builder.append("userAgent=").append(userAgent).append(", "); } From 825331899180be014cf1e4098c96e54224a92757 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 16:51:04 -0400 Subject: [PATCH 66/88] #9 session factory? --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../events/def/indexer/Application.java | 2 - .../default-event-service-persist/README.md | 47 +++++++++++++++++++ .../event/persist/dao/AccessLogDAOImpl.java | 31 +++++++++--- .../event/persist/dao/domain/AccessLog.java | 45 +++++++++--------- 5 files changed, 96 insertions(+), 31 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 04c2c5b..187c70d 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-07T19:40:14Z"; + public static String BUILD_TIME="2017-06-07T20:47:08Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index 057c891..4b17123 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -4,7 +4,6 @@ package org.irods.jargon.dataone.events.def.indexer; import java.util.Date; -import java.util.UUID; import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; @@ -96,7 +95,6 @@ public void handleMessage(Message message) throws MessagingException { event = util.loggingEventFromPayload((byte[]) message.getPayload()); log.info("event:{}", event); AccessLog accessLog = new AccessLog(); - accessLog.setEntryId(UUID.randomUUID().toString()); accessLog.setIrodsPath(event.getPath()); accessLog.setDateAdded(new Date()); accessLog.setEventType("READ"); diff --git a/default-event-service/default-event-service-persist/README.md b/default-event-service/default-event-service-persist/README.md index 83a5b9b..7e281c8 100644 --- a/default-event-service/default-event-service-persist/README.md +++ b/default-event-service/default-event-service-persist/README.md @@ -1,3 +1,50 @@ +## Running + +#### update db coordinates + +temporary until we pull in props....edit src/main/resources/event.properties for: + +* jdbc url +* user +* password + +#### add amqp queue in rabbitmq console + +add irods.dataone.logger as a queue (we'll make that a property l8r) + +#### put in the database (though we're still settling this) + +#### mvn install to build + +#### run it + +cd into the default-event-service-indexer project + +run mvn spring-boot:run + +Off you go! + +#### in amqp console put json into queue + +``` +{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","accessor":{"name":"rods","zone":"iplant"}} + +``` + + + + + + + + + + + + + + + ## Database setup notes If you don't have an IRODS-EXT extensions db, add one and a user diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java index f583cfc..7fcf435 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java @@ -4,11 +4,12 @@ package org.irods.jargon.dataone.def.event.persist.dao; import org.hibernate.Criteria; +import org.hibernate.SessionFactory; import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; import org.irods.jargon.dataone.events.EventLoggingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.orm.hibernate3.support.HibernateDaoSupport; +import org.springframework.beans.factory.annotation.Autowired; /** * Impl of an access log @@ -17,10 +18,13 @@ * */ @SuppressWarnings("deprecation") -public class AccessLogDAOImpl extends HibernateDaoSupport implements AccessLogDAO { +public class AccessLogDAOImpl implements AccessLogDAO { private static final Logger log = LoggerFactory.getLogger(AccessLogDAOImpl.class); + @Autowired + private SessionFactory sessionFactory; + /** * */ @@ -40,7 +44,7 @@ public void save(AccessLog accessLog) throws EventLoggingException { log.info("save accessLog:{}", accessLog); try { - getSessionFactory().getCurrentSession().saveOrUpdate(accessLog); + sessionFactory.getCurrentSession().saveOrUpdate(accessLog); } catch (Exception e) { log.error("error in save(AccessLog)", e); throw new EventLoggingException("Failed save(accessLog)", e); @@ -60,7 +64,7 @@ public AccessLog findById(Long id) throws EventLoggingException { log.info("find accessLog:{}", id); - Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(AccessLog.class); + Criteria criteria = sessionFactory.getCurrentSession().createCriteria(AccessLog.class); return (AccessLog) criteria.uniqueResult(); } @@ -74,14 +78,29 @@ public AccessLog findById(Long id) throws EventLoggingException { */ @Override public void delete(AccessLog accessLog) throws EventLoggingException { - logger.info("entering delete(AccessLog)"); + log.info("entering delete(AccessLog)"); try { - getSessionFactory().getCurrentSession().delete(accessLog); + sessionFactory.getCurrentSession().delete(accessLog); } catch (Exception e) { log.error("error in delete(AccessLog)", e); throw new EventLoggingException("Failed delete(AccessLog)", e); } } + /** + * @return the sessionFactory + */ + public SessionFactory getSessionFactory() { + return sessionFactory; + } + + /** + * @param sessionFactory + * the sessionFactory to set + */ + public void setSessionFactory(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + } diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index f68d264..bec5f34 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -7,6 +7,8 @@ import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; @@ -20,11 +22,10 @@ @Table(name = "event_log") public class AccessLog { - @Id - // @GeneratedValue(generator = "entityIdGenerator") - // @GenericGenerator(name = "entityIdGenerator", strategy = "uuid2") - @Column(columnDefinition = "entry_id", nullable = false) - private String entryId; + @Id() + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; @Column(columnDefinition = "permanent_id", nullable = true) private String permanentId; @@ -151,21 +152,6 @@ public void setNodeIdentifier(String nodeIdentifier) { this.nodeIdentifier = nodeIdentifier; } - /** - * @return the entryId - */ - public String getEntryId() { - return entryId; - } - - /** - * @param entryId - * the entryId to set - */ - public void setEntryId(String entryId) { - this.entryId = entryId; - } - /** * @return the permanentId */ @@ -196,6 +182,21 @@ public void setIrodsPath(String irodsPath) { this.irodsPath = irodsPath; } + /** + * @return the id + */ + public Long getId() { + return id; + } + + /** + * @param id + * the id to set + */ + public void setId(Long id) { + this.id = id; + } + /* * (non-Javadoc) * @@ -205,8 +206,8 @@ public void setIrodsPath(String irodsPath) { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("AccessLog ["); - if (entryId != null) { - builder.append("entryId=").append(entryId).append(", "); + if (id != null) { + builder.append("id=").append(id).append(", "); } if (permanentId != null) { builder.append("permanentId=").append(permanentId).append(", "); From 9830dcaf2b486e4d1c406633cc65bb027e266fe5 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 17:19:30 -0400 Subject: [PATCH 67/88] #9 working on hibernate --- .../java/org/irods/jargon/dataone/utils/RestVersion.java | 2 +- .../src/main/resources/event-service-beans.xml | 7 +++---- .../dataone/def/event/persist/dao/AccessLogDAOImpl.java | 7 +++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 187c70d..f78af69 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-07T20:47:08Z"; + public static String BUILD_TIME="2017-06-07T21:13:26Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml index 17196bc..42dc780 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml +++ b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml @@ -25,17 +25,16 @@ + class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> - + org.hibernate.dialect.PostgreSQLDialect false - true - update + false false 4 8 diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java index 7fcf435..6eb2d80 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java @@ -88,6 +88,13 @@ public void delete(AccessLog accessLog) throws EventLoggingException { } } + /** + * @return the log + */ + public static Logger getLog() { + return log; + } + /** * @return the sessionFactory */ From 839e02ccef77dbc05171656f02726c2eb0fdb5d8 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 17:26:44 -0400 Subject: [PATCH 68/88] #9 working on hibernate --- .../src/main/resources/event-service-beans.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml index 42dc780..f5259da 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml +++ b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml @@ -50,7 +50,7 @@ + class="org.springframework.orm.hibernate4.HibernateTransactionManager"> From c7cfef90e68c60349349c997286bd33e330add13 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 17:30:36 -0400 Subject: [PATCH 69/88] #9 fix spring wiring --- .../main/java/org/irods/jargon/dataone/utils/RestVersion.java | 2 +- .../src/main/resources/event-service-beans.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index f78af69..a4f5b90 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-07T21:13:26Z"; + public static String BUILD_TIME="2017-06-07T21:29:20Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml index f5259da..3ba9aa3 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml +++ b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml @@ -25,7 +25,7 @@ + class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> + class="org.springframework.orm.hibernate5.HibernateTransactionManager"> From 225134b08bef17b4f91420e68ff9ab91518fe0ab Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 7 Jun 2017 17:43:48 -0400 Subject: [PATCH 70/88] #9 col names --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../events/def/indexer/Application.java | 3 +- .../event/persist/dao/domain/AccessLog.java | 50 +++++++++---------- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index a4f5b90..3389d1c 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-07T21:29:20Z"; + public static String BUILD_TIME="2017-06-07T21:42:44Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index 4b17123..a38cede 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -97,7 +97,8 @@ public void handleMessage(Message message) throws MessagingException { AccessLog accessLog = new AccessLog(); accessLog.setIrodsPath(event.getPath()); accessLog.setDateAdded(new Date()); - accessLog.setEventType("READ"); + accessLog.setEvent("READ"); + accessLog.setNodeIdentifier("foo"); accessLog.setSubject(event.getAccessor().getName()); log.info("access log to write:{}", accessLog); accessLogDAO.save(accessLog); diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index bec5f34..fc2e2d0 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -27,29 +27,29 @@ public class AccessLog { @Column(name = "id") private Long id; - @Column(columnDefinition = "permanent_id", nullable = true) + @Column(name = "permanent_id", nullable = true) private String permanentId; - @Column(columnDefinition = "ip_address", nullable = true) + @Column(name = "ip_address", nullable = true) private String ipAddress; - @Column(columnDefinition = "irods_path", nullable = true) + @Column(name = "irods_path", nullable = true) private String irodsPath; - @Column(columnDefinition = "user_agent", nullable = true) + @Column(name = "user_agent", nullable = true) private String userAgent; - @Column(columnDefinition = "subject", nullable = true) + @Column(name = "subject", nullable = true) private String subject; - @Column(columnDefinition = "event_type", nullable = false) - private String eventType; + @Column(name = "event", nullable = false) + private String event; @Column(name = "date_logged") @Temporal(javax.persistence.TemporalType.TIMESTAMP) private Date dateAdded; - @Column(columnDefinition = "node_identifier", nullable = false) + @Column(name = "node_identifier", nullable = false) private String nodeIdentifier; /** @@ -122,21 +122,6 @@ public void setSubject(String subject) { this.subject = subject; } - /** - * @return the eventType - */ - public String getEventType() { - return eventType; - } - - /** - * @param eventType - * the eventType to set - */ - public void setEventType(String eventType) { - this.eventType = eventType; - } - /** * @return the nodeIdentifier */ @@ -224,8 +209,8 @@ public String toString() { if (subject != null) { builder.append("subject=").append(subject).append(", "); } - if (eventType != null) { - builder.append("eventType=").append(eventType).append(", "); + if (event != null) { + builder.append("eventType=").append(event).append(", "); } if (dateAdded != null) { builder.append("dateAdded=").append(dateAdded).append(", "); @@ -237,4 +222,19 @@ public String toString() { return builder.toString(); } + /** + * @return the event + */ + public String getEvent() { + return event; + } + + /** + * @param event + * the event to set + */ + public void setEvent(String event) { + this.event = event; + } + } From b493f1a6938a6fd346fd4f3c741e0e9057c08a70 Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Wed, 7 Jun 2017 15:57:45 -0700 Subject: [PATCH 71/88] make the Hibernate dialect configurable --- .../src/main/resources/event-service-beans.xml | 2 +- .../src/main/resources/event.properties | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml index 3ba9aa3..8285d43 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml +++ b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml @@ -32,7 +32,7 @@ value="classpath:event-dao-hibernate-spring.cfg.xml" /> - org.hibernate.dialect.PostgreSQLDialect + ${hibernate.dialect} false false false diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event.properties b/default-event-service/default-event-service-indexer/src/main/resources/event.properties index d773426..69c006d 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event.properties +++ b/default-event-service/default-event-service-indexer/src/main/resources/event.properties @@ -2,3 +2,5 @@ jdbc.url=jdbc:postgresql://irods420.irodslocal/IRODS-EXT?user=irodsext&password= jdbc.user=irodsext jdbc.password=password jdbc.driver=org.postgresql.Driver + +hibernate.dialect=org.hibernate.dialect.PostgreSQL93Dialect From 6c8b4eb43c251f459092db7815f150667515409a Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Wed, 7 Jun 2017 15:58:59 -0700 Subject: [PATCH 72/88] allow enumerated types to work with a Postgres enumeration --- .../src/main/resources/event.properties | 2 +- .../def/event/persist/dao/domain/AccessLog.java | 6 ++++-- .../def/event/persist/dao/domain/EventType.java | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/EventType.java diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event.properties b/default-event-service/default-event-service-indexer/src/main/resources/event.properties index 69c006d..9baaab2 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event.properties +++ b/default-event-service/default-event-service-indexer/src/main/resources/event.properties @@ -1,4 +1,4 @@ -jdbc.url=jdbc:postgresql://irods420.irodslocal/IRODS-EXT?user=irodsext&password=password +jdbc.url=jdbc:postgresql://irods420.irodslocal/IRODS-EXT?user=irodsext&password=password&stringtype=unspecified jdbc.user=irodsext jdbc.password=password jdbc.driver=org.postgresql.Driver diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index fc2e2d0..6512a98 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -4,9 +4,10 @@ package org.irods.jargon.dataone.def.event.persist.dao.domain; import java.util.Date; - import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -43,7 +44,8 @@ public class AccessLog { private String subject; @Column(name = "event", nullable = false) - private String event; + @Enumerated(EnumType.STRING) + private EventType event; @Column(name = "date_logged") @Temporal(javax.persistence.TemporalType.TIMESTAMP) diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/EventType.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/EventType.java new file mode 100644 index 0000000..a520d31 --- /dev/null +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/EventType.java @@ -0,0 +1,14 @@ +package org.irods.jargon.dataone.def.event.persist.dao.domain; + +/** + * @author dennis + */ +public enum EventType { + CREATE, + DELETE, + READ, + REPLICATE, + REPLICATION_FAILED, + SYNCHRONIZATION_FAILED, + UPDATE +} From 76de9be7b65825063baf82d188d61c689ea23c19 Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Wed, 7 Jun 2017 17:01:24 -0700 Subject: [PATCH 73/88] converted the access log entry ID to a UUID and provided an implementation that actually works with a user-defined enum type in the database --- .../default-event-service-indexer/pom.xml | 8 +++----- .../src/main/resources/event.properties | 4 ++-- .../event/persist/dao/domain/AccessLog.java | 19 +++++++++++-------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/default-event-service/default-event-service-indexer/pom.xml b/default-event-service/default-event-service-indexer/pom.xml index 2593d5c..59990b2 100644 --- a/default-event-service/default-event-service-indexer/pom.xml +++ b/default-event-service/default-event-service-indexer/pom.xml @@ -78,13 +78,11 @@ org.springframework.integration spring-integration-amqp - - postgresql - postgresql - 9.1-901-1.jdbc4 + com.impossibl.pgjdbc-ng + pgjdbc-ng + 0.7.1 - diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event.properties b/default-event-service/default-event-service-indexer/src/main/resources/event.properties index 9baaab2..ee3f467 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event.properties +++ b/default-event-service/default-event-service-indexer/src/main/resources/event.properties @@ -1,6 +1,6 @@ -jdbc.url=jdbc:postgresql://irods420.irodslocal/IRODS-EXT?user=irodsext&password=password&stringtype=unspecified +jdbc.url=jdbc:postgresql://irods420.irodslocal/IRODS-EXT?user=irodsext&password=password jdbc.user=irodsext jdbc.password=password -jdbc.driver=org.postgresql.Driver +jdbc.driver=com.impossibl.postgres.jdbc.PGDriver hibernate.dialect=org.hibernate.dialect.PostgreSQL93Dialect diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index 6512a98..399bcd0 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -3,7 +3,10 @@ */ package org.irods.jargon.dataone.def.event.persist.dao.domain; +import org.hibernate.annotations.ColumnTransformer; + import java.util.Date; +import java.util.UUID; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -24,9 +27,9 @@ public class AccessLog { @Id() - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id") - private Long id; + @GeneratedValue + @Column(name = "id", columnDefinition = "uuid", updatable = false) + private UUID id; @Column(name = "permanent_id", nullable = true) private String permanentId; @@ -43,7 +46,7 @@ public class AccessLog { @Column(name = "subject", nullable = true) private String subject; - @Column(name = "event", nullable = false) + @Column(name = "event", columnDefinition = "event_type", nullable = false) @Enumerated(EnumType.STRING) private EventType event; @@ -172,7 +175,7 @@ public void setIrodsPath(String irodsPath) { /** * @return the id */ - public Long getId() { + public UUID getId() { return id; } @@ -180,7 +183,7 @@ public Long getId() { * @param id * the id to set */ - public void setId(Long id) { + public void setId(UUID id) { this.id = id; } @@ -227,7 +230,7 @@ public String toString() { /** * @return the event */ - public String getEvent() { + public EventType getEvent() { return event; } @@ -235,7 +238,7 @@ public String getEvent() { * @param event * the event to set */ - public void setEvent(String event) { + public void setEvent(EventType event) { this.event = event; } From 7347acd150028870b6bf455b63927b694d1884e2 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 8 Jun 2017 09:58:57 -0400 Subject: [PATCH 74/88] #9 externalize properties --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../events/def/indexer/Application.java | 3 ++- .../main/resources/event-service-beans.xml | 19 ++++++++++++------- .../{main => test}/resources/event.properties | 0 4 files changed, 15 insertions(+), 9 deletions(-) rename default-event-service/default-event-service-indexer/src/{main => test}/resources/event.properties (100%) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 3389d1c..c6b1a9e 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-07T21:42:44Z"; + public static String BUILD_TIME="2017-06-08T13:27:51Z"; } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index a38cede..c796760 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -7,6 +7,7 @@ import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; +import org.irods.jargon.dataone.def.event.persist.dao.domain.EventType; import org.irods.jargon.dataone.events.EventLoggingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -97,7 +98,7 @@ public void handleMessage(Message message) throws MessagingException { AccessLog accessLog = new AccessLog(); accessLog.setIrodsPath(event.getPath()); accessLog.setDateAdded(new Date()); - accessLog.setEvent("READ"); + accessLog.setEvent(EventType.READ); accessLog.setNodeIdentifier("foo"); accessLog.setSubject(event.getAccessor().getName()); log.info("access log to write:{}", accessLog); diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml index 8285d43..861d9b9 100644 --- a/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml +++ b/default-event-service/default-event-service-indexer/src/main/resources/event-service-beans.xml @@ -1,17 +1,21 @@ + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> + + + @@ -27,9 +31,9 @@ - - + + ${hibernate.dialect} @@ -58,7 +62,8 @@ - + diff --git a/default-event-service/default-event-service-indexer/src/main/resources/event.properties b/default-event-service/default-event-service-indexer/src/test/resources/event.properties similarity index 100% rename from default-event-service/default-event-service-indexer/src/main/resources/event.properties rename to default-event-service/default-event-service-indexer/src/test/resources/event.properties From 485afb8de7ecd1a369a92e99f0cbd438e39ab21c Mon Sep 17 00:00:00 2001 From: michael-conway Date: Thu, 8 Jun 2017 10:53:14 -0400 Subject: [PATCH 75/88] #9 bean wiring for event servcie, probably wrong and duplicative --- .../default-event-service-api-impl/pom.xml | 5 ++ .../defdb/DefaultEventServiceAOImpl.java | 1 - .../event-dao-hibernate-spring.cfg.xml | 9 +++ .../main/resources/event-service-beans.xml | 70 +++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 default-event-service/default-event-service-api-impl/src/main/resources/event-dao-hibernate-spring.cfg.xml create mode 100644 default-event-service/default-event-service-api-impl/src/main/resources/event-service-beans.xml diff --git a/default-event-service/default-event-service-api-impl/pom.xml b/default-event-service/default-event-service-api-impl/pom.xml index 2f86f4a..3192c07 100644 --- a/default-event-service/default-event-service-api-impl/pom.xml +++ b/default-event-service/default-event-service-api-impl/pom.xml @@ -44,5 +44,10 @@ event-service-api ${project.version} + + org.irods + default-event-service-persist + ${project.version} + diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java index ebc63f2..ab9967b 100644 --- a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java @@ -30,7 +30,6 @@ public class DefaultEventServiceAOImpl extends AbstractEventServiceAO { */ public DefaultEventServiceAOImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { super(irodsAccount, publicationContext); - // TODO Auto-generated constructor stub } /* diff --git a/default-event-service/default-event-service-api-impl/src/main/resources/event-dao-hibernate-spring.cfg.xml b/default-event-service/default-event-service-api-impl/src/main/resources/event-dao-hibernate-spring.cfg.xml new file mode 100644 index 0000000..08c0171 --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/main/resources/event-dao-hibernate-spring.cfg.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/default-event-service/default-event-service-api-impl/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-api-impl/src/main/resources/event-service-beans.xml new file mode 100644 index 0000000..861d9b9 --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/main/resources/event-service-beans.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + ${hibernate.dialect} + false + false + false + 4 + 8 + 900 + 50 + false + false + + + + + + + + + + + + + + + + + + + From 26086b5d593c4ae9cc0d9a7c1d479be6ebcebccc Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 9 Jun 2017 13:35:36 -0400 Subject: [PATCH 76/88] #9 fix hibernate pom stuff, boot of default servie --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../default-event-service-api-impl/pom.xml | 7 ++++-- .../defdb/DefaultEventServiceAOImpl.java | 16 ++++++++++++++ .../main/resources/event-service-beans.xml | 2 +- .../defdb/DefaultEventServiceAOImplTest.java | 22 +++++++++++++++++++ .../default-event-indexer.properties | 5 +++++ .../misc/rules/default-dataone-indexer.re | 13 +++++++++++ .../default-event-service-indexer/pom.xml | 1 - .../default-event-service-persist/pom.xml | 10 ++++++--- default-event-service/pom.xml | 9 ++++++++ pom.xml | 5 +++++ 11 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImplTest.java create mode 100644 default-event-service/default-event-service-indexer/misc/etc/irods-ext/default-event-indexer.properties create mode 100644 default-event-service/default-event-service-indexer/misc/rules/default-dataone-indexer.re diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index c6b1a9e..642327b 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-08T13:27:51Z"; + public static String BUILD_TIME="2017-06-09T17:14:09Z"; } diff --git a/default-event-service/default-event-service-api-impl/pom.xml b/default-event-service/default-event-service-api-impl/pom.xml index 3192c07..74a5d4a 100644 --- a/default-event-service/default-event-service-api-impl/pom.xml +++ b/default-event-service/default-event-service-api-impl/pom.xml @@ -11,7 +11,6 @@ jar Default event service api implementation - junit junit @@ -49,5 +48,9 @@ default-event-service-persist ${project.version} + + com.impossibl.pgjdbc-ng + pgjdbc-ng + - + \ No newline at end of file diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java index ab9967b..6daad9f 100644 --- a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java @@ -13,8 +13,13 @@ import org.irods.jargon.core.exception.InvalidArgumentException; import org.irods.jargon.core.exception.JargonException; import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; import org.irods.jargon.dataone.events.AbstractEventServiceAO; import org.irods.jargon.dataone.events.EventsEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Persistence based event service @@ -24,12 +29,16 @@ */ public class DefaultEventServiceAOImpl extends AbstractEventServiceAO { + private AccessLogDAO accessLogDAO; + private static final Logger log = LoggerFactory.getLogger(DefaultEventServiceAOImpl.class); + /** * @param irodsAccount * @param publicationContext */ public DefaultEventServiceAOImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { super(irodsAccount, publicationContext); + init(); } /* @@ -61,4 +70,11 @@ public void recordEvent(Event arg0, Identifier arg1, String arg2) } + private void init() { + ApplicationContext context = new ClassPathXmlApplicationContext( + new String[] { "event-service-beans.xml", "event-dao-hibernate-spring.cfg.xml" }); + this.accessLogDAO = (AccessLogDAO) context.getBean("accessLogDAO"); + log.info("successfully loaded DAO"); + } + } diff --git a/default-event-service/default-event-service-api-impl/src/main/resources/event-service-beans.xml b/default-event-service/default-event-service-api-impl/src/main/resources/event-service-beans.xml index 861d9b9..b22bf7e 100644 --- a/default-event-service/default-event-service-api-impl/src/main/resources/event-service-beans.xml +++ b/default-event-service/default-event-service-api-impl/src/main/resources/event-service-beans.xml @@ -62,7 +62,7 @@ - diff --git a/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImplTest.java b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImplTest.java new file mode 100644 index 0000000..396756e --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImplTest.java @@ -0,0 +1,22 @@ +package org.irods.jargon.dataone.events.defdb; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.core.pub.IRODSAccessObjectFactory; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; + +public class DefaultEventServiceAOImplTest { + + @Test + public void testLoad() throws Exception { + IRODSAccount dummyAccount = IRODSAccount.instance("host", 1247, "user", "pwd", "", "zone", ""); + IRODSAccessObjectFactory iaf = Mockito.mock(IRODSAccessObjectFactory.class); + PublicationContext context = new PublicationContext(); + context.setIrodsAccessObjectFactory(iaf); + DefaultEventServiceAOImpl defaultEventServiceAO = new DefaultEventServiceAOImpl(dummyAccount, context); + Assert.assertNotNull("no event service returned", defaultEventServiceAO); + } + +} diff --git a/default-event-service/default-event-service-indexer/misc/etc/irods-ext/default-event-indexer.properties b/default-event-service/default-event-service-indexer/misc/etc/irods-ext/default-event-indexer.properties new file mode 100644 index 0000000..8048592 --- /dev/null +++ b/default-event-service/default-event-service-indexer/misc/etc/irods-ext/default-event-indexer.properties @@ -0,0 +1,5 @@ +jdbc.url=jdbc:pgsql://irods420.irodslocal/IRODS-EXT?user=irodsext&password=password +jdbc.user=irodsext +jdbc.password=password +jdbc.driver=com.impossibl.postgres.jdbc.PGDriver +hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect diff --git a/default-event-service/default-event-service-indexer/misc/rules/default-dataone-indexer.re b/default-event-service/default-event-service-indexer/misc/rules/default-dataone-indexer.re new file mode 100644 index 0000000..a36f620 --- /dev/null +++ b/default-event-service/default-event-service-indexer/misc/rules/default-dataone-indexer.re @@ -0,0 +1,13 @@ + + acPostProcForOpen { + *err = errormsg(ipc_acPostProcForOpen, *msg); + if (*err < 0) { writeLine('serverLog', *msg); } + } + + + sendDataObjectOpen(*Data) = + let *msg = ipc_jsonDocument(list(mkEntityField(*Data), + mkPathField($objPath), + mkUserObject('accessor', $userNameClient, $rodsZoneClient))) + in sendMsg(DATA_OBJECT_TYPE ++ '.open', *msg) + \ No newline at end of file diff --git a/default-event-service/default-event-service-indexer/pom.xml b/default-event-service/default-event-service-indexer/pom.xml index 59990b2..84227c7 100644 --- a/default-event-service/default-event-service-indexer/pom.xml +++ b/default-event-service/default-event-service-indexer/pom.xml @@ -81,7 +81,6 @@ com.impossibl.pgjdbc-ng pgjdbc-ng - 0.7.1 diff --git a/default-event-service/default-event-service-persist/pom.xml b/default-event-service/default-event-service-persist/pom.xml index e8d649a..5e7be4d 100644 --- a/default-event-service/default-event-service-persist/pom.xml +++ b/default-event-service/default-event-service-persist/pom.xml @@ -65,10 +65,10 @@ org.hibernate hibernate-core - + org.springframework spring-core @@ -86,8 +86,12 @@ spring-tx + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + + diff --git a/default-event-service/pom.xml b/default-event-service/pom.xml index 1bec38d..1bee00f 100644 --- a/default-event-service/pom.xml +++ b/default-event-service/pom.xml @@ -10,6 +10,15 @@ pom Default event service parent + + + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + 1.0.0.Final + + + default-event-service-persist default-event-service-indexer diff --git a/pom.xml b/pom.xml index 3c081a8..66193d1 100644 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,11 @@ spring-integration-amqp ${spring.integration.version} + + com.impossibl.pgjdbc-ng + pgjdbc-ng + 0.7.1 + From 1349e98d9062548d9cc99d296bad6d38b508473a Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Thu, 8 Jun 2017 13:23:13 -0700 Subject: [PATCH 77/88] modified the indexer code to accept timestamps in AMQP messages --- .../events/def/indexer/Application.java | 2 +- .../def/indexer/EventConverterUtil.java | 20 +++++++++++++++--- .../events/def/indexer/LoggingEvent.java | 21 ++++++++++++++++++- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index c796760..1674f68 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -97,7 +97,7 @@ public void handleMessage(Message message) throws MessagingException { log.info("event:{}", event); AccessLog accessLog = new AccessLog(); accessLog.setIrodsPath(event.getPath()); - accessLog.setDateAdded(new Date()); + accessLog.setDateAdded(util.dateFromTimestamp(event.getTimestamp())); accessLog.setEvent(EventType.READ); accessLog.setNodeIdentifier("foo"); accessLog.setSubject(event.getAccessor().getName()); diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtil.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtil.java index db93d12..9853370 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtil.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/EventConverterUtil.java @@ -3,11 +3,15 @@ */ package org.irods.jargon.dataone.events.def.indexer; -import java.io.IOException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.irods.jargon.dataone.events.EventLoggingException; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; -import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.util.Date; /** * Utility for JSON conversion @@ -17,7 +21,8 @@ */ public class EventConverterUtil { - ObjectMapper mapper = new ObjectMapper(); + private ObjectMapper mapper = new ObjectMapper(); + private DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd.HH:mm:ss"); /** * @@ -37,4 +42,13 @@ public LoggingEvent loggingEventFromPayload(final byte[] payload) throws EventLo } + public Date dateFromTimestamp(final String timestamp) throws EventLoggingException { + DateTime result; + try { + result = fmt.parseDateTime(timestamp); + } catch (IllegalArgumentException e) { + throw new EventLoggingException("unable to parse timestamp: " + timestamp, e); + } + return result.toDate(); + } } diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java index df02ea7..67fdf48 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java @@ -12,6 +12,7 @@ public class LoggingEvent { private String entity = ""; private String path = ""; private Accessor accessor; + private String timestamp; /** * @@ -64,6 +65,21 @@ public void setAccessor(Accessor accessor) { this.accessor = accessor; } + /** + * @return the timestamp + */ + public String getTimestamp() { + return timestamp; + } + + /** + * @param timestamp + * the timestamp to set. + */ + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + /* * (non-Javadoc) * @@ -80,7 +96,10 @@ public String toString() { builder.append("path=").append(path).append(", "); } if (accessor != null) { - builder.append("accessor=").append(accessor); + builder.append("accessor=").append(accessor).append(", "); + } + if (timestamp != null) { + builder.append("timestamp=").append(timestamp); } builder.append("]"); return builder.toString(); From 5beda19ca959d3aed2d8fe55632de75e329e85bd Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Fri, 9 Jun 2017 10:01:02 -0700 Subject: [PATCH 78/88] use the EventsEnum class rather than the custom EventType enumeration for the persistence layer --- .../dataone/events/def/indexer/Application.java | 6 ++---- .../def/event/persist/dao/domain/AccessLog.java | 9 +++++---- .../def/event/persist/dao/domain/EventType.java | 14 -------------- 3 files changed, 7 insertions(+), 22 deletions(-) delete mode 100644 default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/EventType.java diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index 1674f68..f70ff2c 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -3,12 +3,10 @@ */ package org.irods.jargon.dataone.events.def.indexer; -import java.util.Date; - import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; -import org.irods.jargon.dataone.def.event.persist.dao.domain.EventType; import org.irods.jargon.dataone.events.EventLoggingException; +import org.irods.jargon.dataone.events.EventsEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; @@ -98,7 +96,7 @@ public void handleMessage(Message message) throws MessagingException { AccessLog accessLog = new AccessLog(); accessLog.setIrodsPath(event.getPath()); accessLog.setDateAdded(util.dateFromTimestamp(event.getTimestamp())); - accessLog.setEvent(EventType.READ); + accessLog.setEvent(EventsEnum.READ); accessLog.setNodeIdentifier("foo"); accessLog.setSubject(event.getAccessor().getName()); log.info("access log to write:{}", accessLog); diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java index 399bcd0..33f4858 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/AccessLog.java @@ -4,6 +4,7 @@ package org.irods.jargon.dataone.def.event.persist.dao.domain; import org.hibernate.annotations.ColumnTransformer; +import org.irods.jargon.dataone.events.EventsEnum; import java.util.Date; import java.util.UUID; @@ -48,7 +49,7 @@ public class AccessLog { @Column(name = "event", columnDefinition = "event_type", nullable = false) @Enumerated(EnumType.STRING) - private EventType event; + private EventsEnum event; @Column(name = "date_logged") @Temporal(javax.persistence.TemporalType.TIMESTAMP) @@ -215,7 +216,7 @@ public String toString() { builder.append("subject=").append(subject).append(", "); } if (event != null) { - builder.append("eventType=").append(event).append(", "); + builder.append("event=").append(event).append(", "); } if (dateAdded != null) { builder.append("dateAdded=").append(dateAdded).append(", "); @@ -230,7 +231,7 @@ public String toString() { /** * @return the event */ - public EventType getEvent() { + public EventsEnum getEvent() { return event; } @@ -238,7 +239,7 @@ public EventType getEvent() { * @param event * the event to set */ - public void setEvent(EventType event) { + public void setEvent(EventsEnum event) { this.event = event; } diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/EventType.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/EventType.java deleted file mode 100644 index a520d31..0000000 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/domain/EventType.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.irods.jargon.dataone.def.event.persist.dao.domain; - -/** - * @author dennis - */ -public enum EventType { - CREATE, - DELETE, - READ, - REPLICATE, - REPLICATION_FAILED, - SYNCHRONIZATION_FAILED, - UPDATE -} From 7a619cc8f59aef21ab7d5d37f1f6288acb73f6cd Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Fri, 9 Jun 2017 10:33:28 -0700 Subject: [PATCH 79/88] added the query for the /logs endpoint --- .../defdb/DefaultEventServiceAOImpl.java | 3 +- .../def/event/persist/dao/AccessLogDAO.java | 27 +++++++++++++- .../event/persist/dao/AccessLogDAOImpl.java | 37 +++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java index 6daad9f..a75e2bc 100644 --- a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java @@ -50,8 +50,7 @@ public DefaultEventServiceAOImpl(IRODSAccount irodsAccount, PublicationContext p * java.lang.String, int, int) */ @Override - public Log getLogs(Date arg0, Date arg1, EventsEnum arg2, String arg3, int arg4, int arg5) { - // TODO Auto-generated method stub + public Log getLogs(Date start, Date end, EventsEnum event, String pid, int offset, int limit) { return null; } diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java index d30104f..f9f265c 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAO.java @@ -5,6 +5,10 @@ import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; import org.irods.jargon.dataone.events.EventLoggingException; +import org.irods.jargon.dataone.events.EventsEnum; + +import java.util.Date; +import java.util.List; /** * DAO interface for Access log @@ -19,7 +23,7 @@ public interface AccessLogDAO { * * @param accessLog * {@link AccessLog} entry containing the event - * @throws TransferDAOException + * @throws EventLoggingException */ void save(AccessLog accessLog) throws EventLoggingException; @@ -42,4 +46,25 @@ public interface AccessLogDAO { */ void delete(AccessLog accessLog) throws EventLoggingException; + /** + * Finds a set of access log entries. + * + * @param start + * the start date for the search, if any + * @param end + * the end date for the search, if any + * @param eventType + * the selected event type, if any + * @param pid + * the permanent identifier, if any + * @param offset + * the starting offset for paged listings + * @param limit + * the maximum number of results for paged listings. + * + * @return the list of matching events + * @throws EventLoggingException if an error occurs in the query + */ + List find(Date start, Date end, EventsEnum eventType, String pid, int offset, int limit) + throws EventLoggingException; } diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java index 6eb2d80..6b0a5f7 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java @@ -5,12 +5,18 @@ import org.hibernate.Criteria; import org.hibernate.SessionFactory; +import org.hibernate.criterion.Restrictions; import org.irods.jargon.dataone.def.event.persist.dao.domain.AccessLog; import org.irods.jargon.dataone.events.EventLoggingException; +import org.irods.jargon.dataone.events.EventsEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import java.awt.*; +import java.util.Date; +import java.util.List; + /** * Impl of an access log * @@ -88,6 +94,37 @@ public void delete(AccessLog accessLog) throws EventLoggingException { } } + @Override + public List find(Date start, Date end, EventsEnum eventType, String pid, int offset, int limit) + throws EventLoggingException { + log.info("find start:{}, end:{}, eventType:{}, pid:{}, offset:{}, limit:{}", start, end, eventType, pid, + offset, limit); + + List results; + try { + Criteria crit = sessionFactory.getCurrentSession().createCriteria(AccessLog.class); + if (start != null) { + crit.add(Restrictions.ge("dateAdded", start)); + } + if (end != null) { + crit.add(Restrictions.le("dateAdded", end)); + } + if (eventType != null) { + crit.add(Restrictions.eq("event", eventType)); + } + if (pid != null) { + crit.add(Restrictions.eq("permanentId", pid)); + } + crit.setFirstResult(offset); + crit.setMaxResults(limit); + results = crit.list(); + } catch (Exception e) { + log.error("error in find(start, end, eventType, offset, limit)", e); + throw new EventLoggingException("failed find(start, end, eventType, offset, limit)", e); + } + return results; + } + /** * @return the log */ From 8c22f82345c71453b927fb9528d9e935d3fc6355 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Fri, 9 Jun 2017 13:52:31 -0400 Subject: [PATCH 80/88] #9 fix for missing jta --- .../irods/jargon/dataone/utils/RestVersion.java | 2 +- .../default-event-service-persist/pom.xml | 16 ++++++++-------- default-event-service/pom.xml | 7 +++++++ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 642327b..0ac0399 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-09T17:14:09Z"; + public static String BUILD_TIME="2017-06-09T17:48:37Z"; } diff --git a/default-event-service/default-event-service-persist/pom.xml b/default-event-service/default-event-service-persist/pom.xml index 5e7be4d..9dbc122 100644 --- a/default-event-service/default-event-service-persist/pom.xml +++ b/default-event-service/default-event-service-persist/pom.xml @@ -65,10 +65,8 @@ org.hibernate hibernate-core - + org.springframework spring-core @@ -89,9 +87,11 @@ org.hibernate.javax.persistence hibernate-jpa-2.1-api - + + javax.transaction + jta + + diff --git a/default-event-service/pom.xml b/default-event-service/pom.xml index 1bee00f..7552f17 100644 --- a/default-event-service/pom.xml +++ b/default-event-service/pom.xml @@ -17,6 +17,13 @@ hibernate-jpa-2.1-api 1.0.0.Final + + + javax.transaction + jta + 1.1 + + From ab7e25f2d148f5ea34dd224084fa77fb44ea6931 Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Fri, 9 Jun 2017 16:26:10 -0700 Subject: [PATCH 81/88] added the event service factory for the default event service API implementation --- .../defdb/DefaultEventServiceFactory.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java new file mode 100644 index 0000000..8478bb0 --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java @@ -0,0 +1,17 @@ +package org.irods.jargon.dataone.events.defdb; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.events.AbstractDataOneEventServiceFactory; +import org.irods.jargon.dataone.events.DataOneEventServiceAO; + +/** + * @author dennis + */ +public class DefaultEventServiceFactory extends AbstractDataOneEventServiceFactory { + + @Override + public DataOneEventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { + return new DefaultEventServiceAOImpl(irodsAccount, publicationContext); + } +} From 9fde4bcf028a5b376d12242eb87535adb33ca388 Mon Sep 17 00:00:00 2001 From: Dennis Roberts Date: Tue, 13 Jun 2017 15:42:27 -0700 Subject: [PATCH 82/88] changed the "accessor" field in the data object open AMQP message to "author" --- .../misc/rules/default-dataone-indexer.re | 2 +- .../events/def/indexer/Application.java | 2 +- .../events/def/indexer/LoggingEvent.java | 20 +++++++++---------- .../test/resources/sample-messages/msg1.json | 2 +- .../test/resources/sample-messages/msg2.json | 2 +- .../default-event-service-persist/README.md | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/default-event-service/default-event-service-indexer/misc/rules/default-dataone-indexer.re b/default-event-service/default-event-service-indexer/misc/rules/default-dataone-indexer.re index a36f620..8e0942c 100644 --- a/default-event-service/default-event-service-indexer/misc/rules/default-dataone-indexer.re +++ b/default-event-service/default-event-service-indexer/misc/rules/default-dataone-indexer.re @@ -8,6 +8,6 @@ sendDataObjectOpen(*Data) = let *msg = ipc_jsonDocument(list(mkEntityField(*Data), mkPathField($objPath), - mkUserObject('accessor', $userNameClient, $rodsZoneClient))) + mkUserObject('author', $userNameClient, $rodsZoneClient))) in sendMsg(DATA_OBJECT_TYPE ++ '.open', *msg) \ No newline at end of file diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java index f70ff2c..2ba504e 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/Application.java @@ -98,7 +98,7 @@ public void handleMessage(Message message) throws MessagingException { accessLog.setDateAdded(util.dateFromTimestamp(event.getTimestamp())); accessLog.setEvent(EventsEnum.READ); accessLog.setNodeIdentifier("foo"); - accessLog.setSubject(event.getAccessor().getName()); + accessLog.setSubject(event.getAuthor().getName()); log.info("access log to write:{}", accessLog); accessLogDAO.save(accessLog); log.info("saved!"); diff --git a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java index 67fdf48..02c2ee5 100644 --- a/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java +++ b/default-event-service/default-event-service-indexer/src/main/java/org/irods/jargon/dataone/events/def/indexer/LoggingEvent.java @@ -11,7 +11,7 @@ public class LoggingEvent { private String entity = ""; private String path = ""; - private Accessor accessor; + private Accessor author; private String timestamp; /** @@ -51,18 +51,18 @@ public void setPath(String path) { } /** - * @return the accessor + * @return the author */ - public Accessor getAccessor() { - return accessor; + public Accessor getAuthor() { + return author; } /** - * @param accessor - * the accessor to set + * @param author + * the author to set */ - public void setAccessor(Accessor accessor) { - this.accessor = accessor; + public void setAuthor(Accessor author) { + this.author = author; } /** @@ -95,8 +95,8 @@ public String toString() { if (path != null) { builder.append("path=").append(path).append(", "); } - if (accessor != null) { - builder.append("accessor=").append(accessor).append(", "); + if (author != null) { + builder.append("author=").append(author).append(", "); } if (timestamp != null) { builder.append("timestamp=").append(timestamp); diff --git a/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json index 080711d..a31070b 100644 --- a/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json +++ b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg1.json @@ -1 +1 @@ -{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","accessor":{"name":"rods","zone":"iplant"}} \ No newline at end of file +{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","author":{"name":"rods","zone":"iplant"}} \ No newline at end of file diff --git a/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg2.json b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg2.json index 7f63f60..8154dcc 100644 --- a/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg2.json +++ b/default-event-service/default-event-service-indexer/src/test/resources/sample-messages/msg2.json @@ -1 +1 @@ -'data-object.open':'{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","accessor":{"name":"rods","zone":"iplant"}} \ No newline at end of file +'data-object.open':'{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","author":{"name":"rods","zone":"iplant"}} \ No newline at end of file diff --git a/default-event-service/default-event-service-persist/README.md b/default-event-service/default-event-service-persist/README.md index 7e281c8..c5d0228 100644 --- a/default-event-service/default-event-service-persist/README.md +++ b/default-event-service/default-event-service-persist/README.md @@ -27,7 +27,7 @@ Off you go! #### in amqp console put json into queue ``` -{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","accessor":{"name":"rods","zone":"iplant"}} +{"entity":"a401d352-4a33-11e7-9d94-1a5a300ff36f","path":"/iplant/home/dennis/foo.md","author":{"name":"rods","zone":"iplant"}} ``` From a15e5b43e60bca8d74a118f15b0fe3682d80036a Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 20 Jun 2017 10:42:47 -0400 Subject: [PATCH 83/88] #10 factory now boots up and creates instance --- .../jargon/dataone/utils/RestVersion.java | 2 +- .../defdb/DefaultEventServiceAOImpl.java | 35 ++++++++++--------- .../defdb/DefaultEventServiceFactory.java | 17 ++++++++- .../defdb/DefaultEventServiceAOImplTest.java | 5 ++- .../defdb/DefaultEventServiceFactoryTest.java | 24 +++++++++++++ .../events/defdb/unittest/AllTests.java | 13 +++++++ .../events/defdb/unittest/package-info.java | 8 +++++ .../event/persist/dao/AccessLogDAOImpl.java | 13 ++++--- 8 files changed, 91 insertions(+), 26 deletions(-) create mode 100644 default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactoryTest.java create mode 100644 default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/unittest/AllTests.java create mode 100644 default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/unittest/package-info.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 0ac0399..29ecb03 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-09T17:48:37Z"; + public static String BUILD_TIME="2017-06-20T12:33:06Z"; } diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java index a75e2bc..07affdf 100644 --- a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java @@ -1,5 +1,5 @@ /** - * + * */ package org.irods.jargon.dataone.events.defdb; @@ -18,62 +18,65 @@ import org.irods.jargon.dataone.events.EventsEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Persistence based event service - * + * * @author mcc * */ public class DefaultEventServiceAOImpl extends AbstractEventServiceAO { - private AccessLogDAO accessLogDAO; private static final Logger log = LoggerFactory.getLogger(DefaultEventServiceAOImpl.class); + private final AccessLogDAO accessLogDAO; /** * @param irodsAccount * @param publicationContext */ - public DefaultEventServiceAOImpl(IRODSAccount irodsAccount, PublicationContext publicationContext) { + public DefaultEventServiceAOImpl(final IRODSAccount irodsAccount, final PublicationContext publicationContext, + final AccessLogDAO accessLogDAO) { super(irodsAccount, publicationContext); - init(); + if (accessLogDAO == null) { + throw new IllegalArgumentException("null accessLogDAO"); + } + this.accessLogDAO = accessLogDAO; } /* * (non-Javadoc) - * + * * @see * org.irods.jargon.dataone.events.AbstractEventServiceAO#getLogs(java.util. * Date, java.util.Date, org.irods.jargon.dataone.events.EventsEnum, * java.lang.String, int, int) */ @Override - public Log getLogs(Date start, Date end, EventsEnum event, String pid, int offset, int limit) { + public Log getLogs(final Date start, final Date end, final EventsEnum event, final String pid, final int offset, + final int limit) { return null; } /* * (non-Javadoc) - * + * * @see * org.irods.jargon.dataone.events.AbstractEventServiceAO#recordEvent(org. * dataone.service.types.v1.Event, org.dataone.service.types.v1.Identifier, * java.lang.String) */ @Override - public void recordEvent(Event arg0, Identifier arg1, String arg2) + public void recordEvent(final Event arg0, final Identifier arg1, final String arg2) throws InvalidArgumentException, JargonException, ServiceFailure { // TODO Auto-generated method stub } - private void init() { - ApplicationContext context = new ClassPathXmlApplicationContext( - new String[] { "event-service-beans.xml", "event-dao-hibernate-spring.cfg.xml" }); - this.accessLogDAO = (AccessLogDAO) context.getBean("accessLogDAO"); - log.info("successfully loaded DAO"); + /** + * @return the accessLogDAO + */ + public AccessLogDAO getAccessLogDAO() { + return accessLogDAO; } } diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java index 8478bb0..e22e466 100644 --- a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java @@ -2,16 +2,31 @@ import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; import org.irods.jargon.dataone.events.AbstractDataOneEventServiceFactory; import org.irods.jargon.dataone.events.DataOneEventServiceAO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author dennis */ public class DefaultEventServiceFactory extends AbstractDataOneEventServiceFactory { + private static final Logger log = LoggerFactory.getLogger(DefaultEventServiceFactory.class); + @Override public DataOneEventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { - return new DefaultEventServiceAOImpl(irodsAccount, publicationContext); + return new DefaultEventServiceAOImpl(irodsAccount, publicationContext, init()); + } + + private AccessLogDAO init() { + ApplicationContext context = new ClassPathXmlApplicationContext( + new String[] { "event-service-beans.xml", "event-dao-hibernate-spring.cfg.xml" }); + AccessLogDAO accessLogDAO = (AccessLogDAO) context.getBean("accessLogDAO"); + log.info("successfully loaded DAO"); + return accessLogDAO; } } diff --git a/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImplTest.java b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImplTest.java index 396756e..3d56e17 100644 --- a/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImplTest.java +++ b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImplTest.java @@ -3,6 +3,7 @@ import org.irods.jargon.core.connection.IRODSAccount; import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -15,7 +16,9 @@ public void testLoad() throws Exception { IRODSAccessObjectFactory iaf = Mockito.mock(IRODSAccessObjectFactory.class); PublicationContext context = new PublicationContext(); context.setIrodsAccessObjectFactory(iaf); - DefaultEventServiceAOImpl defaultEventServiceAO = new DefaultEventServiceAOImpl(dummyAccount, context); + AccessLogDAO accessLogDAO = Mockito.mock(AccessLogDAO.class); + DefaultEventServiceAOImpl defaultEventServiceAO = new DefaultEventServiceAOImpl(dummyAccount, context, + accessLogDAO); Assert.assertNotNull("no event service returned", defaultEventServiceAO); } diff --git a/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactoryTest.java b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactoryTest.java new file mode 100644 index 0000000..7b4693f --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactoryTest.java @@ -0,0 +1,24 @@ +package org.irods.jargon.dataone.events.defdb; + +import org.irods.jargon.core.connection.IRODSAccount; +import org.irods.jargon.core.pub.IRODSAccessObjectFactory; +import org.irods.jargon.dataone.configuration.PublicationContext; +import org.irods.jargon.dataone.events.DataOneEventServiceAO; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; + +public class DefaultEventServiceFactoryTest { + + @Test + public void testLoadFromFactory() throws Exception { + IRODSAccount dummyAccount = IRODSAccount.instance("host", 1247, "user", "pwd", "", "zone", ""); + IRODSAccessObjectFactory iaf = Mockito.mock(IRODSAccessObjectFactory.class); + PublicationContext context = new PublicationContext(); + context.setIrodsAccessObjectFactory(iaf); + DefaultEventServiceFactory defaultEventServiceFactory = new DefaultEventServiceFactory(); + DataOneEventServiceAO dataOneEventServiceAO = defaultEventServiceFactory.instance(context, dummyAccount); + Assert.assertNotNull("no event service created", dataOneEventServiceAO); + } + +} diff --git a/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/unittest/AllTests.java b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/unittest/AllTests.java new file mode 100644 index 0000000..9dccc9b --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/unittest/AllTests.java @@ -0,0 +1,13 @@ +package org.irods.jargon.dataone.events.defdb.unittest; + +import org.irods.jargon.dataone.events.defdb.DefaultEventServiceAOImplTest; +import org.irods.jargon.dataone.events.defdb.DefaultEventServiceFactoryTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ DefaultEventServiceAOImplTest.class, DefaultEventServiceFactoryTest.class }) +public class AllTests { + +} diff --git a/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/unittest/package-info.java b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/unittest/package-info.java new file mode 100644 index 0000000..25334d4 --- /dev/null +++ b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/unittest/package-info.java @@ -0,0 +1,8 @@ + +/** + * Suites and general support + * + * @author mcc + * + */ +package org.irods.jargon.dataone.events.defdb.unittest; \ No newline at end of file diff --git a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java index 6b0a5f7..f5ef2cb 100644 --- a/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java +++ b/default-event-service/default-event-service-persist/src/main/java/org/irods/jargon/dataone/def/event/persist/dao/AccessLogDAOImpl.java @@ -3,6 +3,9 @@ */ package org.irods.jargon.dataone.def.event.persist.dao; +import java.util.Date; +import java.util.List; + import org.hibernate.Criteria; import org.hibernate.SessionFactory; import org.hibernate.criterion.Restrictions; @@ -13,17 +16,12 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import java.awt.*; -import java.util.Date; -import java.util.List; - /** * Impl of an access log * * @author mcc * */ -@SuppressWarnings("deprecation") public class AccessLogDAOImpl implements AccessLogDAO { private static final Logger log = LoggerFactory.getLogger(AccessLogDAOImpl.class); @@ -94,11 +92,12 @@ public void delete(AccessLog accessLog) throws EventLoggingException { } } + @SuppressWarnings("unchecked") @Override public List find(Date start, Date end, EventsEnum eventType, String pid, int offset, int limit) throws EventLoggingException { - log.info("find start:{}, end:{}, eventType:{}, pid:{}, offset:{}, limit:{}", start, end, eventType, pid, - offset, limit); + log.info("find start:{}, end:{}, eventType:{}, pid:{}, offset:{}, limit:{}", start, end, eventType, pid, offset, + limit); List results; try { From ed912703f2da166ef0998678fe708fba6deacf3c Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 20 Jun 2017 12:18:35 -0400 Subject: [PATCH 84/88] #10 updated docker to add extra libs, factories now discovered in docker image, including default event service --- dataone-node/Dockerfile | 8 ++--- dataone-node/context.xml | 36 +++++++++++++++++++ .../irods/jargon/dataone/domain/MNNode.java | 23 ++++++------ .../jargon/dataone/utils/RestVersion.java | 2 +- .../default-event-service-api-impl/pom.xml | 21 +++++++++++ 5 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 dataone-node/context.xml diff --git a/dataone-node/Dockerfile b/dataone-node/Dockerfile index 709c68b..6383c0d 100644 --- a/dataone-node/Dockerfile +++ b/dataone-node/Dockerfile @@ -4,6 +4,7 @@ LABEL maintainer="michael_conway@unc.edu" LABEL description="DFC Member Node" ADD target/dataone-node.war /usr/local/tomcat/webapps/ ADD runit.sh / +ADD context.xml /usr/local/tomcat/conf CMD ["/runit.sh"] #CMD ["sh"] # build: docker build -t diceunc/dataone:4.2.1.0-SNAPSHOT . @@ -11,10 +12,7 @@ CMD ["/runit.sh"] # run: docker run -i -p 8080:8080 -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT -# to add addl libs -v /localdir:/tmp/lib +# to add addl libs -v /etc/irods-ext/d1libs:/tmp/lib - - - -# docker run -i -p 8080:8080 -v /home/mcc/external:/tmp/lib -v /etc/irods-ext:/etc/irods-ext -v /etc/irods-ext/d1plugins:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT \ No newline at end of file +# docker run -i -p 8080:8080 -v /home/mcc/external:/tmp/lib -v /etc/irods-ext:/etc/irods-ext -v /home/mcc/d1plugin:/etc/irods-ext/d1plugins -v /home/mcc/webdavcert:/tmp/cert --add-host irods420.irodslocal:172.16.250.101 diceunc/dataone:4.2.1.0-SNAPSHOT \ No newline at end of file diff --git a/dataone-node/context.xml b/dataone-node/context.xml new file mode 100644 index 0000000..9954abb --- /dev/null +++ b/dataone-node/context.xml @@ -0,0 +1,36 @@ + + + + + + + + WEB-INF/web.xml + ${catalina.base}/conf/web.xml + + + + + + + \ No newline at end of file diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java index 2705c44..81030e0 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java @@ -23,8 +23,8 @@ import org.slf4j.LoggerFactory; @XmlRootElement(name = "node") -@XmlType(propOrder = { "identifier", "name", "description", "baseURL", - "services", "synchronization", "ping", "subject", "contactSubject" }) +@XmlType(propOrder = { "identifier", "name", "description", "baseURL", "services", "synchronization", "ping", "subject", + "contactSubject" }) public class MNNode { private final String serviceKey = "irods.dataone.service."; @@ -64,7 +64,7 @@ private void initializeProperties() { InputStream input = null; try { - String filename = "d1client.properties"; + String filename = "/etc/irods-ext/d1client.properties"; input = getClass().getClassLoader().getResourceAsStream(filename); // load a properties file @@ -114,7 +114,7 @@ private MNSynchronization initSychronization(final Properties prop) { } private List initServices(final Properties prop) { - List services = new ArrayList(); + List services = new ArrayList<>(); Enumeration keys = prop.propertyNames(); while (keys.hasMoreElements()) { @@ -123,12 +123,9 @@ private List initServices(final Properties prop) { String serviceName = prop.getProperty(key); MNService service = new MNService(); service.setName(serviceName); - String isServiceAvailableKey = serviceKey - + serviceName.toLowerCase(); - String isServiceAvailableValue = prop - .getProperty(isServiceAvailableKey); - service.setAvailable(Boolean - .parseBoolean(isServiceAvailableValue)); + String isServiceAvailableKey = serviceKey + serviceName.toLowerCase(); + String isServiceAvailableValue = prop.getProperty(isServiceAvailableKey); + service.setAvailable(Boolean.parseBoolean(isServiceAvailableValue)); String verKey = isServiceAvailableKey + ".version"; service.setVersion(prop.getProperty(verKey)); services.add(service); @@ -272,7 +269,7 @@ public void copy(final Node node) { if (node.getServices() != null) { Services services = node.getServices(); List serviceList = services.getServiceList(); - this.services = new ArrayList(); + this.services = new ArrayList<>(); for (Service s : serviceList) { MNService mnService = new MNService(); @@ -295,7 +292,7 @@ public void copy(final Node node) { if (node.getSubjectList() != null) { List subjectList = node.getSubjectList(); - subject = new ArrayList(); + subject = new ArrayList<>(); for (Subject s : subjectList) { subject.add(s.getValue()); @@ -304,7 +301,7 @@ public void copy(final Node node) { if (node.getContactSubjectList() != null) { List subjectList = node.getContactSubjectList(); - contactSubject = new ArrayList(); + contactSubject = new ArrayList<>(); for (Subject s : subjectList) { contactSubject.add(s.getValue()); diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 29ecb03..8fed921 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-20T12:33:06Z"; + public static String BUILD_TIME="2017-06-20T16:06:18Z"; } diff --git a/default-event-service/default-event-service-api-impl/pom.xml b/default-event-service/default-event-service-api-impl/pom.xml index 74a5d4a..83da459 100644 --- a/default-event-service/default-event-service-api-impl/pom.xml +++ b/default-event-service/default-event-service-api-impl/pom.xml @@ -53,4 +53,25 @@ pgjdbc-ng + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.0.1 + + + copy-dependencies + package + + copy-dependencies + + + + + + + + + \ No newline at end of file From d948945dfdc27599875c63aa05e69e91c047272e Mon Sep 17 00:00:00 2001 From: michael-conway Date: Tue, 20 Jun 2017 13:07:36 -0400 Subject: [PATCH 85/88] #10 fix d1client.properties to load from /etc --- .../irods/jargon/dataone/domain/MNNode.java | 55 ++++++------------- .../jargon/dataone/domain/MNSchedule.java | 44 ++++----------- .../jargon/dataone/utils/RestVersion.java | 2 +- .../configuration/PropertiesLoader.java | 55 +++++++++++++++++++ 4 files changed, 86 insertions(+), 70 deletions(-) create mode 100644 dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PropertiesLoader.java diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java index 81030e0..896b0d7 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNNode.java @@ -1,7 +1,5 @@ package org.irods.jargon.dataone.domain; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -19,6 +17,7 @@ import org.dataone.service.types.v1.Services; import org.dataone.service.types.v1.Subject; import org.dataone.service.types.v1.Synchronization; +import org.irods.jargon.dataone.utils.PropertiesLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,41 +59,23 @@ public MNNode() { } private void initializeProperties() { - Properties prop = new Properties(); - InputStream input = null; - - try { - String filename = "/etc/irods-ext/d1client.properties"; - input = getClass().getClassLoader().getResourceAsStream(filename); - - // load a properties file - prop.load(input); - - replicate = prop.getProperty("irods.dataone.replicate"); - synchronize = prop.getProperty("irods.dataone.synchronize"); - type = prop.getProperty("irods.dataone.type"); - // TODO: make sure proper exceptions are caught and handled - - identifier = prop.getProperty("irods.dataone.identifier"); - name = prop.getProperty("irods.dataone.name"); - description = prop.getProperty("irods.dataone.description"); - baseURL = prop.getProperty("irods.dataone.baseurl"); - services = initServices(prop); - synchronization = initSychronization(prop); - // this.subject = initSubjects(prop); - // this.contactSubject = initContactSubjects(prop); - - } catch (IOException ex) { - ex.printStackTrace(); - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + PropertiesLoader loader = new PropertiesLoader(); + Properties prop = loader.getProperties(); + + replicate = prop.getProperty("irods.dataone.replicate"); + synchronize = prop.getProperty("irods.dataone.synchronize"); + type = prop.getProperty("irods.dataone.type"); + // TODO: make sure proper exceptions are caught and handled + + identifier = prop.getProperty("irods.dataone.identifier"); + name = prop.getProperty("irods.dataone.name"); + description = prop.getProperty("irods.dataone.description"); + baseURL = prop.getProperty("irods.dataone.baseurl"); + services = initServices(prop); + synchronization = initSychronization(prop); + // this.subject = initSubjects(prop); + // this.contactSubject = initContactSubjects(prop); + } private List initContactSubjects(final Properties prop) { diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java index 623d955..80201ea 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/domain/MNSchedule.java @@ -1,7 +1,5 @@ package org.irods.jargon.dataone.domain; -import java.io.IOException; -import java.io.InputStream; import java.util.Properties; import javax.xml.bind.annotation.XmlAccessType; @@ -9,6 +7,7 @@ import javax.xml.bind.annotation.XmlAttribute; import org.dataone.service.types.v1.Schedule; +import org.irods.jargon.dataone.utils.PropertiesLoader; @XmlAccessorType(XmlAccessType.NONE) public class MNSchedule { @@ -33,36 +32,17 @@ public MNSchedule() { } private void initializeProperties() { - Properties prop = new Properties(); - InputStream input = null; - - try { - - String filename = "d1client.properties"; - input = getClass().getClassLoader().getResourceAsStream(filename); - - // load a properties file - prop.load(input); - - hour = prop.getProperty("irods.dataone.sync.schedule.hour"); - mday = prop.getProperty("irods.dataone.sync.schedule.mday"); - min = prop.getProperty("irods.dataone.sync.schedule.min"); - mon = prop.getProperty("irods.dataone.sync.schedule.mon"); - sec = prop.getProperty("irods.dataone.sync.schedule.sec"); - wday = prop.getProperty("irods.dataone.sync.schedule.wday"); - year = prop.getProperty("irods.dataone.sync.schedule.year"); - - } catch (IOException ex) { - ex.printStackTrace(); - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + PropertiesLoader loader = new PropertiesLoader(); + Properties prop = loader.getProperties(); + + hour = prop.getProperty("irods.dataone.sync.schedule.hour"); + mday = prop.getProperty("irods.dataone.sync.schedule.mday"); + min = prop.getProperty("irods.dataone.sync.schedule.min"); + mon = prop.getProperty("irods.dataone.sync.schedule.mon"); + sec = prop.getProperty("irods.dataone.sync.schedule.sec"); + wday = prop.getProperty("irods.dataone.sync.schedule.wday"); + year = prop.getProperty("irods.dataone.sync.schedule.year"); + } // public String getHour() { diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index 8fed921..b6a4265 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-20T16:06:18Z"; + public static String BUILD_TIME="2017-06-20T17:05:29Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PropertiesLoader.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PropertiesLoader.java new file mode 100644 index 0000000..3a8a634 --- /dev/null +++ b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PropertiesLoader.java @@ -0,0 +1,55 @@ +/** + * + */ +package org.irods.jargon.dataone.configuration; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.irods.jargon.core.exception.JargonRuntimeException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Load config properties from /etc/irods-ext + * + * @author mcc + * + */ +public class PropertiesLoader { + + private Logger log = LoggerFactory.getLogger(this.getClass()); + + /** + * + */ + public PropertiesLoader() { + } + + public Properties loadD1Properties() { + Properties prop = new Properties(); + InputStream input = null; + + try { + log.info("loading properties from /etc/irods-ext/d1client.properties"); + String filename = "/etc/irods-ext/d1client.properties"; + input = new FileInputStream(filename); + + prop.load(input); + return prop; + } catch (IOException ex) { + log.error("IOException loading props", ex); + throw new JargonRuntimeException("unable to load properties", ex); + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException e) { + } + } + } + } + +} From 6a5c53714f41fc733f8a12528d0b5cb56de84fd5 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 21 Jun 2017 09:05:44 -0400 Subject: [PATCH 86/88] #10 testing classloading --- .../configuration/PluginDiscoveryService.java | 3 + .../jargon/dataone/utils/RestVersion.java | 2 +- .../PluginDiscoveryServiceTest.java | 6 +- .../default-event-service-api-impl/pom.xml | 73 ++++++++++++------- .../defdb/DefaultEventServiceAOImpl.java | 2 +- .../defdb/DefaultEventServiceFactory.java | 18 ++++- .../defdb/DefaultEventServiceFactoryTest.java | 4 + 7 files changed, 75 insertions(+), 33 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java index 63f0f24..ef87f4c 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java @@ -63,6 +63,9 @@ public PluginDiscoveryService() { public DataOneEventServiceAO instanceEventService(IRODSAccount irodsAccount) throws PluginNotFoundException { log.info("instanceEventService()"); + log.info("dataOneEventServiceFactory:{}", dataOneEventServiceFactory); + log.info("publicationContext:{}", getPublicationContext()); + log.info("irodsAccount:{}", irodsAccount); return dataOneEventServiceFactory.instance(getPublicationContext(), irodsAccount); } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index b6a4265..a08d965 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-20T17:05:29Z"; + public static String BUILD_TIME="2017-06-21T12:31:07Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java index 0c30692..5e782d4 100644 --- a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java +++ b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PluginDiscoveryServiceTest.java @@ -33,7 +33,7 @@ public void testInit() throws Exception { public void testInstanceEventService() throws Exception { IRODSAccount dummyAccount = new IRODSAccount("xxx", 1247, "xxx", "xxx", "xxx", "xxx", "xxx"); PublicationContext publicationContext = new PublicationContext(); - File rescFile = LocalFileUtils.getClasspathResourceAsFile("/dummyjars"); + File rescFile = new File("/home/mcc/d1plugin"); Assert.assertNotNull("no file path", rescFile); RestConfiguration restConfiguration = new RestConfiguration(); restConfiguration.setPluginJarLocation(rescFile.getAbsolutePath()); @@ -49,7 +49,7 @@ public void testInstanceEventService() throws Exception { public void testInstanceUniqueIdService() throws Exception { IRODSAccount dummyAccount = new IRODSAccount("xxx", 1247, "xxx", "xxx", "xxx", "xxx", "xxx"); PublicationContext publicationContext = new PublicationContext(); - File rescFile = LocalFileUtils.getClasspathResourceAsFile("/dummyjars"); + File rescFile = new File("/home/mcc/d1plugin"); Assert.assertNotNull("no file path", rescFile); RestConfiguration restConfiguration = new RestConfiguration(); restConfiguration.setPluginJarLocation(rescFile.getAbsolutePath()); @@ -65,7 +65,7 @@ public void testInstanceUniqueIdService() throws Exception { public void testInstanceRepoService() throws Exception { IRODSAccount dummyAccount = new IRODSAccount("xxx", 1247, "xxx", "xxx", "xxx", "xxx", "xxx"); PublicationContext publicationContext = new PublicationContext(); - File rescFile = LocalFileUtils.getClasspathResourceAsFile("/dummyjars"); + File rescFile = new File("/home/mcc/d1plugin"); Assert.assertNotNull("no file path", rescFile); RestConfiguration restConfiguration = new RestConfiguration(); restConfiguration.setPluginJarLocation(rescFile.getAbsolutePath()); diff --git a/default-event-service/default-event-service-api-impl/pom.xml b/default-event-service/default-event-service-api-impl/pom.xml index 83da459..ea26ad0 100644 --- a/default-event-service/default-event-service-api-impl/pom.xml +++ b/default-event-service/default-event-service-api-impl/pom.xml @@ -33,15 +33,11 @@ dataone-utils ${project.version} - - org.irods - dataone-utils - ${project.version} - org.irods event-service-api ${project.version} + provided org.irods @@ -51,27 +47,52 @@ com.impossibl.pgjdbc-ng pgjdbc-ng - + - - - org.apache.maven.plugins - maven-dependency-plugin - 3.0.1 - - - copy-dependencies - package - - copy-dependencies - - - - - - - - - + + + maven-assembly-plugin + 3.0.0 + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.0.1 + + + copy-dependencies + package + + copy-dependencies + + + + org.apache.mavens:maven-archiver + org.apache.maven:maven-artifact + org.apache.maven:maven-artifact-manager + org.apache.maven:model + org.apache.maven.plugins:maven-clean-plugin + + + + + + + + \ No newline at end of file diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java index 07affdf..70f46ff 100644 --- a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceAOImpl.java @@ -28,7 +28,7 @@ public class DefaultEventServiceAOImpl extends AbstractEventServiceAO { private static final Logger log = LoggerFactory.getLogger(DefaultEventServiceAOImpl.class); - private final AccessLogDAO accessLogDAO; + private AccessLogDAO accessLogDAO; /** * @param irodsAccount diff --git a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java index e22e466..c25691d 100644 --- a/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java +++ b/default-event-service/default-event-service-api-impl/src/main/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactory.java @@ -5,6 +5,7 @@ import org.irods.jargon.dataone.def.event.persist.dao.AccessLogDAO; import org.irods.jargon.dataone.events.AbstractDataOneEventServiceFactory; import org.irods.jargon.dataone.events.DataOneEventServiceAO; +import org.irods.jargon.dataone.events.DataOneEventServiceFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; @@ -13,18 +14,31 @@ /** * @author dennis */ -public class DefaultEventServiceFactory extends AbstractDataOneEventServiceFactory { +public class DefaultEventServiceFactory extends AbstractDataOneEventServiceFactory + implements DataOneEventServiceFactory { + + private AccessLogDAO accessLogDAO; + + public DefaultEventServiceFactory() { + super(); + this.accessLogDAO = init(); + } private static final Logger log = LoggerFactory.getLogger(DefaultEventServiceFactory.class); @Override public DataOneEventServiceAO instance(PublicationContext publicationContext, IRODSAccount irodsAccount) { - return new DefaultEventServiceAOImpl(irodsAccount, publicationContext, init()); + // log.info("calling init("); + // AccessLogDAO accessLogDAO = init(); + log.info("accessLogDAO acquired:{}", accessLogDAO); + return new DefaultEventServiceAOImpl(irodsAccount, publicationContext, accessLogDAO); } private AccessLogDAO init() { + log.info("init()"); ApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "event-service-beans.xml", "event-dao-hibernate-spring.cfg.xml" }); + log.info("applicationContext built"); AccessLogDAO accessLogDAO = (AccessLogDAO) context.getBean("accessLogDAO"); log.info("successfully loaded DAO"); return accessLogDAO; diff --git a/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactoryTest.java b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactoryTest.java index 7b4693f..6ae8e60 100644 --- a/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactoryTest.java +++ b/default-event-service/default-event-service-api-impl/src/test/java/org/irods/jargon/dataone/events/defdb/DefaultEventServiceFactoryTest.java @@ -4,6 +4,7 @@ import org.irods.jargon.core.pub.IRODSAccessObjectFactory; import org.irods.jargon.dataone.configuration.PublicationContext; import org.irods.jargon.dataone.events.DataOneEventServiceAO; +import org.irods.jargon.dataone.events.DataOneEventServiceFactory; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -19,6 +20,9 @@ public void testLoadFromFactory() throws Exception { DefaultEventServiceFactory defaultEventServiceFactory = new DefaultEventServiceFactory(); DataOneEventServiceAO dataOneEventServiceAO = defaultEventServiceFactory.instance(context, dummyAccount); Assert.assertNotNull("no event service created", dataOneEventServiceAO); + // make sure I can cast + DataOneEventServiceFactory castFactory = defaultEventServiceFactory; + castFactory.instance(context, dummyAccount); } } From 24573e95c73751651a9a50cab23f5708431f5b8d Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 21 Jun 2017 11:44:16 -0400 Subject: [PATCH 87/88] #12 fix deps issue temporarily --- .../etc/irods-ext/d1client.properties | 3 + dataone-node/pom.xml | 6 ++ .../configuration/PluginDiscoveryService.java | 36 ++++++++++-- .../jargon/dataone/utils/RestVersion.java | 2 +- .../configuration/PropertiesLoader.java | 55 ------------------- 5 files changed, 40 insertions(+), 62 deletions(-) delete mode 100644 dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PropertiesLoader.java diff --git a/dataone-node/etc/irods-ext/d1client.properties b/dataone-node/etc/irods-ext/d1client.properties index 0bfce77..8e29e66 100644 --- a/dataone-node/etc/irods-ext/d1client.properties +++ b/dataone-node/etc/irods-ext/d1client.properties @@ -74,3 +74,6 @@ ssl.negotiation.policy=CS_NEG_DONT_CARE # location for discovered plug-ins plugin.jar.location=/etc/irods-ext/d1plugins +plugin.factory.pid= +plugin.factory.event=org.irods.jargon.dataone.events.defdb.DefaultEventServiceFactory +plugin.factory.repo= diff --git a/dataone-node/pom.xml b/dataone-node/pom.xml index 0cc1dcd..2ae0e5d 100644 --- a/dataone-node/pom.xml +++ b/dataone-node/pom.xml @@ -156,6 +156,12 @@ org.reflections reflections + + + org.irods + default-event-service-api-impl + ${project.version} + diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java index ef87f4c..0be07fd 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java @@ -11,6 +11,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import java.util.Set; import javax.annotation.PostConstruct; @@ -22,6 +23,7 @@ import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoFactory; import org.irods.jargon.dataone.reposervice.DataOneRepoServiceAO; import org.irods.jargon.dataone.reposervice.DataOneRepoServiceFactory; +import org.irods.jargon.dataone.utils.PropertiesLoader; import org.irods.jargon.pid.pidservice.AbstractDataOnePidFactory; import org.irods.jargon.pid.pidservice.DataOnePidServiceFactory; import org.irods.jargon.pid.pidservice.UniqueIdAO; @@ -150,13 +152,35 @@ private void initializeFactories() throws PluginNotFoundException { } log.info("event factory..."); - Class clazzEvent = loadImplClass(AbstractDataOneEventServiceFactory.class); + /* + * Class clazzEvent = + * loadImplClass(AbstractDataOneEventServiceFactory.class); try { + * Constructor ctor = clazzEvent.getConstructor(); + * dataOneEventServiceFactory = (DataOneEventServiceFactory) + * ctor.newInstance(new Object[] {}); + * log.info("dataOneEventServiceFactory success"); } catch + * (NoSuchMethodException | SecurityException | InstantiationException | + * IllegalAccessException | IllegalArgumentException | + * InvocationTargetException e) { + * log.error("cannot find appropriate plugin", e); throw new + * PluginNotFoundException(e); } + */ + + PropertiesLoader propertiesLoader = new PropertiesLoader(); + Properties props = propertiesLoader.getProperties(); + String eventFactoryClassName = props.getProperty("plugin.factory.event"); + if (eventFactoryClassName == null || eventFactoryClassName.isEmpty()) { + log.error("cannot find appropriate plugin class name config in properties"); + throw new PluginNotFoundException("cannot find event factory plugin class name in properties"); + } + + log.info("load event factory class:{}", eventFactoryClassName); try { - Constructor ctor = clazzEvent.getConstructor(); - dataOneEventServiceFactory = (DataOneEventServiceFactory) ctor.newInstance(new Object[] {}); - log.info("dataOneEventServiceFactory success"); - } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException - | IllegalArgumentException | InvocationTargetException e) { + Class eventClass = Class.forName(eventFactoryClassName.trim()); + dataOneEventServiceFactory = (DataOneEventServiceFactory) eventClass.newInstance(); + log.info("event factory created"); + + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { log.error("cannot find appropriate plugin", e); throw new PluginNotFoundException(e); } diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java index a08d965..8bc9c19 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/utils/RestVersion.java @@ -1,5 +1,5 @@ package org.irods.jargon.dataone.utils; public final class RestVersion { public static String VERSION="4.2.1.0-SNAPSHOT"; - public static String BUILD_TIME="2017-06-21T12:31:07Z"; + public static String BUILD_TIME="2017-06-21T15:40:13Z"; } diff --git a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PropertiesLoader.java b/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PropertiesLoader.java deleted file mode 100644 index 3a8a634..0000000 --- a/dataone-node/src/test/java/org/irods/jargon/dataone/configuration/PropertiesLoader.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * - */ -package org.irods.jargon.dataone.configuration; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -import org.irods.jargon.core.exception.JargonRuntimeException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Load config properties from /etc/irods-ext - * - * @author mcc - * - */ -public class PropertiesLoader { - - private Logger log = LoggerFactory.getLogger(this.getClass()); - - /** - * - */ - public PropertiesLoader() { - } - - public Properties loadD1Properties() { - Properties prop = new Properties(); - InputStream input = null; - - try { - log.info("loading properties from /etc/irods-ext/d1client.properties"); - String filename = "/etc/irods-ext/d1client.properties"; - input = new FileInputStream(filename); - - prop.load(input); - return prop; - } catch (IOException ex) { - log.error("IOException loading props", ex); - throw new JargonRuntimeException("unable to load properties", ex); - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - } - } - } - } - -} From 8a60c8e006b07516310ba2980b2b7b60b09bded3 Mon Sep 17 00:00:00 2001 From: michael-conway Date: Wed, 21 Jun 2017 11:48:13 -0400 Subject: [PATCH 88/88] #12 fix repo service load --- .../jargon/dataone/configuration/PluginDiscoveryService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java index 0be07fd..9d47089 100644 --- a/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java +++ b/dataone-node/src/main/java/org/irods/jargon/dataone/configuration/PluginDiscoveryService.java @@ -17,7 +17,6 @@ import javax.annotation.PostConstruct; import org.irods.jargon.core.connection.IRODSAccount; -import org.irods.jargon.dataone.events.AbstractDataOneEventServiceFactory; import org.irods.jargon.dataone.events.DataOneEventServiceAO; import org.irods.jargon.dataone.events.DataOneEventServiceFactory; import org.irods.jargon.dataone.reposervice.AbstractDataOneRepoFactory; @@ -186,7 +185,7 @@ private void initializeFactories() throws PluginNotFoundException { } log.info("repo factory..."); - Class clazzRepo = loadImplClass(AbstractDataOneRepoFactory.class); + Class clazzRepo = loadImplClass(AbstractDataOneRepoFactory.class); try { Constructor ctor = clazzRepo.getConstructor(); dataOneRepoServiceFactory = (DataOneRepoServiceFactory) ctor.newInstance(new Object[] {});