diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 00000000..eaae993e --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,36 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Java CI with Maven + +on: + push: + branches: [ "main", "develop" ] + pull_request: + branches: [ "*" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v7 + - name: Set up JDK + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B verify --file pom.xml + + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive + # - name: Update dependency graph + # uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 + diff --git a/.gitignore b/.gitignore index 6d706b8d..e7b87831 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ buildNumber.properties .project # JDT-specific (Eclipse Java Development Tools) .classpath + +# VS Code +.vscode/ diff --git a/pom.xml b/pom.xml index 46a1328c..7e6ac64c 100644 --- a/pom.xml +++ b/pom.xml @@ -1,32 +1,25 @@ - + 4.0.0 org.dataone d1_libclient_java jar - 2.3.1 + 2.4.0-SNAPSHOT DataONE Java Client Library http://dataone.org UTF-8 - 1.52 - 2.3.0 - 2.3.0 - 1.7 + 1.84 + 2.4.3-SNAPSHOT + 2.4.0-SNAPSHOT + 25 - sonatype.org - https://repository.sonatype.org/content/shadows/centralm1 - - true - - - true - - - + dataone.org - http://maven.dataone.org/ + https://maven.dataone.org/ true @@ -36,54 +29,44 @@ Jibx Maven Repository - http://jibx.sourceforge.net/maven/ + https://jibx.sourceforge.net/maven/ maven2-repository.dev.java.net Java.net Repository for Maven - http://download.java.net/maven/2/ + https://download.java.net/maven/2/ default + - junit - junit - 4.7 - jar - test + jakarta.xml.bind + jakarta.xml.bind-api + 2.3.2 + - org.jmock - jmock-junit4 - 2.5.1 - test + org.glassfish.jaxb + jaxb-runtime + 2.3.2 - - net.sf.jsignature.io-tools - easystream - 1.2.12 - - - - javax.mail - mail - 1.4.1 + junit + junit + [4.13.1,) + jar + test javax.servlet - servlet-api - 2.5 + javax.servlet-api + 4.0.1 jar provided - org.jibx jibx-run @@ -92,7 +75,12 @@ org.bouncycastle - bcpkix-jdk15on + bcpkix-jdk18on + ${bouncycastle.version} + + + org.bouncycastle + bcprov-jdk18on ${bouncycastle.version} @@ -133,6 +121,12 @@ ${d1_test_resources.version} jar test + + + org.bouncycastle + bcprov-jdk15on + + - - - test-jar - - - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.1 - - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/lib - false - false - true - runtime - org.apache.maven,org.codehaus.plexus,classworlds - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - 2.8.1 - - - - - integration-test - - - integration-test - - - - verify - - - verify - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 2.4 - - - src/main/assembly/withDependencies.xml - - - - - - maven-javadoc-plugin - 2.9 - - - - - - - - - - - - - aggregate - - aggregate - - site - - - - - true - - - - org.dataone:* - - - false - true - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - org.apache.maven.plugins - maven-dependency-plugin - [2.0,) - - copy-dependencies - - - - - - - - - - - - + + + org.apache.maven.wagon + wagon-ssh-external + 3.5.3 + + src/main/resources @@ -376,6 +181,15 @@ + + + false + maven.dataone.org + DataONE + scpexe://maven.dataone.org/var/www/maven + default + + Apache License, Version 2.0 @@ -383,9 +197,9 @@ - https://repository.dataone.org/software/cicore - scm:svn:https://repository.dataone.org/software/cicore - scm:svn:https://repository.dataone.org/software/cicore + https://github.com/DataONEorg/d1_libclient_java + scm:git:ssh://github.com:DataONEorg/d1_libclient_java.git + scm:git:ssh://git@github.com:DataONEorg/d1_libclient_java.git HEAD diff --git a/src/main/java/org/dataone/client/auth/CertificateManager.java b/src/main/java/org/dataone/client/auth/CertificateManager.java index 6372b54b..afcc538c 100644 --- a/src/main/java/org/dataone/client/auth/CertificateManager.java +++ b/src/main/java/org/dataone/client/auth/CertificateManager.java @@ -46,7 +46,6 @@ import java.security.UnrecoverableKeyException; import java.security.cert.Certificate; import java.security.cert.CertificateException; -import java.security.cert.CertificateParsingException; import java.security.cert.X509Certificate; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -82,12 +81,12 @@ import org.apache.http.conn.ssl.SSLSocketFactory; import org.bouncycastle.asn1.ASN1InputStream; import org.bouncycastle.asn1.ASN1Primitive; +import org.bouncycastle.asn1.ASN1UTF8String; import org.bouncycastle.asn1.DEROctetString; -import org.bouncycastle.asn1.DERUTF8String; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.cert.X509CertificateHolder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.jce.provider.X509CertificateObject; import org.bouncycastle.openssl.PEMDecryptorProvider; import org.bouncycastle.openssl.PEMEncryptedKeyPair; import org.bouncycastle.openssl.PEMKeyPair; @@ -102,7 +101,6 @@ import org.dataone.service.types.v1.SubjectInfo; import org.dataone.service.types.v1.util.ChecksumUtil; import org.dataone.service.util.TypeMarshaller; -import org.dataone.exceptions.MarshallingException; /** * Import and manage certificates to be used for authentication against DataONE @@ -159,7 +157,9 @@ public class CertificateManager extends Observable { // BouncyCastle added to be able to get the private key and certificate from the PEM // TODO: find a way to do this with default Java provider (not Bouncy Castle)? static { - Security.addProvider(new BouncyCastleProvider()); + if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { + Security.addProvider(new BouncyCastleProvider()); + } } private static String CILOGON_OID_SUBJECT_INFO = null; @@ -417,7 +417,7 @@ private int loadIntoTrustStore(KeyStore trustStore, Reader certLoc) log.debug("pemObject: " + pemObject); if (pemObject instanceof X509CertificateHolder) { X509CertificateHolder holder = (X509CertificateHolder) pemObject; - X509CertificateObject certificate = new X509CertificateObject(holder.toASN1Structure()); + X509Certificate certificate = toX509Certificate(holder); String alias = certificate.getSubjectX500Principal().getName(); log.debug("alias: " + alias); @@ -433,7 +433,7 @@ private int loadIntoTrustStore(KeyStore trustStore, Reader certLoc) log.error(e.getMessage() + " after loading " + count + " certificates", e); } catch (IOException e) { log.error(e.getMessage() + " after loading " + count + " certificates", e); - } catch (CertificateParsingException e) { + } catch (CertificateException e) { log.error(e.getMessage() + " after loading " + count + " certificates", e); } finally { IOUtils.closeQuietly(pemReader); @@ -528,6 +528,18 @@ public PrivateKey loadKey() { return key; } + /** + * Extract the X509Certificate from the X509CertificateHolder + * @param holder the certificate holder + * @return X509Certificate the certificate + * @throws CertificateException + */ + private X509Certificate toX509Certificate(X509CertificateHolder holder) throws CertificateException { + JcaX509CertificateConverter converter = new JcaX509CertificateConverter(); + converter.setProvider(BouncyCastleProvider.PROVIDER_NAME); + return converter.getCertificate(holder); + } + /** * Retrieves the extension value given by the OID * @see http://stackoverflow.com/questions/2409618/how-do-i-decode-a-der-encoded-string-in-java @@ -544,8 +556,8 @@ protected String getExtensionValue(X509Certificate X509Certificate, String oid) if (derObject instanceof DEROctetString) { DEROctetString derOctetString = (DEROctetString) derObject; derObject = toDERObject(derOctetString.getOctets()); - if (derObject instanceof DERUTF8String) { - DERUTF8String s = DERUTF8String.getInstance(derObject); + if (derObject instanceof ASN1UTF8String) { + ASN1UTF8String s = ASN1UTF8String.getInstance(derObject); decoded = s.getString(); } } @@ -1003,7 +1015,6 @@ private X509TrustManager getTrustManager() throws NoSuchAlgorithmException, KeyS // choose to use the default as is, or make an augmented trust manager with additional entries - // TODO: remove the System.out.println statements in the TrustManager if (trustStoreIncludesD1CAs) { log.info("creating custom TrustManager"); @@ -1222,8 +1233,8 @@ else if (pemObject instanceof PEMKeyPair) { } else if (pemObject instanceof X509CertificateHolder) { X509CertificateHolder holder = (X509CertificateHolder) pemObject; try { - certificate = new X509CertificateObject(holder.toASN1Structure()); - } catch (CertificateParsingException e) { + certificate = toX509Certificate(holder); + } catch (CertificateException e) { log.warn("Could not parse x509 certificate", e); } } @@ -1297,9 +1308,9 @@ public X509Certificate loadCertificateFromFile(String fileName) throws IOExcepti if (pemObject instanceof X509CertificateHolder) { X509CertificateHolder holder = (X509CertificateHolder) pemObject; try { - certificate = new X509CertificateObject(holder.toASN1Structure()); + certificate = toX509Certificate(holder); break; - } catch (CertificateParsingException e) { + } catch (CertificateException e) { log.warn("could not parse certificate", e); } } diff --git a/src/main/java/org/dataone/client/utils/HttpConnectionMonitorService.java b/src/main/java/org/dataone/client/utils/HttpConnectionMonitorService.java index 9f3aac98..ddc78478 100644 --- a/src/main/java/org/dataone/client/utils/HttpConnectionMonitorService.java +++ b/src/main/java/org/dataone/client/utils/HttpConnectionMonitorService.java @@ -34,9 +34,9 @@ public class HttpConnectionMonitorService extends Thread { WeakHashMap connManStateMap = new WeakHashMap<>(); WeakHashMap clientStateMap = new WeakHashMap<>(); - private volatile boolean shutdown; + private volatile boolean shutdown = false; - final static Logger logger = Logger.getLogger(HttpConnectionMonitorService.class); + private static final Logger logger = Logger.getLogger(HttpConnectionMonitorService.class); private static class SingletonHolder { public static final HttpConnectionMonitorService INSTANCE = new HttpConnectionMonitorService(); diff --git a/src/main/java/org/dataone/client/v1/itk/DataPackage.java b/src/main/java/org/dataone/client/v1/itk/DataPackage.java index c3e97e30..05c74576 100644 --- a/src/main/java/org/dataone/client/v1/itk/DataPackage.java +++ b/src/main/java/org/dataone/client/v1/itk/DataPackage.java @@ -26,12 +26,12 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.Map; import java.util.Set; @@ -466,7 +466,7 @@ public static DataPackage download(Identifier pid) D1Object packageObject = D1Object.download(pid); if (packageObject.getFormatId().getValue().equals("http://www.openarchives.org/ore/terms")) { - String resourceMap = IOUtils.toString(packageObject.getDataSource().getInputStream()); + String resourceMap = IOUtils.toString(packageObject.getDataSource().getInputStream(), StandardCharsets.UTF_8); return deserializePackage(resourceMap); } throw new InvalidRequest("0000","The identifier does not represent a DataPackage (is not an ORE resource map)"); diff --git a/src/main/java/org/dataone/client/v2/itk/DataPackage.java b/src/main/java/org/dataone/client/v2/itk/DataPackage.java index ab595055..eac6142a 100644 --- a/src/main/java/org/dataone/client/v2/itk/DataPackage.java +++ b/src/main/java/org/dataone/client/v2/itk/DataPackage.java @@ -26,12 +26,12 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.Map; import java.util.Set; @@ -466,7 +466,7 @@ public static DataPackage download(Identifier pid) D1Object packageObject = D1Object.download(pid); if (packageObject.getFormatId().getValue().equals("http://www.openarchives.org/ore/terms")) { - String resourceMap = IOUtils.toString(packageObject.getDataSource().getInputStream()); + String resourceMap = IOUtils.toString(packageObject.getDataSource().getInputStream(), StandardCharsets.UTF_8); return deserializePackage(resourceMap); } throw new InvalidRequest("0000","The identifier does not represent a DataPackage (is not an ORE resource map)"); diff --git a/src/main/java/org/dataone/ore/ProvResourceMapBuilder.java b/src/main/java/org/dataone/ore/ProvResourceMapBuilder.java index 6d969267..1ead2a3e 100644 --- a/src/main/java/org/dataone/ore/ProvResourceMapBuilder.java +++ b/src/main/java/org/dataone/ore/ProvResourceMapBuilder.java @@ -27,6 +27,7 @@ import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @@ -49,13 +50,11 @@ import org.dspace.foresite.ORESerialiser; import org.dspace.foresite.ORESerialiserException; import org.dspace.foresite.ORESerialiserFactory; -import org.dspace.foresite.Predicate; import org.dspace.foresite.ResourceMap; import org.dspace.foresite.ResourceMapDocument; import org.dspace.foresite.Triple; import com.hp.hpl.jena.rdf.model.AnonId; -import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; @@ -411,7 +410,7 @@ private void setModel(ResourceMap resourceMap) throws OREException { ORESerialiser serialiser = ORESerialiserFactory.getInstance(DEFAULT_RDF_FORMAT); try { ResourceMapDocument oreDocument = serialiser.serialise(resourceMap); - InputStream inputStream = IOUtils.toInputStream(oreDocument.toString()); + InputStream inputStream = IOUtils.toInputStream(oreDocument.toString(), StandardCharsets.UTF_8); rdfModel.read(inputStream, null); // TODO: Do we need to handle relative URIs? } catch (ORESerialiserException e) { diff --git a/src/main/resources/buildInfo/buildInfo.properties b/src/main/resources/buildInfo/buildInfo.properties deleted file mode 100644 index fb1fc987..00000000 --- a/src/main/resources/buildInfo/buildInfo.properties +++ /dev/null @@ -1,6 +0,0 @@ -D1-Component=${project.artifactId} -D1-version=${project.version} -D1-SCM-Revision=${buildNumber} -D1-SCM-Branch=${scmBranch} -D1-Build-TimeStamp=${timestamp} - diff --git a/src/main/resources/org/dataone/configuration/config.xml b/src/main/resources/org/dataone/configuration/config.xml index eec2362d..ee913bd8 100644 --- a/src/main/resources/org/dataone/configuration/config.xml +++ b/src/main/resources/org/dataone/configuration/config.xml @@ -3,5 +3,4 @@ - - \ No newline at end of file + diff --git a/src/main/resources/org/dataone/configuration/d1hazelcast.properties b/src/main/resources/org/dataone/configuration/d1hazelcast.properties deleted file mode 100644 index 0d6253bd..00000000 --- a/src/main/resources/org/dataone/configuration/d1hazelcast.properties +++ /dev/null @@ -1,23 +0,0 @@ -## default hazelcast properties - -# The name of the Hazelcast Cluster group and password -dataone.hazelcast.group=DataONE -dataone.hazelcast.password=password - -# The name of the cluster-wide node map -dataone.hazelcast.nodes=hzNodes - -# The name of the cluster-wide system metadata map -dataone.hazelcast.systemMetadata=hzSystemMetadata - -# The list of IP addresses of DataONE Hazelcast cluster members -dataone.hazelcast.clusterInstances=10.0.0.100,128.111.220.50,129.24.0.48 - -# The name of the replication tasks queue used to schedule unprocessed tasks -dataone.hazelcast.replicationQueuedTasks=hzReplicationTasks - -# the name of the replication tasks map that hold task being processed -dataone.hazelcast.replicationPendingTasks=hzPendingReplicationTasks - -# The name of the id generator to uniquely produce cluster-wide task ids -dataone.hazelcast.taskIdGenerator=task-ids diff --git a/src/test/java/org/dataone/client/impl/rest/EchoTestMultipartRestClientIT.java b/src/test/java/org/dataone/client/impl/rest/EchoTestMultipartRestClientIT.java index be7552c6..7bf0d5ca 100644 --- a/src/test/java/org/dataone/client/impl/rest/EchoTestMultipartRestClientIT.java +++ b/src/test/java/org/dataone/client/impl/rest/EchoTestMultipartRestClientIT.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; import org.apache.http.Header; @@ -61,7 +62,7 @@ public void testDoGetRequest() String contentString = null; try { InputStream is = rc.doGetRequest(u.getUrl(), null); - contentString = IOUtils.toString(is); + contentString = IOUtils.toString(is, StandardCharsets.UTF_8); } catch (ServiceFailure e) { contentString = e.getDescription(); } @@ -83,7 +84,7 @@ public void testdoDeleteRequest() String contentString = null; try { InputStream is = rc.doDeleteRequest(u.getUrl(), null); - contentString = IOUtils.toString(is); + contentString = IOUtils.toString(is, StandardCharsets.UTF_8); } catch (ServiceFailure e) { contentString = e.getDescription(); } @@ -128,7 +129,7 @@ public void testdoPutRequestNullBody() String contentString = null; try { InputStream is = rc.doPutRequest(u.getUrl(),null, null); - contentString = IOUtils.toString(is); + contentString = IOUtils.toString(is, StandardCharsets.UTF_8); } catch (ServiceFailure e) { contentString = e.getDescription(); } @@ -151,7 +152,7 @@ public void testdoPostRequestNullBody() String contentString = null; try { InputStream is = rc.doPostRequest(u.getUrl(),null, null); - contentString = IOUtils.toString(is); + contentString = IOUtils.toString(is, StandardCharsets.UTF_8); } catch (ServiceFailure e) { contentString = e.getDescription(); } @@ -176,7 +177,7 @@ public void testdoPutRequest() String contentString = null; try { InputStream is = rc.doPutRequest(u.getUrl(),ent, null); - contentString = IOUtils.toString(is); + contentString = IOUtils.toString(is, StandardCharsets.UTF_8); } catch (ServiceFailure e) { contentString = e.getDescription(); } @@ -201,7 +202,7 @@ public void testdoPostRequest() String contentString = null; try { InputStream is = rc.doPostRequest(u.getUrl(),ent, null); - contentString = IOUtils.toString(is); + contentString = IOUtils.toString(is, StandardCharsets.UTF_8); } catch (ServiceFailure e) { contentString = e.getDescription(); } @@ -223,7 +224,7 @@ public void testExceptionFiltering() try { InputStream is = rc.doGetRequest(u.getUrl(), null); - String contentString = IOUtils.toString(is); + String contentString = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(contentString); fail("should not have reached here"); } catch (NotFound e) { diff --git a/src/test/java/org/dataone/client/impl/rest/EchoTestRestClientIT.java b/src/test/java/org/dataone/client/impl/rest/EchoTestRestClientIT.java index bd28a4d0..c0ab1c54 100644 --- a/src/test/java/org/dataone/client/impl/rest/EchoTestRestClientIT.java +++ b/src/test/java/org/dataone/client/impl/rest/EchoTestRestClientIT.java @@ -26,12 +26,13 @@ import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; -import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.client.HttpClients; import org.dataone.client.rest.RestClient; import org.dataone.mimemultipart.SimpleMultipartEntity; import org.dataone.service.util.D1Url; @@ -43,6 +44,10 @@ public class EchoTestRestClientIT { private static String echoNode = "http://dev-testing.dataone.org/testsvc"; private static String echoResource = "echo"; private static String mmEchoResource = "echomm"; + + private RestClient newRestClient() { + return new RestClient(HttpClients.createDefault()); + } @Ignore @Test @@ -50,10 +55,10 @@ public void testDoGetRequest() throws ClientProtocolException, IOException { D1Url u = new D1Url(echoNode, echoResource); u.addNextPathElement("bizz"); u.addNonEmptyParamPair("x", "y"); - RestClient rc = new RestClient(new DefaultHttpClient()); + RestClient rc = newRestClient(); HttpResponse resp = rc.doGetRequest(u.getUrl(), null); InputStream is = resp.getEntity().getContent(); - String contentString = IOUtils.toString(is); + String contentString = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(contentString); assertTrue("",contentString.contains("request.META[ REQUEST_METHOD ] = GET")); assertTrue("",contentString.contains("request.META[ PATH_INFO ] = /echo/bizz")); @@ -67,10 +72,10 @@ public void testdoDeleteRequest() throws ClientProtocolException, IOException { D1Url u = new D1Url(echoNode, echoResource); u.addNextPathElement("bizz"); u.addNonEmptyParamPair("x", "y"); - RestClient rc = new RestClient(new DefaultHttpClient()); + RestClient rc = newRestClient(); HttpResponse resp = rc.doDeleteRequest(u.getUrl(), null); InputStream is = resp.getEntity().getContent(); - String contentString = IOUtils.toString(is); + String contentString = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(contentString); assertTrue("",contentString.contains("request.META[ REQUEST_METHOD ] = DELETE")); assertTrue("",contentString.contains("request.META[ PATH_INFO ] = /echo/bizz")); @@ -83,7 +88,7 @@ public void testDoHeadRequest() throws ClientProtocolException, IOException { D1Url u = new D1Url(echoNode, echoResource); u.addNextPathElement("bizz"); u.addNonEmptyParamPair("x", "y"); - RestClient rc = new RestClient(new DefaultHttpClient()); + RestClient rc = newRestClient(); HttpResponse resp = rc.doHeadRequest(u.getUrl(), null); Header[] headers = resp.getAllHeaders(); String hString = new String(); @@ -99,10 +104,10 @@ public void testdoPutRequestNullBody() throws ClientProtocolException, IOExcepti D1Url u = new D1Url(echoNode, echoResource); u.addNextPathElement("bizz"); u.addNonEmptyParamPair("x", "y"); - RestClient rc = new RestClient(new DefaultHttpClient()); + RestClient rc = newRestClient(); HttpResponse resp = rc.doPutRequest(u.getUrl(),null, null); InputStream is = resp.getEntity().getContent(); - String contentString = IOUtils.toString(is); + String contentString = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(contentString); assertTrue("",contentString.contains("request.META[ REQUEST_METHOD ] = PUT")); assertTrue("",contentString.contains("request.META[ PATH_INFO ] = /echo/bizz")); @@ -115,10 +120,10 @@ public void testdoPostRequestNullBody() throws ClientProtocolException, IOExcept D1Url u = new D1Url(echoNode, echoResource); u.addNextPathElement("bizz"); u.addNonEmptyParamPair("x", "y"); - RestClient rc = new RestClient(new DefaultHttpClient()); + RestClient rc = newRestClient(); HttpResponse resp = rc.doPostRequest(u.getUrl(),null, null); InputStream is = resp.getEntity().getContent(); - String contentString = IOUtils.toString(is); + String contentString = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(contentString); assertTrue("",contentString.contains("request.META[ REQUEST_METHOD ] = POST")); assertTrue("",contentString.contains("request.META[ PATH_INFO ] = /echo/bizz")); @@ -133,10 +138,10 @@ public void testdoPutRequest() throws ClientProtocolException, IOException { SimpleMultipartEntity ent = new SimpleMultipartEntity(); ent.addParamPart("Jabberwocky", "Twas brillig and the slithy tove, did gyre and gimble in the wabe"); ent.addFilePart("Jabberwocky2", "All mimsy was the borogrove, and the mome wrath ungrabe."); - RestClient rc = new RestClient(new DefaultHttpClient()); + RestClient rc = newRestClient(); HttpResponse resp = rc.doPutRequest(u.getUrl(),ent, null); InputStream is = resp.getEntity().getContent(); - String contentString = IOUtils.toString(is); + String contentString = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(contentString); assertTrue("",contentString.contains("request.META[ CONTENT_TYPE ] = multipart/form-data")); assertTrue("",contentString.contains("request.REQUEST[ Jabberwocky ] = Twas brillig and the slithy tove, did gyre and gimble in the wabe")); @@ -153,10 +158,10 @@ public void testdoPostRequest() throws ClientProtocolException, IOException { SimpleMultipartEntity ent = new SimpleMultipartEntity(); ent.addParamPart("Jabberwocky", "Twas brillig and the slithy tove, did gyre and gimble in the wabe"); ent.addFilePart("Jabberwocky2", "All mimsy was the borogrove, and the mome wrath ungrabe."); - RestClient rc = new RestClient(new DefaultHttpClient()); + RestClient rc = newRestClient(); HttpResponse resp = rc.doPostRequest(u.getUrl(),ent, null); InputStream is = resp.getEntity().getContent(); - String contentString = IOUtils.toString(is); + String contentString = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(contentString); assertTrue("",contentString.contains("request.META[ CONTENT_TYPE ] = multipart/form-data")); assertTrue("",contentString.contains("request.REQUEST[ Jabberwocky ] = Twas brillig and the slithy tove, did gyre and gimble in the wabe")); @@ -170,11 +175,11 @@ public void testDoGetRequest_setHeader() throws ClientProtocolException, IOExcep D1Url u = new D1Url(echoNode, echoResource); u.addNextPathElement("bizz"); u.addNonEmptyParamPair("x", "y"); - RestClient rc = new RestClient(new DefaultHttpClient()); + RestClient rc = newRestClient(); rc.setHeader("mememe", "momomo"); HttpResponse resp = rc.doGetRequest(u.getUrl(), null); InputStream is = resp.getEntity().getContent(); - String contentString = IOUtils.toString(is); + String contentString = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println(contentString); assertTrue("",contentString.contains("request.META[ REQUEST_METHOD ] = GET")); assertTrue("",contentString.contains("request.META[ PATH_INFO ] = /echo/bizz")); diff --git a/src/test/java/org/dataone/client/v1/itk/D1ObjectTest.java b/src/test/java/org/dataone/client/v1/itk/D1ObjectTest.java index 95b56945..ef169cb8 100644 --- a/src/test/java/org/dataone/client/v1/itk/D1ObjectTest.java +++ b/src/test/java/org/dataone/client/v1/itk/D1ObjectTest.java @@ -30,6 +30,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import javax.activation.DataSource; @@ -38,7 +39,6 @@ import org.apache.commons.io.IOUtils; import org.dataone.client.types.AccessPolicyEditor; -import org.dataone.client.v1.itk.D1Object; import org.dataone.client.v1.types.D1TypeBuilder; import org.dataone.service.exceptions.InvalidRequest; import org.dataone.service.exceptions.NotFound; @@ -223,7 +223,7 @@ public void testGetDataSource() throws NoSuchAlgorithmException, NotFound, Inval D1TypeBuilder.buildFormatIdentifier("text/csv"), D1TypeBuilder.buildSubject("submitterMe"), D1TypeBuilder.buildNodeReference("someMN")); - assertTrue(IOUtils.toString(d.getDataSource().getInputStream()).equals("someData")); + assertTrue(IOUtils.toString(d.getDataSource().getInputStream(), StandardCharsets.UTF_8).equals("someData")); } @@ -236,7 +236,7 @@ public void testSetDataSource() throws NoSuchAlgorithmException, NotFound, Inval D1TypeBuilder.buildSubject("submitterMe"), D1TypeBuilder.buildNodeReference("someMN")); d.setDataSource(new ByteArrayDataSource("someOtherData".getBytes(),null)); - assertTrue(IOUtils.toString(d.getDataSource().getInputStream()).equals("someOtherData")); + assertTrue(IOUtils.toString(d.getDataSource().getInputStream(), StandardCharsets.UTF_8).equals("someOtherData")); } @@ -260,7 +260,7 @@ public void testFileDataSource() throws NoSuchAlgorithmException, NotFound, Inva D1TypeBuilder.buildSubject("submitterMe"), D1TypeBuilder.buildNodeReference("someMN")); - assertTrue(IOUtils.toString(d.getDataSource().getInputStream()).equals("someData")); + assertTrue(IOUtils.toString(d.getDataSource().getInputStream(), StandardCharsets.UTF_8).equals("someData")); } finally { dataFile.delete(); } diff --git a/src/test/java/org/dataone/client/v1/itk/DataPackageTest.java b/src/test/java/org/dataone/client/v1/itk/DataPackageTest.java index 8e881d56..6377e709 100644 --- a/src/test/java/org/dataone/client/v1/itk/DataPackageTest.java +++ b/src/test/java/org/dataone/client/v1/itk/DataPackageTest.java @@ -33,14 +33,12 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.commons.io.IOUtils; import org.dataone.client.exception.ClientSideException; -import org.dataone.client.v1.itk.DataPackage; import org.dataone.client.v1.types.D1TypeBuilder; import org.dataone.configuration.Settings; import org.dataone.ore.ResourceMapFactory; @@ -58,7 +56,6 @@ import org.junit.Ignore; import org.junit.Test; -import com.hp.hpl.jena.rdf.model.AnonId; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; @@ -140,7 +137,7 @@ public void testInsertRelationshipObjectLiteral() { // Load the result into a model for reading Model rdfModel = ModelFactory.createDefaultModel(); - InputStream inputStream = IOUtils.toInputStream(rdfXML, "UTF-8"); + InputStream inputStream = IOUtils.toInputStream(rdfXML, StandardCharsets.UTF_8); rdfModel.read(inputStream, null); Resource subjectResource = @@ -170,7 +167,7 @@ public void testInsertRelationshipObjectLiteral() { e.printStackTrace(); fail(e.getMessage()); - } catch (IOException e) { + } catch (RuntimeException e) { e.printStackTrace(); fail(e.getMessage()); @@ -218,10 +215,8 @@ public void testInsertRelationshipBlankNode() { // Load the result into a model for reading Model rdfModel = ModelFactory.createDefaultModel(); - InputStream inputStream = IOUtils.toInputStream(rdfXML, "UTF-8"); + InputStream inputStream = IOUtils.toInputStream(rdfXML, StandardCharsets.UTF_8); rdfModel.read(inputStream, null); - Resource subjectResource = null; - Property property = null; Resource objectResource = null; Selector selector = null; StmtIterator statements = null; @@ -261,9 +256,9 @@ public void testInsertRelationshipBlankNode() { } catch (ORESerialiserException e) { e.printStackTrace(); - } catch (IOException e) { + } catch (RuntimeException e) { e.printStackTrace(); - + fail(e.getMessage()); } } @@ -299,7 +294,6 @@ public void testInsertRelationship() throws OREException, ORESerialiserException //Create the derived resources //A resource map - Identifier resourceMapId = D1TypeBuilder.buildIdentifier("resouceMap.1.1"); //Metadata Identifier metadataId = D1TypeBuilder.buildIdentifier("meta.1.1"); //One derived data @@ -323,9 +317,7 @@ public void testInsertRelationship() throws OREException, ORESerialiserException dataPackage.insertRelationship(metadataId, dataIds); //Create the primary resources - Identifier primaryDataId = D1TypeBuilder.buildIdentifier("primaryData.1.1"); URI primaryDataURI = new URI(D1_URI_PREFIX + "primaryData.1.1"); - Identifier primaryDataId2 = D1TypeBuilder.buildIdentifier("primaryData.2.1"); URI primaryDataURI2 = new URI(D1_URI_PREFIX + "primaryData.2.1"); //Create a list of ids of the primary data resources @@ -422,7 +414,7 @@ private Predicate asPredicate(Property property, String prefix) Predicate predicate = new Predicate(); predicate.setName(property.getLocalName()); predicate.setNamespace(property.getNameSpace()); - if ( prefix != null || ! prefix.isEmpty() ) { + if (prefix != null && !prefix.isEmpty()) { predicate.setPrefix(prefix); } diff --git a/src/test/java/org/dataone/client/v2/itk/D1ObjectTest.java b/src/test/java/org/dataone/client/v2/itk/D1ObjectTest.java index 1dea448d..a3d62977 100644 --- a/src/test/java/org/dataone/client/v2/itk/D1ObjectTest.java +++ b/src/test/java/org/dataone/client/v2/itk/D1ObjectTest.java @@ -30,6 +30,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import javax.activation.DataSource; @@ -38,7 +39,6 @@ import org.apache.commons.io.IOUtils; import org.dataone.client.types.AccessPolicyEditor; -import org.dataone.client.v2.itk.D1Object; import org.dataone.client.v1.types.D1TypeBuilder; import org.dataone.service.exceptions.InvalidRequest; import org.dataone.service.exceptions.NotFound; @@ -223,7 +223,7 @@ public void testGetDataSource() throws NoSuchAlgorithmException, NotFound, Inval D1TypeBuilder.buildFormatIdentifier("text/csv"), D1TypeBuilder.buildSubject("submitterMe"), D1TypeBuilder.buildNodeReference("someMN")); - assertTrue(IOUtils.toString(d.getDataSource().getInputStream()).equals("someData")); + assertTrue(IOUtils.toString(d.getDataSource().getInputStream(), StandardCharsets.UTF_8).equals("someData")); } @@ -236,7 +236,7 @@ public void testSetDataSource() throws NoSuchAlgorithmException, NotFound, Inval D1TypeBuilder.buildSubject("submitterMe"), D1TypeBuilder.buildNodeReference("someMN")); d.setDataSource(new ByteArrayDataSource("someOtherData".getBytes(),null)); - assertTrue(IOUtils.toString(d.getDataSource().getInputStream()).equals("someOtherData")); + assertTrue(IOUtils.toString(d.getDataSource().getInputStream(), StandardCharsets.UTF_8).equals("someOtherData")); } @@ -260,7 +260,7 @@ public void testFileDataSource() throws NoSuchAlgorithmException, NotFound, Inva D1TypeBuilder.buildSubject("submitterMe"), D1TypeBuilder.buildNodeReference("someMN")); - assertTrue(IOUtils.toString(d.getDataSource().getInputStream()).equals("someData")); + assertTrue(IOUtils.toString(d.getDataSource().getInputStream(), StandardCharsets.UTF_8).equals("someData")); } finally { dataFile.delete(); } diff --git a/src/test/java/org/dataone/client/v2/itk/DataPackageTest.java b/src/test/java/org/dataone/client/v2/itk/DataPackageTest.java index 9a34485d..1e7b00f1 100644 --- a/src/test/java/org/dataone/client/v2/itk/DataPackageTest.java +++ b/src/test/java/org/dataone/client/v2/itk/DataPackageTest.java @@ -33,14 +33,12 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.commons.io.IOUtils; import org.dataone.client.exception.ClientSideException; -import org.dataone.client.v2.itk.DataPackage; import org.dataone.client.v1.types.D1TypeBuilder; import org.dataone.configuration.Settings; import org.dataone.ore.ResourceMapFactory; @@ -58,7 +56,6 @@ import org.junit.Ignore; import org.junit.Test; -import com.hp.hpl.jena.rdf.model.AnonId; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; @@ -140,7 +137,7 @@ public void testInsertRelationshipObjectLiteral() { // Load the result into a model for reading Model rdfModel = ModelFactory.createDefaultModel(); - InputStream inputStream = IOUtils.toInputStream(rdfXML, "UTF-8"); + InputStream inputStream = IOUtils.toInputStream(rdfXML, StandardCharsets.UTF_8); rdfModel.read(inputStream, null); Resource subjectResource = @@ -170,7 +167,7 @@ public void testInsertRelationshipObjectLiteral() { e.printStackTrace(); fail(e.getMessage()); - } catch (IOException e) { + } catch (RuntimeException e) { e.printStackTrace(); fail(e.getMessage()); @@ -218,10 +215,8 @@ public void testInsertRelationshipBlankNode() { // Load the result into a model for reading Model rdfModel = ModelFactory.createDefaultModel(); - InputStream inputStream = IOUtils.toInputStream(rdfXML, "UTF-8"); + InputStream inputStream = IOUtils.toInputStream(rdfXML, StandardCharsets.UTF_8); rdfModel.read(inputStream, null); - Resource subjectResource = null; - Property property = null; Resource objectResource = null; Selector selector = null; StmtIterator statements = null; @@ -261,9 +256,9 @@ public void testInsertRelationshipBlankNode() { } catch (ORESerialiserException e) { e.printStackTrace(); - } catch (IOException e) { + } catch (RuntimeException e) { e.printStackTrace(); - + fail(e.getMessage()); } } @@ -301,7 +296,6 @@ public void testInsertRelationship() throws OREException, ORESerialiserException //Create the derived resources //A resource map - Identifier resourceMapId = D1TypeBuilder.buildIdentifier("resouceMap.1.1"); //Metadata Identifier metadataId = D1TypeBuilder.buildIdentifier("meta.1.1"); //One derived data @@ -325,9 +319,7 @@ public void testInsertRelationship() throws OREException, ORESerialiserException dataPackage.insertRelationship(metadataId, dataIds); //Create the primary resources - Identifier primaryDataId = D1TypeBuilder.buildIdentifier("primaryData.1.1"); URI primaryDataURI = new URI(D1_URI_PREFIX + "primaryData.1.1"); - Identifier primaryDataId2 = D1TypeBuilder.buildIdentifier("primaryData.2.1"); URI primaryDataURI2 = new URI(D1_URI_PREFIX + "primaryData.2.1"); //Create a list of ids of the primary data resources @@ -424,7 +416,7 @@ private Predicate asPredicate(Property property, String prefix) Predicate predicate = new Predicate(); predicate.setName(property.getLocalName()); predicate.setNamespace(property.getNameSpace()); - if ( prefix != null || ! prefix.isEmpty() ) { + if (prefix != null && !prefix.isEmpty()) { predicate.setPrefix(prefix); } diff --git a/src/test/java/org/dataone/ore/ProvResourceMapBuilderTest.java b/src/test/java/org/dataone/ore/ProvResourceMapBuilderTest.java index 5d386450..bf1b3a40 100644 --- a/src/test/java/org/dataone/ore/ProvResourceMapBuilderTest.java +++ b/src/test/java/org/dataone/ore/ProvResourceMapBuilderTest.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -18,16 +19,13 @@ import org.dataone.service.types.v1.Identifier; import org.dataone.vocabulary.PROV; import org.dataone.vocabulary.ProvONE; -import org.dataone.vocabulary.ProvONE_V1; import org.dspace.foresite.OREException; -import org.dspace.foresite.ORESerialiserException; import org.dspace.foresite.Predicate; import org.dspace.foresite.ResourceMap; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import com.hp.hpl.jena.rdf.model.Model; @@ -36,7 +34,6 @@ import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Selector; import com.hp.hpl.jena.rdf.model.SimpleSelector; -import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.vocabulary.RDF; @@ -167,7 +164,7 @@ public void testCreateResourceMapWithProvONE() { System.out.println(rdfXML); // Print it Model rdfModel = ModelFactory.createDefaultModel(); - InputStream inputStream = IOUtils.toInputStream(rdfXML, "UTF-8"); + InputStream inputStream = IOUtils.toInputStream(rdfXML, StandardCharsets.UTF_8); rdfModel.read(inputStream, null); Resource subjectResource = null; Property property = null;