From ad421269ed2a5832a2fb11856bd8fea272d1119a Mon Sep 17 00:00:00 2001 From: Patrick Schmitz Date: Mon, 19 Jul 2010 06:46:28 +0000 Subject: [PATCH] CSPACE-2394 Build a prototype reporting service for invoking reports. Still needs more build support to get reports installed from a resource path, but basic CRUDL support is in, as is invocation of jasper reports engine from services, provided a report has been installed on the server. --- services/JaxRsServiceProvider/pom.xml | 5 + .../CollectionSpaceJaxRsApplication.java | 2 + services/build.xml | 3 + .../client/AbstractServiceClientImpl.java | 12 +- .../main/config/services/tenant-bindings.xml | 40 ++ .../common/document/DocumentUtils.java | 6 +- services/pom.xml | 1 + services/report/.classpath | 6 + services/report/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.maven.ide.eclipse.prefs | 9 + services/report/3rdparty/.classpath | 6 + services/report/3rdparty/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.maven.ide.eclipse.prefs | 9 + services/report/3rdparty/build.xml | 127 ++++ .../nuxeo-platform-cs-report/.classpath | 8 + .../nuxeo-platform-cs-report/.project | 23 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.maven.ide.eclipse.prefs | 9 + .../nuxeo-platform-cs-report/build.xml | 142 +++++ .../3rdparty/nuxeo-platform-cs-report/pom.xml | 38 ++ .../src/main/resources/META-INF/MANIFEST.MF | 22 + .../resources/OSGI-INF/core-types-contrib.xml | 14 + .../OSGI-INF/deployment-fragment.xml | 408 +++++++++++++ .../resources/OSGI-INF/ecm-types-contrib.xml | 29 + .../resources/OSGI-INF/layouts-contrib.xml | 59 ++ .../main/resources/schemas/reports_common.xsd | 30 + services/report/3rdparty/pom.xml | 24 + services/report/build.xml | 124 ++++ services/report/client/.classpath | 10 + services/report/client/.project | 27 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.maven.ide.eclipse.prefs | 9 + services/report/client/pom.xml | 96 +++ .../services/client/ReportClient.java | 159 +++++ .../services/client/ReportProxy.java | 120 ++++ .../client/test/ReportServiceTest.java | 572 ++++++++++++++++++ .../src/test/resources/log4j.properties | 23 + services/report/jaxb/.classpath | 9 + services/report/jaxb/.project | 23 + .../jaxb/.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.maven.ide.eclipse.prefs | 9 + services/report/jaxb/pom.xml | 47 ++ .../services/ReportJAXBSchema.java | 19 + .../services/ReportListItemJAXBSchema.java | 10 + .../src/main/resources/reports-common.xsd | 86 +++ services/report/pom.xml | 38 ++ services/report/service/.classpath | 8 + services/report/service/.project | 26 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.maven.ide.eclipse.prefs | 9 + services/report/service/pom.xml | 117 ++++ services/report/service/profiles.xml | 4 + .../services/report/ReportResource.java | 568 +++++++++++++++++ .../report/nuxeo/ReportConstants.java | 35 ++ .../nuxeo/ReportDocumentModelHandler.java | 156 +++++ .../report/nuxeo/ReportValidatorHandler.java | 18 + src/main/resources/config/cspace-ds.xml | 23 + 59 files changed, 3445 insertions(+), 8 deletions(-) create mode 100644 services/report/.classpath create mode 100644 services/report/.project create mode 100644 services/report/.settings/org.eclipse.jdt.core.prefs create mode 100644 services/report/.settings/org.maven.ide.eclipse.prefs create mode 100644 services/report/3rdparty/.classpath create mode 100644 services/report/3rdparty/.project create mode 100644 services/report/3rdparty/.settings/org.eclipse.jdt.core.prefs create mode 100644 services/report/3rdparty/.settings/org.maven.ide.eclipse.prefs create mode 100644 services/report/3rdparty/build.xml create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/.classpath create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/.project create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/.settings/org.eclipse.jdt.core.prefs create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/.settings/org.maven.ide.eclipse.prefs create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/build.xml create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/pom.xml create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/META-INF/MANIFEST.MF create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/core-types-contrib.xml create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/deployment-fragment.xml create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/ecm-types-contrib.xml create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/layouts-contrib.xml create mode 100644 services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/schemas/reports_common.xsd create mode 100644 services/report/3rdparty/pom.xml create mode 100644 services/report/build.xml create mode 100644 services/report/client/.classpath create mode 100644 services/report/client/.project create mode 100644 services/report/client/.settings/org.eclipse.jdt.core.prefs create mode 100644 services/report/client/.settings/org.maven.ide.eclipse.prefs create mode 100644 services/report/client/pom.xml create mode 100644 services/report/client/src/main/java/org/collectionspace/services/client/ReportClient.java create mode 100644 services/report/client/src/main/java/org/collectionspace/services/client/ReportProxy.java create mode 100644 services/report/client/src/test/java/org/collectionspace/services/client/test/ReportServiceTest.java create mode 100644 services/report/client/src/test/resources/log4j.properties create mode 100644 services/report/jaxb/.classpath create mode 100644 services/report/jaxb/.project create mode 100644 services/report/jaxb/.settings/org.eclipse.jdt.core.prefs create mode 100644 services/report/jaxb/.settings/org.maven.ide.eclipse.prefs create mode 100644 services/report/jaxb/pom.xml create mode 100644 services/report/jaxb/src/main/java/org/collectionspace/services/ReportJAXBSchema.java create mode 100644 services/report/jaxb/src/main/java/org/collectionspace/services/ReportListItemJAXBSchema.java create mode 100644 services/report/jaxb/src/main/resources/reports-common.xsd create mode 100644 services/report/pom.xml create mode 100644 services/report/service/.classpath create mode 100644 services/report/service/.project create mode 100644 services/report/service/.settings/org.eclipse.jdt.core.prefs create mode 100644 services/report/service/.settings/org.maven.ide.eclipse.prefs create mode 100644 services/report/service/pom.xml create mode 100644 services/report/service/profiles.xml create mode 100644 services/report/service/src/main/java/org/collectionspace/services/report/ReportResource.java create mode 100644 services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportConstants.java create mode 100644 services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java create mode 100644 services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportValidatorHandler.java diff --git a/services/JaxRsServiceProvider/pom.xml b/services/JaxRsServiceProvider/pom.xml index 19bbea361..ec501d0ab 100644 --- a/services/JaxRsServiceProvider/pom.xml +++ b/services/JaxRsServiceProvider/pom.xml @@ -110,6 +110,11 @@ org.collectionspace.services.movement.service ${project.version} + + org.collectionspace.services + org.collectionspace.services.report.service + ${project.version} + org.collectionspace.services org.collectionspace.services.dimension.service diff --git a/services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java b/services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java index 63d40c056..dcf50b38e 100644 --- a/services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java +++ b/services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java @@ -31,6 +31,7 @@ import org.collectionspace.services.loanin.LoaninResource; import org.collectionspace.services.loanout.LoanoutResource; import org.collectionspace.services.location.LocationAuthorityResource; import org.collectionspace.services.movement.MovementResource; +import org.collectionspace.services.report.ReportResource; import org.collectionspace.services.relation.NewRelationResource; import org.collectionspace.services.acquisition.AcquisitionResource; import org.collectionspace.services.dimension.DimensionResource; @@ -75,6 +76,7 @@ public class CollectionSpaceJaxRsApplication extends Application { singletons.add(new LoanoutResource()); singletons.add(new LocationAuthorityResource()); singletons.add(new MovementResource()); + singletons.add(new ReportResource()); singletons.add(new AcquisitionResource()); singletons.add(new NewRelationResource()); singletons.add(new VocabularyResource()); diff --git a/services/build.xml b/services/build.xml index b40362135..ce708f5e3 100644 --- a/services/build.xml +++ b/services/build.xml @@ -161,6 +161,7 @@ + @@ -181,6 +182,7 @@ + @@ -215,6 +217,7 @@ + diff --git a/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java b/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java index a70ceaf87..c99c3cebe 100644 --- a/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java +++ b/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java @@ -266,8 +266,8 @@ public abstract class AbstractServiceClientImpl implements if (useAuth()) { String user = properties.getProperty(USER_PROPERTY); String password = properties.getProperty(PASSWORD_PROPERTY); - if (logger.isInfoEnabled()) { - logger.info("setupHttpClient() using url=" + url + " user=" + if (logger.isDebugEnabled()) { + logger.debug("setupHttpClient() using url=" + url + " user=" + user + " password=" + password); } @@ -277,12 +277,12 @@ public abstract class AbstractServiceClientImpl implements new UsernamePasswordCredentials(user, password)); // JAXRS client library requires HTTP preemptive authentication httpClient.getParams().setAuthenticationPreemptive(true); - if (logger.isInfoEnabled()) { - logger.info("setupHttpClient: set preemptive authentication"); + if (logger.isDebugEnabled()) { + logger.debug("setupHttpClient: set preemptive authentication"); } } else { - if (logger.isInfoEnabled()) { - logger.info("setupHttpClient() : no auth mode!"); + if (logger.isDebugEnabled()) { + logger.debug("setupHttpClient() : no auth mode!"); } } } diff --git a/services/common/src/main/config/services/tenant-bindings.xml b/services/common/src/main/config/services/tenant-bindings.xml index c5223b55e..dac7ad089 100644 --- a/services/common/src/main/config/services/tenant-bindings.xml +++ b/services/common/src/main/config/services/tenant-bindings.xml @@ -289,6 +289,46 @@ + + + + + /reports/*/output/ + + + default-domain + + + org.collectionspace.services.report.nuxeo.ReportDocumentModelHandler + + + org.collectionspace.services.report.nuxeo.ReportValidatorHandler + + + + + + + + + + + + + + + + + diff --git a/services/common/src/main/java/org/collectionspace/services/common/document/DocumentUtils.java b/services/common/src/main/java/org/collectionspace/services/common/document/DocumentUtils.java index 9a261a095..86299a184 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/document/DocumentUtils.java +++ b/services/common/src/main/java/org/collectionspace/services/common/document/DocumentUtils.java @@ -205,12 +205,14 @@ public class DocumentUtils { // // Create the builder and parse the file // - result = factory.newDocumentBuilder().parse(payload); + DocumentBuilder db = factory.newDocumentBuilder(); + db.setErrorHandler(null); + result = db.parse(payload); // Write it to the log so we can see what we've created. if (logger.isDebugEnabled() == true) { logger.debug(xmlToString(result)); - System.out.println(xmlToString(result)); //FIXME: REM - Need this until we figure out why messages are not showing up in logger. + //System.out.println(xmlToString(result)); //FIXME: REM - Need this until we figure out why messages are not showing up in logger. } } finally { if (payload != null) { diff --git a/services/pom.xml b/services/pom.xml index 7ff6f5cb9..8abc47258 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -42,6 +42,7 @@ loanout location movement + report dimension contact JaxRsServiceProvider diff --git a/services/report/.classpath b/services/report/.classpath new file mode 100644 index 000000000..046988541 --- /dev/null +++ b/services/report/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/services/report/.project b/services/report/.project new file mode 100644 index 000000000..1b84b0e19 --- /dev/null +++ b/services/report/.project @@ -0,0 +1,23 @@ + + + org.collectionspace.services.report + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/services/report/.settings/org.eclipse.jdt.core.prefs b/services/report/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..8038986c1 --- /dev/null +++ b/services/report/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Tue Jul 13 14:34:11 PDT 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/services/report/.settings/org.maven.ide.eclipse.prefs b/services/report/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..93b6f8a66 --- /dev/null +++ b/services/report/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Fri Sep 11 17:00:30 PDT 2009 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/services/report/3rdparty/.classpath b/services/report/3rdparty/.classpath new file mode 100644 index 000000000..046988541 --- /dev/null +++ b/services/report/3rdparty/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/services/report/3rdparty/.project b/services/report/3rdparty/.project new file mode 100644 index 000000000..dd33e63c2 --- /dev/null +++ b/services/report/3rdparty/.project @@ -0,0 +1,23 @@ + + + org.collectionspace.services.report.3rdparty + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/services/report/3rdparty/.settings/org.eclipse.jdt.core.prefs b/services/report/3rdparty/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..8038986c1 --- /dev/null +++ b/services/report/3rdparty/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Tue Jul 13 14:34:11 PDT 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/services/report/3rdparty/.settings/org.maven.ide.eclipse.prefs b/services/report/3rdparty/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..93b6f8a66 --- /dev/null +++ b/services/report/3rdparty/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Fri Sep 11 17:00:30 PDT 2009 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/services/report/3rdparty/build.xml b/services/report/3rdparty/build.xml new file mode 100644 index 000000000..a8e694700 --- /dev/null +++ b/services/report/3rdparty/build.xml @@ -0,0 +1,127 @@ + + + + report service 3rdparty + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/.classpath b/services/report/3rdparty/nuxeo-platform-cs-report/.classpath new file mode 100644 index 000000000..199bbbbdb --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/.project b/services/report/3rdparty/nuxeo-platform-cs-report/.project new file mode 100644 index 000000000..422da103e --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/.project @@ -0,0 +1,23 @@ + + + org.collectionspace.services.report.3rdparty.nuxeo + Report Nuxeo Document Type + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/.settings/org.eclipse.jdt.core.prefs b/services/report/3rdparty/nuxeo-platform-cs-report/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..8038986c1 --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Tue Jul 13 14:34:11 PDT 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/.settings/org.maven.ide.eclipse.prefs b/services/report/3rdparty/nuxeo-platform-cs-report/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..93b6f8a66 --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Fri Sep 11 17:00:30 PDT 2009 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/build.xml b/services/report/3rdparty/nuxeo-platform-cs-report/build.xml new file mode 100644 index 000000000..202d5b2f7 --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/build.xml @@ -0,0 +1,142 @@ + + + + report nuxeo document type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/pom.xml b/services/report/3rdparty/nuxeo-platform-cs-report/pom.xml new file mode 100644 index 000000000..770570ce2 --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/pom.xml @@ -0,0 +1,38 @@ + + + + org.collectionspace.services + org.collectionspace.services.report.3rdparty + 0.9-SNAPSHOT + + + 4.0.0 + org.collectionspace.services + org.collectionspace.services.report.3rdparty.nuxeo + services.report.3rdparty.nuxeo + jar + + Report Nuxeo Document Type + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + src/main/resources/META-INF/MANIFEST.MF + + ${eclipseVersion} + 2 + + + + + + + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/META-INF/MANIFEST.MF b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 000000000..bd8a413c4 --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,22 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 1 +Bundle-Name: NuxeoCS +Bundle-SymbolicName: org.collectionspace.report;singleton:=true +Bundle-Version: 1.0.0 +Bundle-Localization: plugin +Bundle-Vendor: Nuxeo +Require-Bundle: org.nuxeo.runtime, + org.nuxeo.ecm.core.api, + org.nuxeo.ecm.core, + org.nuxeo.ecm.core.api, + org.nuxeo.ecm.platform.types.api, + org.nuxeo.ecm.platform.versioning.api, + org.nuxeo.ecm.platform.ui, + org.nuxeo.ecm.platform.forms.layout.client, + org.nuxeo.ecm.platform.publishing.api, + org.nuxeo.ecm.platform.ws +Provide-Package: org.collectionspace.report +Nuxeo-Component: OSGI-INF/core-types-contrib.xml, + OSGI-INF/ecm-types-contrib.xml, + OSGI-INF/layouts-contrib.xml + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/core-types-contrib.xml b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/core-types-contrib.xml new file mode 100644 index 000000000..932ae66ad --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/core-types-contrib.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/deployment-fragment.xml b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/deployment-fragment.xml new file mode 100644 index 000000000..88b94ffd1 --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/deployment-fragment.xml @@ -0,0 +1,408 @@ + + + + + + ${bundle.fileName} + + + + + nuxeo.war + /nuxeo + + + + + + + + + + + + Seam Context Filter + /ws/FileManageWS + + + + Seam Context Filter + /DocumentManagerWS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #{currentServerLocation.name}/#{currentTabAction.label} + + + + Create new document in #{currentDocument.name} + + + + Create new document in #{currentDocument.name} + + + + breadcrumb=command.user_dashboard + + + + breadcrumb=command.manageMembers + + + + breadcrumb=command.manageMembers + + + + breadcrumb=title.vocabularies + + + + breadcrumb=command.advancedSearch + + + + + + en + en_GB + en_US + fr + de + es + it + ar + ru + ja + vn + + + messages + + + + config/addWorkspace.jpdl.xml + + + + + + generic_error_page + /generic_error_page.xhtml + + + + + generic_message_page + /generic_message_page.xhtml + + + + + home + /nxstartup.xhtml + + + + + user_login + /login.xhtml + + + + + user_logout + /logout.xhtml + + + + + view_servers + /view_servers.xhtml + + + + + + + view_domains + /view_domains.xhtml + + + + + select_document_type + /select_document_type.xhtml + + + + + create_document + /create_document.xhtml + + + + + edit_document + /edit_document.xhtml + + + + + view_documents + /view_documents.xhtml + + + + + create_file + /create_file.xhtml + + + + + create_workspace_wizard + /createWorkspaceWizard.xhtml + + + + + send_email + /document_email.xhtml + + + + + + view_workspaces + /view_workspaces.xhtml + + + + + + create_domain + /create_domain.xhtml + + + + + + edit_domain + /edit_domain.xhtml + + + + + + create_workspace + /create_workspace.xhtml + + + + + + edit_workspace + /edit_workspace.xhtml + + + + + + + members_management + /members_management.xhtml + + + + + view_users + /view_users.xhtml + + + + + view_many_users + /view_many_users.xhtml + + + + + edit_user + /edit_user.xhtml + + + + + edit_user_password + /edit_user_password.xhtml + + + + + view_user + /view_user.xhtml + + + + + create_user + /create_user.xhtml + + + + + view_groups + /view_groups.xhtml + + + + + view_group + /view_group.xhtml + + + + + edit_group + /edit_group.xhtml + + + + + create_group + /create_group.xhtml + + + + + view_vocabularies + /view_vocabularies.xhtml + + + + + view_vocabulary + /view_vocabulary.xhtml + + + + + + + search_form + /search/search_form.xhtml + + + + + search_results_nxql + /search/search_results_nxql.xhtml + + + + + search_results_advanced + + /search/search_results_advanced.xhtml + + + + + + search_results_simple + /search/search_results_simple.xhtml + + + + + + + clipboard + /incl/clipboard.xhtml + + + + + user_dashboard + /user_dashboard.xhtml + + + + + select_workspace_template + /select_workspace_template.xhtml + + + + + pdf_generation_error + /pdf_generation_error.xhtml + + + + + mass_edit + /massedit_documents.xhtml + + + + + mass_edit_confirm + /massedit_documents_preview.xhtml + + + + + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/ecm-types-contrib.xml b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/ecm-types-contrib.xml new file mode 100644 index 000000000..a16f01191 --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/ecm-types-contrib.xml @@ -0,0 +1,29 @@ + + + + + + + view_documents + + + heading + collectionspace_core + report + + + + + + Report + + + + + + Report + + + + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/layouts-contrib.xml b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/layouts-contrib.xml new file mode 100644 index 000000000..63a39d2b2 --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/OSGI-INF/layouts-contrib.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + name + filename + outputMIME + + + + + + + true + + name + + + dataInputText + + + + + + + + true + + filename + + + dataInputText + + + + + + + + true + + outputMIME + + + dataInputText + + + + + + diff --git a/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/schemas/reports_common.xsd b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/schemas/reports_common.xsd new file mode 100644 index 000000000..9632dad0c --- /dev/null +++ b/services/report/3rdparty/nuxeo-platform-cs-report/src/main/resources/schemas/reports_common.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + diff --git a/services/report/3rdparty/pom.xml b/services/report/3rdparty/pom.xml new file mode 100644 index 000000000..2cb1c17ea --- /dev/null +++ b/services/report/3rdparty/pom.xml @@ -0,0 +1,24 @@ + + + + org.collectionspace.services.report + org.collectionspace.services + 0.9-SNAPSHOT + + + 4.0.0 + org.collectionspace.services + org.collectionspace.services.report.3rdparty + services.report.3rdparty + pom + + + 3rd party build for report service + + + + nuxeo-platform-cs-report + + diff --git a/services/report/build.xml b/services/report/build.xml new file mode 100644 index 000000000..86326a7d7 --- /dev/null +++ b/services/report/build.xml @@ -0,0 +1,124 @@ + + + + report service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/report/client/.classpath b/services/report/client/.classpath new file mode 100644 index 000000000..425cd1620 --- /dev/null +++ b/services/report/client/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/services/report/client/.project b/services/report/client/.project new file mode 100644 index 000000000..85fc9d063 --- /dev/null +++ b/services/report/client/.project @@ -0,0 +1,27 @@ + + + org.collectionspace.services.report.client + + + org.collectionspace.services.client + org.collectionspace.services.common + org.collectionspace.services.report.jaxb + org.collectionspace.services.jaxb + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/services/report/client/.settings/org.eclipse.jdt.core.prefs b/services/report/client/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..f59c96d7f --- /dev/null +++ b/services/report/client/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Tue Jul 13 14:34:12 PDT 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/services/report/client/.settings/org.maven.ide.eclipse.prefs b/services/report/client/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..93b6f8a66 --- /dev/null +++ b/services/report/client/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Fri Sep 11 17:00:30 PDT 2009 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/services/report/client/pom.xml b/services/report/client/pom.xml new file mode 100644 index 000000000..b2839b709 --- /dev/null +++ b/services/report/client/pom.xml @@ -0,0 +1,96 @@ + + + + org.collectionspace.services + org.collectionspace.services.report + 0.9-SNAPSHOT + + + 4.0.0 + org.collectionspace.services + org.collectionspace.services.report.client + services.report.client + + + + + org.slf4j + slf4j-api + test + + + org.slf4j + slf4j-log4j12 + test + + + + org.collectionspace.services + org.collectionspace.services.jaxb + ${project.version} + + + org.collectionspace.services + org.collectionspace.services.common + true + ${project.version} + + + org.collectionspace.services + org.collectionspace.services.report.jaxb + ${project.version} + + + org.collectionspace.services + org.collectionspace.services.client + ${project.version} + + + org.collectionspace.services + org.collectionspace.services.person.client + ${project.version} + + + org.collectionspace.services + org.collectionspace.services.organization.client + ${project.version} + + + + org.testng + testng + 5.6 + + + org.jboss.resteasy + resteasy-jaxrs + + + + tjws + webserver + + + + + org.jboss.resteasy + resteasy-jaxb-provider + + + org.jboss.resteasy + resteasy-multipart-provider + + + commons-httpclient + commons-httpclient + 3.1 + + + + + collectionspace-services-report-client + + + diff --git a/services/report/client/src/main/java/org/collectionspace/services/client/ReportClient.java b/services/report/client/src/main/java/org/collectionspace/services/client/ReportClient.java new file mode 100644 index 000000000..841a80480 --- /dev/null +++ b/services/report/client/src/main/java/org/collectionspace/services/client/ReportClient.java @@ -0,0 +1,159 @@ +/** + * ReportClient.java + * + * {Purpose of This Class} + * + * {Other Notes Relating to This Class (Optional)} + * + * $LastChangedBy: $ + * $LastChangedRevision: $ + * $LastChangedDate: $ + * + * This document is a part of the source code and related artifacts + * for CollectionSpace, an open source collections management system + * for museums and related institutions: + * + * http://www.collectionspace.org + * http://wiki.collectionspace.org + * + * Copyright (c) 2009 {Contributing Institution} + * + * Licensed under the Educational Community License (ECL), Version 2.0. + * You may not use this file except in compliance with this License. + * + * You may obtain a copy of the ECL 2.0 License at + * https://source.collectionspace.org/collection-space/LICENSE.txt + */ +package org.collectionspace.services.client; + +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Response; + +import org.collectionspace.services.common.authorityref.AuthorityRefList; +//import org.collectionspace.services.common.context.ServiceContext; +import org.collectionspace.services.report.ReportsCommonList; + +import org.jboss.resteasy.client.ProxyFactory; +import org.jboss.resteasy.plugins.providers.RegisterBuiltin; +import org.jboss.resteasy.client.ClientResponse; +import org.jboss.resteasy.plugins.providers.multipart.MultipartInput; +import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; +import org.jboss.resteasy.spi.ResteasyProviderFactory; + +/** + * A ReportClient. + + * @version $Revision:$ + * FIXME: http://issues.collectionspace.org/browse/CSPACE-1684 + */ +public class ReportClient extends AbstractServiceClientImpl { + + /* (non-Javadoc) + * @see org.collectionspace.services.client.AbstractServiceClientImpl#getServicePathComponent() + */ + public String getServicePathComponent() { + return "reports"; + } + /** + * + */ +// private static final ReportClient instance = new ReportClient(); + /** + * + */ + private ReportProxy reportProxy; + + /** + * + * Default constructor for ReportClient class. + * + */ + public ReportClient() { + ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); + RegisterBuiltin.register(factory); + setProxy(); + } + + @Override + public CollectionSpaceProxy getProxy() { + return this.reportProxy; + } + + /** + * allow to reset proxy as per security needs + */ + public void setProxy() { + if (useAuth()) { + reportProxy = ProxyFactory.create(ReportProxy.class, + getBaseURL(), getHttpClient()); + } else { + reportProxy = ProxyFactory.create(ReportProxy.class, + getBaseURL()); + } + } + + /** + * FIXME Comment this + * + * @return + */ +// public static ReportClient getInstance() { +// return instance; +// } + + /** + * @return + * @see org.collectionspace.services.client.ReportProxy#getReport() + */ + public ClientResponse readList() { + return reportProxy.readList(); + } + + /** + * @param csid + * @return + * @see org.collectionspace.services.client.ReportProxy#getAuthorityRefs(java.lang.String) + */ + public ClientResponse getAuthorityRefs(String csid) { + return reportProxy.getAuthorityRefs(csid); + } + + + /** + * @param csid + * @return + * @see org.collectionspace.services.client.ReportProxy#getReport(java.lang.String) + */ + public ClientResponse read(String csid) { + return reportProxy.read(csid); + } + + /** + * @param report + * @return + * @see org.collectionspace.services.client.ReportProxy#createReport(org.collectionspace.hello.Report) + */ + public ClientResponse create(MultipartOutput multipart) { + return reportProxy.create(multipart); + } + + /** + * @param csid + * @param report + * @return + * @see org.collectionspace.services.client.ReportProxy#updateReport(java.lang.Long, org.collectionspace.hello.Report) + */ + public ClientResponse update(String csid, MultipartOutput multipart) { + return reportProxy.update(csid, multipart); + + } + + /** + * @param csid + * @return + * @see org.collectionspace.services.client.ReportProxy#deleteReport(java.lang.Long) + */ + public ClientResponse delete(String csid) { + return reportProxy.delete(csid); + } +} diff --git a/services/report/client/src/main/java/org/collectionspace/services/client/ReportProxy.java b/services/report/client/src/main/java/org/collectionspace/services/client/ReportProxy.java new file mode 100644 index 000000000..4ba050b6f --- /dev/null +++ b/services/report/client/src/main/java/org/collectionspace/services/client/ReportProxy.java @@ -0,0 +1,120 @@ +/** + * ReportProxy.java + * + * {Purpose of This Class} + * + * {Other Notes Relating to This Class (Optional)} + * + * $LastChangedBy: $ + * $LastChangedRevision: $ + * $LastChangedDate: $ + * + * This document is a part of the source code and related artifacts + * for CollectionSpace, an open source collections management system + * for museums and related institutions: + * + * http://www.collectionspace.org + * http://wiki.collectionspace.org + * + * Copyright © 2009 {Contributing Institution} + * + * Licensed under the Educational Community License (ECL), Version 2.0. + * You may not use this file except in compliance with this License. + * + * You may obtain a copy of the ECL 2.0 License at + * https://source.collectionspace.org/collection-space/LICENSE.txt + */ +package org.collectionspace.services.client; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + +import org.collectionspace.services.common.authorityref.AuthorityRefList; +import org.collectionspace.services.report.ReportsCommonList; +import org.collectionspace.services.person.PersonsCommonList; +import org.jboss.resteasy.client.ClientResponse; +import org.jboss.resteasy.plugins.providers.multipart.MultipartInput; +import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; + +/** + * @version $Revision:$ + * FIXME: http://issues.collectionspace.org/browse/CSPACE-1684 + */ +@Path("/reports/") +@Produces({"multipart/mixed"}) +@Consumes({"multipart/mixed"}) +public interface ReportProxy extends CollectionSpaceProxy { + + /** + * Read list. + * + * @return the client response + */ + @GET + @Produces({"application/xml"}) + ClientResponse readList(); + + //(C)reate + /** + * Creates the. + * + * @param multipart the multipart + * @return the client response + */ + @POST + ClientResponse create(MultipartOutput multipart); + + //(R)ead + /** + * Read. + * + * @param csid the csid + * @return the client response + */ + @GET + @Path("/{csid}") + ClientResponse read(@PathParam("csid") String csid); + + //(U)pdate + /** + * Update. + * + * @param csid the csid + * @param multipart the multipart + * @return the client response + */ + @PUT + @Path("/{csid}") + ClientResponse update(@PathParam("csid") String csid, MultipartOutput multipart); + + //(D)elete + /** + * Delete. + * + * @param csid the csid + * @return the client response + */ + @DELETE + @Path("/{csid}") + ClientResponse delete(@PathParam("csid") String csid); + + // List Items + /** + * Gets the authority refs. + * + * @param csid the csid + * @return the authority refs + */ + @GET + @Produces({"application/xml"}) + @Path("/{csid}/authorityrefs/") + ClientResponse getAuthorityRefs(@PathParam("csid") String csid); + +} diff --git a/services/report/client/src/test/java/org/collectionspace/services/client/test/ReportServiceTest.java b/services/report/client/src/test/java/org/collectionspace/services/client/test/ReportServiceTest.java new file mode 100644 index 000000000..8500df16f --- /dev/null +++ b/services/report/client/src/test/java/org/collectionspace/services/client/test/ReportServiceTest.java @@ -0,0 +1,572 @@ +/** + * This document is a part of the source code and related artifacts + * for CollectionSpace, an open source collections management system + * for museums and related institutions: + * + * http://www.collectionspace.org + * http://wiki.collectionspace.org + * + * Copyright © 2009 Regents of the University of California + * + * Licensed under the Educational Community License (ECL), Version 2.0. + * You may not use this file except in compliance with this License. + * + * You may obtain a copy of the ECL 2.0 License at + * https://source.collectionspace.org/collection-space/LICENSE.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.collectionspace.services.client.test; + +import java.util.List; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.collectionspace.services.client.CollectionSpaceClient; +import org.collectionspace.services.client.ReportClient; +import org.collectionspace.services.report.ReportsCommon; +import org.collectionspace.services.report.ReportsCommonList; +import org.collectionspace.services.jaxb.AbstractCommonList; + +import org.jboss.resteasy.client.ClientResponse; +import org.jboss.resteasy.plugins.providers.multipart.MultipartInput; +import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; +import org.jboss.resteasy.plugins.providers.multipart.OutputPart; +import org.testng.Assert; +//import org.testng.annotations.AfterClass; +import org.testng.annotations.Test; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * FIXME: http://issues.collectionspace.org/browse/CSPACE-1685 + * ReportServiceTest, carries out tests against a + * deployed and running Report Service. + * + * $LastChangedRevision: 2261 $ + * $LastChangedDate: 2010-05-28 16:52:22 -0700 (Fri, 28 May 2010) $ + */ +public class ReportServiceTest extends AbstractServiceTestImpl { + + /** The logger. */ + private final String CLASS_NAME = ReportServiceTest.class.getName(); + private final Logger logger = LoggerFactory.getLogger(CLASS_NAME); + + // Instance variables specific to this test. + /** The service path component. */ + final String SERVICE_PATH_COMPONENT = "reports"; + + /** The known resource id. */ + private String knownResourceId = null; + + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.BaseServiceTest#getClientInstance() + */ + @Override + protected CollectionSpaceClient getClientInstance() { + return new ReportClient(); + } + + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.BaseServiceTest#getAbstractCommonList(org.jboss.resteasy.client.ClientResponse) + */ + @Override + protected AbstractCommonList getAbstractCommonList( + ClientResponse response) { + return response.getEntity(ReportsCommonList.class); + } + + // --------------------------------------------------------------- + // CRUD tests : CREATE tests + // --------------------------------------------------------------- + // Success outcomes + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.ServiceTest#create(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class) + public void create(String testName) throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(testBanner(testName, CLASS_NAME)); + } + // Perform setup, such as initializing the type of service request + // (e.g. CREATE, DELETE), its valid and expected status codes, and + // its associated HTTP method name (e.g. POST, DELETE). + setupCreate(); + + // Submit the request to the service and store the response. + ReportClient client = new ReportClient(); + String identifier = createIdentifier(); + MultipartOutput multipart = createReportInstance(identifier); + ClientResponse res = client.create(multipart); + + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + // + // Specifically: + // Does it fall within the set of valid status codes? + // Does it exactly match the expected status code? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + + // Store the ID returned from the first resource created + // for additional tests below. + if (knownResourceId == null){ + knownResourceId = extractId(res); + if (logger.isDebugEnabled()) { + logger.debug(testName + ": knownResourceId=" + knownResourceId); + } + } + + // Store the IDs from every resource created by tests, + // so they can be deleted after tests have been run. + allResourceIdsCreated.add(extractId(res)); + } + + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#createList(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"create"}) + public void createList(String testName) throws Exception { + for(int i = 0; i < 3; i++){ + create(testName); + } + } + + // Failure outcomes + // Placeholders until the three tests below can be uncommented. + // See Issue CSPACE-401. + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#createWithEmptyEntityBody(java.lang.String) + */ + @Override + public void createWithEmptyEntityBody(String testName) throws Exception { + //Should this really be empty? + } + + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#createWithMalformedXml(java.lang.String) + */ + @Override + public void createWithMalformedXml(String testName) throws Exception { + //Should this really be empty? + } + + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#createWithWrongXmlSchema(java.lang.String) + */ + @Override + public void createWithWrongXmlSchema(String testName) throws Exception { + //Should this really be empty? + } + + // --------------------------------------------------------------- + // CRUD tests : READ tests + // --------------------------------------------------------------- + // Success outcomes + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#read(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"create"}) + public void read(String testName) throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(testBanner(testName, CLASS_NAME)); + } + // Perform setup. + setupRead(); + + // Submit the request to the service and store the response. + ReportClient client = new ReportClient(); + ClientResponse res = client.read(knownResourceId); + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + + MultipartInput input = (MultipartInput) res.getEntity(); + ReportsCommon report = (ReportsCommon) extractPart(input, + client.getCommonPartName(), ReportsCommon.class); + Assert.assertNotNull(report); + } + + // Failure outcomes + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#readNonExistent(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"read"}) + public void readNonExistent(String testName) throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(testBanner(testName, CLASS_NAME)); + } + // Perform setup. + setupReadNonExistent(); + + // Submit the request to the service and store the response. + ReportClient client = new ReportClient(); + ClientResponse res = client.read(NON_EXISTENT_ID); + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + } + + // --------------------------------------------------------------- + // CRUD tests : READ_LIST tests + // --------------------------------------------------------------- + // Success outcomes + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#readList(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"createList", "read"}) + public void readList(String testName) throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(testBanner(testName, CLASS_NAME)); + } + // Perform setup. + setupReadList(); + + // Submit the request to the service and store the response. + ReportClient client = new ReportClient(); + ClientResponse res = client.readList(); + ReportsCommonList list = res.getEntity(); + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + + // Optionally output additional data about list members for debugging. + boolean iterateThroughList = false; + if(iterateThroughList && logger.isDebugEnabled()){ + List items = + list.getReportListItem(); + int i = 0; + for(ReportsCommonList.ReportListItem item : items){ + logger.debug(testName + ": list-item[" + i + "] csid=" + + item.getCsid()); + logger.debug(testName + ": list-item[" + i + "] name=" + + item.getName()); + logger.debug(testName + ": list-item[" + i + "] outputMIME=" + + item.getOutputMIME()); + logger.debug(testName + ": list-item[" + i + "] URI=" + + item.getUri()); + i++; + } + } + + } + + // --------------------------------------------------------------- + // CRUD tests : UPDATE tests + // --------------------------------------------------------------- + // Success outcomes + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#update(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"read"}) + public void update(String testName) throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(testBanner(testName, CLASS_NAME)); + } + // Perform setup. + setupUpdate(); + + // Retrieve the contents of a resource to update. + ReportClient client = new ReportClient(); + ClientResponse res = + client.read(knownResourceId); + if(logger.isDebugEnabled()){ + logger.debug(testName + ": read status = " + res.getStatus()); + } + Assert.assertEquals(res.getStatus(), EXPECTED_STATUS_CODE); + + if(logger.isDebugEnabled()){ + logger.debug("got object to update with ID: " + knownResourceId); + } + MultipartInput input = (MultipartInput) res.getEntity(); + ReportsCommon report = (ReportsCommon) extractPart(input, + client.getCommonPartName(), ReportsCommon.class); + Assert.assertNotNull(report); + + // Update the content of this resource. + // Update the content of this resource. + report.setName("updated-" + report.getName()); + report.setOutputMIME("updated-" + report.getOutputMIME()); + if(logger.isDebugEnabled()){ + logger.debug("to be updated object"); + logger.debug(objectAsXmlString(report, ReportsCommon.class)); + } + // Submit the request to the service and store the response. + MultipartOutput output = new MultipartOutput(); + OutputPart commonPart = output.addPart(report, MediaType.APPLICATION_XML_TYPE); + commonPart.getHeaders().add("label", client.getCommonPartName()); + + res = client.update(knownResourceId, output); + int statusCode = res.getStatus(); + // Check the status code of the response: does it match the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + + + input = (MultipartInput) res.getEntity(); + ReportsCommon updatedReport = + (ReportsCommon) extractPart(input, + client.getCommonPartName(), ReportsCommon.class); + Assert.assertNotNull(updatedReport); + + Assert.assertEquals(updatedReport.getName(), + report.getName(), + "Data in updated object did not match submitted data."); + + } + + // Failure outcomes + // Placeholders until the three tests below can be uncommented. + // See Issue CSPACE-401. + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#updateWithEmptyEntityBody(java.lang.String) + */ + @Override + public void updateWithEmptyEntityBody(String testName) throws Exception { + //Should this really be empty? + } + + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#updateWithMalformedXml(java.lang.String) + */ + @Override + public void updateWithMalformedXml(String testName) throws Exception { + //Should this really be empty? + } + + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#updateWithWrongXmlSchema(java.lang.String) + */ + @Override + public void updateWithWrongXmlSchema(String testName) throws Exception { + //Should this really be empty? + } + + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#updateNonExistent(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"update", "testSubmitRequest"}) + public void updateNonExistent(String testName) throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(testBanner(testName, CLASS_NAME)); + } + // Perform setup. + setupUpdateNonExistent(); + + // Submit the request to the service and store the response. + // Note: The ID used in this 'create' call may be arbitrary. + // The only relevant ID may be the one used in update(), below. + ReportClient client = new ReportClient(); + MultipartOutput multipart = createReportInstance(NON_EXISTENT_ID); + ClientResponse res = + client.update(NON_EXISTENT_ID, multipart); + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + } + + // --------------------------------------------------------------- + // CRUD tests : DELETE tests + // --------------------------------------------------------------- + // Success outcomes + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#delete(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"create", "readList", "testSubmitRequest", "update"}) + public void delete(String testName) throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(testBanner(testName, CLASS_NAME)); + } + // Perform setup. + setupDelete(); + + // Submit the request to the service and store the response. + ReportClient client = new ReportClient(); + ClientResponse res = client.delete(knownResourceId); + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + } + + // Failure outcomes + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.AbstractServiceTestImpl#deleteNonExistent(java.lang.String) + */ + @Override + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"delete"}) + public void deleteNonExistent(String testName) throws Exception { + + if (logger.isDebugEnabled()) { + logger.debug(testBanner(testName, CLASS_NAME)); + } + // Perform setup. + setupDeleteNonExistent(); + + // Submit the request to the service and store the response. + ReportClient client = new ReportClient(); + ClientResponse res = client.delete(NON_EXISTENT_ID); + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + } + + // --------------------------------------------------------------- + // Utility tests : tests of code used in tests above + // --------------------------------------------------------------- + /** + * Tests the code for manually submitting data that is used by several + * of the methods above. + */ + @Test(dependsOnMethods = {"create", "read"}) + public void testSubmitRequest() { + + // Expected status code: 200 OK + final int EXPECTED_STATUS = Response.Status.OK.getStatusCode(); + + // Submit the request to the service and store the response. + String method = ServiceRequestType.READ.httpMethodName(); + String url = getResourceURL(knownResourceId); + int statusCode = submitRequest(method, url); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug("testSubmitRequest: url=" + url + + " status=" + statusCode); + } + Assert.assertEquals(statusCode, EXPECTED_STATUS); + + } + + // --------------------------------------------------------------- + // Utility methods used by tests above + // --------------------------------------------------------------- + /* (non-Javadoc) + * @see org.collectionspace.services.client.test.BaseServiceTest#getServicePathComponent() + */ + @Override + public String getServicePathComponent() { + return SERVICE_PATH_COMPONENT; + } + + /** + * Creates the report instance. + * + * @param identifier the identifier + * @return the multipart output + */ + private MultipartOutput createReportInstance(String identifier) { + return createReportInstance( + "name-" + identifier, + "persAuthTermCountsTest.jasper", + "application/pdf" ); + } + + /** + * Creates the report instance. + * + * @param name the report name + * @param filename the relative path to the report + * @param outputMIME the MIME type we will return for this report + * @return the multipart output + */ + private MultipartOutput createReportInstance(String name, + String filename, + String outputMIME) { + ReportsCommon report = new ReportsCommon(); + report.setName(name); + report.setFilename(filename); + report.setOutputMIME(outputMIME); + MultipartOutput multipart = new MultipartOutput(); + OutputPart commonPart = + multipart.addPart(report, MediaType.APPLICATION_XML_TYPE); + commonPart.getHeaders().add("label", new ReportClient().getCommonPartName()); + + if(logger.isDebugEnabled()){ + logger.debug("to be created, report common"); + logger.debug(objectAsXmlString(report, ReportsCommon.class)); + } + + return multipart; + } +} diff --git a/services/report/client/src/test/resources/log4j.properties b/services/report/client/src/test/resources/log4j.properties new file mode 100644 index 000000000..18c510350 --- /dev/null +++ b/services/report/client/src/test/resources/log4j.properties @@ -0,0 +1,23 @@ +log4j.rootLogger=debug, stdout, R + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout + +# Pattern to output the caller's file name and line number. +log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] [%c:%L] %m%n + +log4j.appender.R=org.apache.log4j.RollingFileAppender +log4j.appender.R.File=target/test-client.log + +log4j.appender.R.MaxFileSize=100KB +# Keep one backup file +log4j.appender.R.MaxBackupIndex=1 + +log4j.appender.R.layout=org.apache.log4j.PatternLayout +log4j.appender.R.layout.ConversionPattern=%d %-5p [%t] [%c:%L] %m%n + +#packages +log4j.logger.org.collectionspace=DEBUG +log4j.logger.org.apache=INFO +log4j.logger.httpclient=INFO +log4j.logger.org.jboss.resteasy=INFO diff --git a/services/report/jaxb/.classpath b/services/report/jaxb/.classpath new file mode 100644 index 000000000..bd6bf38eb --- /dev/null +++ b/services/report/jaxb/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/services/report/jaxb/.project b/services/report/jaxb/.project new file mode 100644 index 000000000..31f83a2ff --- /dev/null +++ b/services/report/jaxb/.project @@ -0,0 +1,23 @@ + + + org.collectionspace.services.report.jaxb + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/services/report/jaxb/.settings/org.eclipse.jdt.core.prefs b/services/report/jaxb/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..a2b25e0f8 --- /dev/null +++ b/services/report/jaxb/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Wed Feb 10 17:35:05 PST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/services/report/jaxb/.settings/org.maven.ide.eclipse.prefs b/services/report/jaxb/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..93b6f8a66 --- /dev/null +++ b/services/report/jaxb/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Fri Sep 11 17:00:30 PDT 2009 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/services/report/jaxb/pom.xml b/services/report/jaxb/pom.xml new file mode 100644 index 000000000..f4c3421e2 --- /dev/null +++ b/services/report/jaxb/pom.xml @@ -0,0 +1,47 @@ + + + + org.collectionspace.services.report + org.collectionspace.services + 0.9-SNAPSHOT + + + 4.0.0 + org.collectionspace.services + org.collectionspace.services.report.jaxb + services.report.jaxb + + + + com.sun.xml.bind + jaxb-impl + + + org.jvnet.jaxb2-commons + property-listener-injector + + + org.jvnet.jaxb2_commons + runtime + + + org.collectionspace.services + org.collectionspace.services.jaxb + ${project.version} + + + + + collectionspace-services-report-jaxb + install + + + org.jvnet.jaxb2.maven2 + maven-jaxb2-plugin + + + + + diff --git a/services/report/jaxb/src/main/java/org/collectionspace/services/ReportJAXBSchema.java b/services/report/jaxb/src/main/java/org/collectionspace/services/ReportJAXBSchema.java new file mode 100644 index 000000000..19548d4c6 --- /dev/null +++ b/services/report/jaxb/src/main/java/org/collectionspace/services/ReportJAXBSchema.java @@ -0,0 +1,19 @@ +/** + * + */ +package org.collectionspace.services; + +/** + * @author pschmitz + * + */ +public interface ReportJAXBSchema { + final static String NAME = "name"; + final static String NOTES = "notes"; + final static String FILENAME = "filename"; + final static String FOR_SINGLE_DOC = "forSingleDoc"; + final static String FOR_DOC_TYPE = "forDocType"; + final static String OUTPUT_MIME = "outputMIME"; +} + + diff --git a/services/report/jaxb/src/main/java/org/collectionspace/services/ReportListItemJAXBSchema.java b/services/report/jaxb/src/main/java/org/collectionspace/services/ReportListItemJAXBSchema.java new file mode 100644 index 000000000..379ec85f1 --- /dev/null +++ b/services/report/jaxb/src/main/java/org/collectionspace/services/ReportListItemJAXBSchema.java @@ -0,0 +1,10 @@ +package org.collectionspace.services; + +public interface ReportListItemJAXBSchema { + final static String NAME = "name"; + final static String FOR_SINGLE_DOC = "forSingleDoc"; + final static String FOR_DOC_TYPE = "forDocType"; + final static String OUTPUT_MIME ="outputMIME"; + final static String CSID = "csid"; + final static String URI = "url"; +} diff --git a/services/report/jaxb/src/main/resources/reports-common.xsd b/services/report/jaxb/src/main/resources/reports-common.xsd new file mode 100644 index 000000000..7e874858b --- /dev/null +++ b/services/report/jaxb/src/main/resources/reports-common.xsd @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/services/report/pom.xml b/services/report/pom.xml new file mode 100644 index 000000000..e45371541 --- /dev/null +++ b/services/report/pom.xml @@ -0,0 +1,38 @@ + + + + + org.collectionspace.services + org.collectionspace.services.main + 0.9-SNAPSHOT + + + 4.0.0 + org.collectionspace.services + org.collectionspace.services.report + services.report + pom + + + + net.sf.jasperreports + jasperreports + 3.7.3 + + + org.codehaus.groovy + groovy-all + 1.5.5 + + + + + + jaxb + service + 3rdparty + client + + + + diff --git a/services/report/service/.classpath b/services/report/service/.classpath new file mode 100644 index 000000000..199bbbbdb --- /dev/null +++ b/services/report/service/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/services/report/service/.project b/services/report/service/.project new file mode 100644 index 000000000..2d5155a4f --- /dev/null +++ b/services/report/service/.project @@ -0,0 +1,26 @@ + + + org.collectionspace.services.report.service + + + org.collectionspace.services.common + org.collectionspace.services.report.jaxb + org.collectionspace.services.jaxb + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/services/report/service/.settings/org.eclipse.jdt.core.prefs b/services/report/service/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..8038986c1 --- /dev/null +++ b/services/report/service/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Tue Jul 13 14:34:11 PDT 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/services/report/service/.settings/org.maven.ide.eclipse.prefs b/services/report/service/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..93b6f8a66 --- /dev/null +++ b/services/report/service/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Fri Sep 11 17:00:30 PDT 2009 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/services/report/service/pom.xml b/services/report/service/pom.xml new file mode 100644 index 000000000..3b0e79690 --- /dev/null +++ b/services/report/service/pom.xml @@ -0,0 +1,117 @@ + + + + + org.collectionspace.services + org.collectionspace.services.report + 0.9-SNAPSHOT + + + 4.0.0 + org.collectionspace.services + org.collectionspace.services.report.service + services.report.service + jar + + + + org.collectionspace.services + org.collectionspace.services.common + ${project.version} + + + org.collectionspace.services + org.collectionspace.services.report.jaxb + ${project.version} + + + org.collectionspace.services + org.collectionspace.services.collectionobject.jaxb + ${project.version} + + + + junit + junit + 4.1 + test + + + org.testng + testng + 5.6 + + + + + + javax.security + jaas + 1.0.01 + provided + + + + dom4j + dom4j + 1.6.1 + provided + + + + + + org.jboss.resteasy + resteasy-jaxrs + + + tjws + webserver + + + + + org.jboss.resteasy + resteasy-jaxb-provider + + + org.jboss.resteasy + resteasy-multipart-provider + + + + + + org.nuxeo.ecm.core + nuxeo-core-api + 1.5.1-SNAPSHOT + + + jboss-remoting + jboss + + + + + + org.restlet + org.restlet + 1.0.7 + + + com.noelios.restlet + com.noelios.restlet.ext.httpclient + 1.0.7 + + + com.noelios.restlet + com.noelios.restlet + 1.0.7 + + + + + collectionspace-services-report + + + diff --git a/services/report/service/profiles.xml b/services/report/service/profiles.xml new file mode 100644 index 000000000..347b9df22 --- /dev/null +++ b/services/report/service/profiles.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/ReportResource.java b/services/report/service/src/main/java/org/collectionspace/services/report/ReportResource.java new file mode 100644 index 000000000..25eb72a60 --- /dev/null +++ b/services/report/service/src/main/java/org/collectionspace/services/report/ReportResource.java @@ -0,0 +1,568 @@ +/** + * This document is a part of the source code and related artifacts + * for CollectionSpace, an open source collections management system + * for museums and related institutions: + + * http://www.collectionspace.org + * http://wiki.collectionspace.org + + * Copyright 2009 University of California at Berkeley + + * Licensed under the Educational Community License (ECL), Version 2.0. + * You may not use this file except in compliance with this License. + + * You may obtain a copy of the ECL 2.0 License at + + * https://source.collectionspace.org/collection-space/LICENSE.txt + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.collectionspace.services.report; + +import java.io.File; +import java.io.FileInputStream; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; + +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.security.auth.login.LoginException; +import javax.sql.DataSource; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriBuilder; +import javax.ws.rs.core.UriInfo; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperExportManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; + +import org.collectionspace.services.ReportJAXBSchema; +import org.collectionspace.services.common.AbstractMultiPartCollectionSpaceResourceImpl; +import org.collectionspace.services.common.ClientType; +import org.collectionspace.services.common.ServiceMain; +import org.collectionspace.services.common.config.ConfigReader; +import org.collectionspace.services.common.context.MultipartServiceContextImpl; +import org.collectionspace.services.common.context.ServiceBindingUtils; +import org.collectionspace.services.common.context.ServiceContext; +import org.collectionspace.services.common.document.DocumentFilter; +import org.collectionspace.services.common.document.DocumentHandler; +import org.collectionspace.services.common.document.DocumentNotFoundException; +import org.collectionspace.services.common.document.DocumentWrapper; +import org.collectionspace.services.common.query.IQueryManager; +import org.collectionspace.services.common.query.QueryManager; +import org.collectionspace.services.common.security.UnauthorizedException; +import org.collectionspace.services.common.vocabulary.AuthorityItemJAXBSchema; +import org.collectionspace.services.common.vocabulary.AuthorityJAXBSchema; +import org.collectionspace.services.common.vocabulary.RefNameServiceUtils; +import org.collectionspace.services.nuxeo.client.java.DocumentModelHandler; +import org.collectionspace.services.nuxeo.client.java.RemoteDocumentModelHandlerImpl; +import org.jboss.resteasy.plugins.providers.multipart.MultipartInput; +import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; +import org.jboss.resteasy.util.HttpResponseCodes; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The Class ReportResource. + */ +@Path("/reports") +@Consumes("multipart/mixed") +@Produces("multipart/mixed") +public class ReportResource extends + AbstractMultiPartCollectionSpaceResourceImpl { + + /** The Constant serviceName. */ + private final static String serviceName = "reports"; + + private static String repositoryName = "NuxeoDS"; + private static String reportsFolder = "reports"; + + /** The logger. */ + final Logger logger = LoggerFactory.getLogger(ReportResource.class); + //FIXME retrieve client type from configuration + /** The Constant CLIENT_TYPE. */ + final static ClientType CLIENT_TYPE = ServiceMain.getInstance().getClientType(); + + /** + * Instantiates a new report resource. + */ + public ReportResource() { + // do nothing + } + + public static String getRepositoryName() { + return repositoryName; + } + + public static void setRepositoryName(String repositoryName) { + ReportResource.repositoryName = repositoryName; + } + + /* (non-Javadoc) + * @see org.collectionspace.services.common.AbstractCollectionSpaceResourceImpl#getVersionString() + */ + @Override + protected String getVersionString() { + /** The last change revision. */ + final String lastChangeRevision = "$LastChangedRevision: 1982 $"; + return lastChangeRevision; + } + + /* (non-Javadoc) + * @see org.collectionspace.services.common.AbstractCollectionSpaceResourceImpl#getServiceName() + */ + @Override + public String getServiceName() { + return serviceName; + } + + /* (non-Javadoc) + * @see org.collectionspace.services.common.CollectionSpaceResource#getCommonPartClass() + */ + @Override + public Class getCommonPartClass() { + return ReportsCommon.class; + } + + /** + * Creates the report. + * + * @param input the input + * + * @return the response + */ + @POST + public Response createReport(MultipartInput input) { + try { + ServiceContext ctx = createServiceContext(input); + DocumentHandler handler = createDocumentHandler(ctx); + String csid = getRepositoryClient(ctx).create(ctx, handler); + UriBuilder path = UriBuilder.fromResource(ReportResource.class); + path.path("" + csid); + Response response = Response.created(path.build()).build(); + return response; + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Create failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception in createReport", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Create failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + } + + /** + * Gets the report. + * + * @param csid the csid + * + * @return the report + */ + @GET + @Path("{csid}") + public MultipartOutput getReport( + @PathParam("csid") String csid) { + if (logger.isDebugEnabled()) { + logger.debug("getReport with csid=" + csid); + } + if (csid == null || "".equals(csid)) { + logger.error("getReport: missing csid!"); + Response response = Response.status(Response.Status.BAD_REQUEST).entity( + "get failed on Report csid=" + csid).type( + "text/plain").build(); + throw new WebApplicationException(response); + } + MultipartOutput result = null; + try { + ServiceContext ctx = createServiceContext(); + DocumentHandler handler = createDocumentHandler(ctx); + getRepositoryClient(ctx).get(ctx, csid, handler); + result = (MultipartOutput) ctx.getOutput(); + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Get failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (DocumentNotFoundException dnfe) { + if (logger.isDebugEnabled()) { + logger.debug("getReport", dnfe); + } + Response response = Response.status(Response.Status.NOT_FOUND).entity( + "Get failed on Report csid=" + csid).type( + "text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("getReport", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Get failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + if (result == null) { + Response response = Response.status(Response.Status.NOT_FOUND).entity( + "Get failed, the requested Report CSID:" + csid + ": was not found.").type( + "text/plain").build(); + throw new WebApplicationException(response); + } + return result; + } + + /** + * Gets the report. + * + * @param csid the csid + * + * @return the report + */ + @GET + @Path("{csid}/output") + @Produces("application/pdf") + public Response invokeReport( + @PathParam("csid") String csid) { + if (logger.isDebugEnabled()) { + logger.debug("invokeReport with csid=" + csid); + } + Response response = null; + if (csid == null || "".equals(csid)) { + logger.error("invokeReport: missing csid!"); + response = Response.status(Response.Status.BAD_REQUEST).entity( + "invoke failed on Report csid=" + csid).type( + "text/plain").build(); + throw new WebApplicationException(response); + } + try { + ServiceContext ctx = createServiceContext(); + DocumentWrapper docWrapper = getRepositoryClient(ctx).getDoc(ctx, csid); + DocumentModel docModel = docWrapper.getWrappedObject(); + String reportFileName = (String)docModel.getPropertyValue(ReportJAXBSchema.FILENAME); + String fullPath = ServiceMain.getInstance().getServerRootDir() + + File.separator + ConfigReader.CSPACE_DIR_NAME + + File.separator + reportsFolder + + File.separator + reportFileName; + Connection conn = getConnection(); + HashMap params = new HashMap(); + FileInputStream fileStream = new FileInputStream(fullPath); + + // fill the report + JasperPrint jasperprint = JasperFillManager.fillReport(fileStream, params,conn); + // export report to pdf and build a response with the bytes + byte[] pdfasbytes = JasperExportManager.exportReportToPdf(jasperprint); + response = Response.ok(pdfasbytes, "application/pdf").build(); + } catch (UnauthorizedException ue) { + response = Response.status( + Response.Status.UNAUTHORIZED).entity("Invoke failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (DocumentNotFoundException dnfe) { + if (logger.isDebugEnabled()) { + logger.debug("invokeReport", dnfe); + } + response = Response.status(Response.Status.NOT_FOUND).entity( + "Invoke failed on Report csid=" + csid).type( + "text/plain").build(); + throw new WebApplicationException(response); + } catch (SQLException sqle) { + // SQLExceptions can be chained. We have at least one exception, so + // set up a loop to make sure we let the user know about all of them + // if there happens to be more than one. + if (logger.isDebugEnabled()) { + SQLException tempException = sqle; + while (null != tempException) { + logger.debug("SQL Exception: " + sqle.getLocalizedMessage()); + + // loop to the next exception + tempException = tempException.getNextException(); + } + } + response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity( + "Invoke failed (SQL problem) on Report csid=" + csid).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (JRException jre) { + if (logger.isDebugEnabled()) { + logger.debug("JR Exception: " + jre.getLocalizedMessage() + " Cause: "+jre.getCause()); + } + response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity( + "Invoke failed (Jasper problem) on Report csid=" + csid).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("invokeReport", e); + } + response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Invoke failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + if (response == null) { + response = Response.status(Response.Status.NOT_FOUND).entity( + "Invoke failed, the requested Report CSID:" + csid + ": was not found.").type( + "text/plain").build(); + throw new WebApplicationException(response); + } + return response; + } + + private Connection getConnection() throws LoginException, SQLException { + InitialContext ctx = null; + Connection conn = null; + try { + ctx = new InitialContext(); + DataSource ds = (DataSource) ctx.lookup(repositoryName); + if (ds == null) { + throw new IllegalArgumentException("datasource not found: " + repositoryName); + } + conn = ds.getConnection(); + return conn; + } catch (NamingException ex) { + LoginException le = new LoginException("Error looking up DataSource from: " + repositoryName); + le.initCause(ex); + throw le; + } finally { + if (ctx != null) { + try { + ctx.close(); + } catch (Exception e) { + } + } + } + + } + + /** + * Gets the report list. + * + * @param ui the ui + * @param keywords the keywords + * + * @return the report list + */ + @GET + @Produces("application/xml") + public ReportsCommonList getReportList(@Context UriInfo ui, + @QueryParam(IQueryManager.SEARCH_TYPE_KEYWORDS_KW) String keywords) { + ReportsCommonList result = null; + MultivaluedMap queryParams = ui.getQueryParameters(); + + if (keywords != null) { + result = searchReports(queryParams, keywords); + } else { + result = getReportList(queryParams); + } + + return result; + } + + /** + * Gets the report list. + * + * @return the report list + */ + private ReportsCommonList getReportList(MultivaluedMap queryParams) { + ReportsCommonList reportObjectList; + try { + ServiceContext ctx = createServiceContext(queryParams); + DocumentHandler handler = createDocumentHandler(ctx); + getRepositoryClient(ctx).getFiltered(ctx, handler); + reportObjectList = (ReportsCommonList) handler.getCommonPartList(); + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception in getReportList", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + return reportObjectList; + } + + + /** + * Gets the report list. + * + * @param csidList the csid list + * + * @return the report list + public ReportsCommonList getReportList(List csidList) { + ReportsCommonList reportObjectList = new ReportsCommonList(); + try { + ServiceContext ctx = createServiceContext(); + DocumentHandler handler = createDocumentHandler(ctx); + getRepositoryClient(ctx).get(ctx, csidList, handler); + reportObjectList = (ReportsCommonList) handler.getCommonPartList(); + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception in getReportList", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + return reportObjectList; + } + */ + + /** + * Update report. + * + * @param csid the csid + * @param theUpdate the the update + * + * @return the multipart output + */ + @PUT + @Path("{csid}") + public MultipartOutput updateReport( + @PathParam("csid") String csid, + MultipartInput theUpdate) { + if (logger.isDebugEnabled()) { + logger.debug("updateReport with csid=" + csid); + } + if (csid == null || "".equals(csid)) { + logger.error("updateReport: missing csid!"); + Response response = Response.status(Response.Status.BAD_REQUEST).entity( + "update failed on Report csid=" + csid).type( + "text/plain").build(); + throw new WebApplicationException(response); + } + MultipartOutput result = null; + try { + ServiceContext ctx = createServiceContext(theUpdate); + DocumentHandler handler = createDocumentHandler(ctx); + getRepositoryClient(ctx).update(ctx, csid, handler); + result = (MultipartOutput) ctx.getOutput(); + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Update failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (DocumentNotFoundException dnfe) { + if (logger.isDebugEnabled()) { + logger.debug("caugth exception in updateReport", dnfe); + } + Response response = Response.status(Response.Status.NOT_FOUND).entity( + "Update failed on Report csid=" + csid).type( + "text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Update failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + return result; + } + + /** + * Delete report. + * + * @param csid the csid + * + * @return the response + */ + @DELETE + @Path("{csid}") + public Response deleteReport(@PathParam("csid") String csid) { + + if (logger.isDebugEnabled()) { + logger.debug("deleteReport with csid=" + csid); + } + if (csid == null || "".equals(csid)) { + logger.error("deleteReport: missing csid!"); + Response response = Response.status(Response.Status.BAD_REQUEST).entity( + "delete failed on Report csid=" + csid).type( + "text/plain").build(); + throw new WebApplicationException(response); + } + try { + ServiceContext ctx = createServiceContext(); + getRepositoryClient(ctx).delete(ctx, csid); + return Response.status(HttpResponseCodes.SC_OK).build(); + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Delete failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (DocumentNotFoundException dnfe) { + if (logger.isDebugEnabled()) { + logger.debug("caught exception in deleteReport", dnfe); + } + Response response = Response.status(Response.Status.NOT_FOUND).entity( + "Delete failed on Report csid=" + csid).type( + "text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Delete failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + } + + /** + * Search reports. + * + * @param keywords the keywords + * + * @return the reports common list + */ + private ReportsCommonList searchReports(MultivaluedMap queryParams, + String keywords) { + ReportsCommonList reportsObjectList; + try { + ServiceContext ctx = createServiceContext(queryParams); + DocumentHandler handler = createDocumentHandler(ctx); + + // perform a keyword search + if (keywords != null && !keywords.isEmpty()) { + String whereClause = QueryManager.createWhereClauseFromKeywords(keywords); + DocumentFilter documentFilter = handler.getDocumentFilter(); + documentFilter.setWhereClause(whereClause); + if (logger.isDebugEnabled()) { + logger.debug("The WHERE clause is: " + documentFilter.getWhereClause()); + } + } + getRepositoryClient(ctx).getFiltered(ctx, handler); + reportsObjectList = (ReportsCommonList) handler.getCommonPartList(); + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception in search for Reports", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + return reportsObjectList; + } +} diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportConstants.java b/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportConstants.java new file mode 100644 index 000000000..bf22acb74 --- /dev/null +++ b/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportConstants.java @@ -0,0 +1,35 @@ +/** + * This document is a part of the source code and related artifacts + * for CollectionSpace, an open source collections management system + * for museums and related institutions: + + * http://www.collectionspace.org + * http://wiki.collectionspace.org + + * Copyright 2009 University of California at Berkeley + + * Licensed under the Educational Community License (ECL), Version 2.0. + * You may not use this file except in compliance with this License. + + * You may obtain a copy of the ECL 2.0 License at + + * https://source.collectionspace.org/collection-space/LICENSE.txt + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.collectionspace.services.report.nuxeo; + +/** + * ReportConstants processes CollectionObject document + * + */ +public class ReportConstants { + + public final static String NUXEO_DOCTYPE = "Report"; + public final static String NUXEO_SCHEMA_NAME = "report"; + public final static String NUXEO_DC_TITLE = "CollectionSpace-Report"; +} diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java b/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java new file mode 100644 index 000000000..a3f2f47c4 --- /dev/null +++ b/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportDocumentModelHandler.java @@ -0,0 +1,156 @@ +/** + * This document is a part of the source code and related artifacts + * for CollectionSpace, an open source collections management system + * for museums and related institutions: + + * http://www.collectionspace.org + * http://wiki.collectionspace.org + + * Copyright 2009 University of California at Berkeley + + * Licensed under the Educational Community License (ECL), Version 2.0. + * You may not use this file except in compliance with this License. + + * You may obtain a copy of the ECL 2.0 License at + + * https://source.collectionspace.org/collection-space/LICENSE.txt + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.collectionspace.services.report.nuxeo; + +import java.util.Iterator; +import java.util.List; + +import org.collectionspace.services.ReportJAXBSchema; +import org.collectionspace.services.common.document.DocumentWrapper; +import org.collectionspace.services.report.ReportsCommon; +import org.collectionspace.services.report.ReportsCommonList; +import org.collectionspace.services.report.ReportsCommonList.ReportListItem; +import org.collectionspace.services.nuxeo.client.java.RemoteDocumentModelHandlerImpl; +import org.collectionspace.services.nuxeo.util.NuxeoUtils; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.api.DocumentModelList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ReportDocumentModelHandler + * + * $LastChangedRevision: $ + * $LastChangedDate: $ + */ +public class ReportDocumentModelHandler + extends RemoteDocumentModelHandlerImpl { + + /** The logger. */ + private final Logger logger = LoggerFactory.getLogger(ReportDocumentModelHandler.class); + /** + * report is used to stash JAXB object to use when handle is called + * for Action.CREATE, Action.UPDATE or Action.GET + */ + private ReportsCommon report; + /** + * reportList is stashed when handle is called + * for ACTION.GET_ALL + */ + private ReportsCommonList reportList; + + + /** + * getCommonPart get associated report + * @return + */ + @Override + public ReportsCommon getCommonPart() { + return report; + } + + /** + * setCommonPart set associated report + * @param report + */ + @Override + public void setCommonPart(ReportsCommon report) { + this.report = report; + } + + /** + * getCommonPartList get associated report (for index/GET_ALL) + * @return + */ + @Override + public ReportsCommonList getCommonPartList() { + return reportList; + } + + /* (non-Javadoc) + * @see org.collectionspace.services.nuxeo.client.java.DocumentModelHandler#setCommonPartList(java.lang.Object) + */ + @Override + public void setCommonPartList(ReportsCommonList reportList) { + this.reportList = reportList; + } + + /* (non-Javadoc) + * @see org.collectionspace.services.nuxeo.client.java.DocumentModelHandler#extractCommonPart(org.collectionspace.services.common.document.DocumentWrapper) + */ + @Override + public ReportsCommon extractCommonPart(DocumentWrapper wrapDoc) + throws Exception { + throw new UnsupportedOperationException(); + } + + /* (non-Javadoc) + * @see org.collectionspace.services.nuxeo.client.java.DocumentModelHandler#fillCommonPart(java.lang.Object, org.collectionspace.services.common.document.DocumentWrapper) + */ + @Override + public void fillCommonPart(ReportsCommon reportObject, DocumentWrapper wrapDoc) throws Exception { + throw new UnsupportedOperationException(); + } + + /* (non-Javadoc) + * @see org.collectionspace.services.nuxeo.client.java.DocumentModelHandler#extractCommonPartList(org.collectionspace.services.common.document.DocumentWrapper) + */ + @Override + public ReportsCommonList extractCommonPartList(DocumentWrapper wrapDoc) throws Exception { + ReportsCommonList coList = this.extractPagingInfo(new ReportsCommonList(), wrapDoc); + List list = coList.getReportListItem(); + Iterator iter = wrapDoc.getWrappedObject().iterator(); + String label = getServiceContext().getCommonPartLabel(); + while(iter.hasNext()){ + DocumentModel docModel = iter.next(); + ReportListItem ilistItem = new ReportListItem(); + ilistItem.setName((String) docModel.getProperty(label, + ReportJAXBSchema.NAME)); + ilistItem.setOutputMIME((String) docModel.getProperty(label, + ReportJAXBSchema.OUTPUT_MIME)); + ilistItem.setForSingleDoc((Boolean) docModel.getProperty(label, + ReportJAXBSchema.FOR_SINGLE_DOC)); + ilistItem.setForDocType((String) docModel.getProperty(label, + ReportJAXBSchema.FOR_DOC_TYPE)); + String id = NuxeoUtils.extractId(docModel.getPathAsString()); + ilistItem.setUri(getServiceContextPath() + id); + ilistItem.setCsid(id); + list.add(ilistItem); + } + + return coList; + } + + /** + * getQProperty converts the given property to qualified schema property + * @param prop + * @return + */ + @Override + public String getQProperty(String prop) { + return ReportConstants.NUXEO_SCHEMA_NAME + ":" + prop; + } + +} + diff --git a/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportValidatorHandler.java b/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportValidatorHandler.java new file mode 100644 index 000000000..9e4045ef8 --- /dev/null +++ b/services/report/service/src/main/java/org/collectionspace/services/report/nuxeo/ReportValidatorHandler.java @@ -0,0 +1,18 @@ +package org.collectionspace.services.report.nuxeo; + +import org.collectionspace.services.common.context.ServiceContext; +import org.collectionspace.services.common.document.InvalidDocumentException; +import org.collectionspace.services.common.document.ValidatorHandler; +import org.collectionspace.services.common.document.DocumentHandler.Action; + +public class ReportValidatorHandler implements ValidatorHandler { + + @Override + public void validate(Action action, ServiceContext ctx) + throws InvalidDocumentException { + // TODO Auto-generated method stub + System.out.println("ReportValidatorHandler executed."); + + } + +} diff --git a/src/main/resources/config/cspace-ds.xml b/src/main/resources/config/cspace-ds.xml index d38540337..b8bd83d22 100644 --- a/src/main/resources/config/cspace-ds.xml +++ b/src/main/resources/config/cspace-ds.xml @@ -29,5 +29,28 @@ http://www.mysql.com/downloads/api-jdbc-stable.html mySQL + + NuxeoDS + false + jdbc:mysql://localhost:3306/nuxeo + com.mysql.jdbc.Driver + test + test + org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter + + + + + + + mySQL + + -- 2.47.3