From: SVN c. m. f. t. SWORD-A. p. <swo...@li...> - 2012-03-25 17:40:58
|
Revision: 489 http://sword-app.svn.sourceforge.net/sword-app/?rev=489&view=rev Author: richard-jones Date: 2012-03-25 17:40:48 +0000 (Sun, 25 Mar 2012) Log Message: ----------- add auto-discovery service to client, and associated tests Modified Paths: -------------- JavaClient2.0/pom.xml JavaClient2.0/src/main/java/org/swordapp/client/SWORDClient.java JavaClient2.0/src/main/java/org/swordapp/client/UriRegistry.java JavaClient2.0/src/test/java/org/swordapp/client/test/SSSSemiUnits.java JavaClient2.0/src/test/java/org/swordapp/client/test/SpecTests.java JavaClient2.0/sword-client.iml Added Paths: ----------- JavaClient2.0/src/main/java/org/swordapp/client/Endpoints.java Modified: JavaClient2.0/pom.xml =================================================================== --- JavaClient2.0/pom.xml 2012-03-25 16:17:58 UTC (rev 488) +++ JavaClient2.0/pom.xml 2012-03-25 17:40:48 UTC (rev 489) @@ -80,5 +80,10 @@ <artifactId>commons-codec</artifactId> <version>1.4</version> </dependency> + <dependency> + <groupId>org.jsoup</groupId> + <artifactId>jsoup</artifactId> + <version>1.6.1</version> + </dependency> </dependencies> </project> \ No newline at end of file Added: JavaClient2.0/src/main/java/org/swordapp/client/Endpoints.java =================================================================== --- JavaClient2.0/src/main/java/org/swordapp/client/Endpoints.java (rev 0) +++ JavaClient2.0/src/main/java/org/swordapp/client/Endpoints.java 2012-03-25 17:40:48 UTC (rev 489) @@ -0,0 +1,71 @@ +package org.swordapp.client; + +import java.util.HashMap; +import java.util.Map; + +public class Endpoints +{ + private String serviceDocument = null; + private String collection = null; + private String edit = null; + private Map<String, String> statements = new HashMap<String, String>(); + + public Endpoints() {} + + public Endpoints(String serviceDocument, String collection, String edit, Map<String, String> statements) + { + this.serviceDocument = serviceDocument; + this.collection = collection; + this.edit = edit; + this.statements = statements; + } + + public String getServiceDocument() + { + return serviceDocument; + } + + public void setServiceDocument(String serviceDocument) + { + this.serviceDocument = serviceDocument; + } + + public String getCollection() + { + return collection; + } + + public void setCollection(String collection) + { + this.collection = collection; + } + + public String getEdit() + { + return edit; + } + + public void setEdit(String edit) + { + this.edit = edit; + } + + public Map<String, String> getStatements() + { + if (statements.size() == 0) + { + return null; + } + return statements; + } + + public void setStatements(Map<String, String> statements) + { + this.statements = statements; + } + + public void addStatement(String url, String type) + { + this.statements.put(url, type); + } +} Modified: JavaClient2.0/src/main/java/org/swordapp/client/SWORDClient.java =================================================================== --- JavaClient2.0/src/main/java/org/swordapp/client/SWORDClient.java 2012-03-25 16:17:58 UTC (rev 488) +++ JavaClient2.0/src/main/java/org/swordapp/client/SWORDClient.java 2012-03-25 17:40:48 UTC (rev 489) @@ -1,26 +1,24 @@ package org.swordapp.client; import org.apache.abdera.Abdera; -import org.apache.abdera.i18n.iri.IRI; import org.apache.abdera.model.Document; -import org.apache.abdera.model.Element; import org.apache.abdera.model.Entry; import org.apache.abdera.model.Feed; -import org.apache.abdera.model.Link; import org.apache.abdera.model.Service; import org.apache.abdera.parser.ParseException; import org.apache.abdera.protocol.Response; import org.apache.abdera.protocol.client.AbderaClient; import org.apache.abdera.protocol.client.ClientResponse; import org.apache.abdera.protocol.client.RequestOptions; -import org.apache.abdera.protocol.client.util.MultipartRelatedRequestEntity; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.methods.InputStreamRequestEntity; import org.apache.log4j.Logger; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; import javax.activation.MimeType; import javax.activation.MimeTypeParseException; -import java.awt.print.PrinterException; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; @@ -47,6 +45,51 @@ this.abdera = new Abdera(); } + public Endpoints autoDiscover(String url) + throws SWORDClientException + { + try + { + org.jsoup.nodes.Document doc = Jsoup.connect(url).get(); + Elements links = doc.select("link[rel]"); + Endpoints endpoints = new Endpoints(); + + for (int i = 0; i < links.size(); i++) + { + Element element = links.get(i); + String rel = element.attr("rel"); + if (rel == null) + { + continue; + } + rel = rel.toLowerCase(); + + if (rel.equals("sword") || rel.equals(UriRegistry.REL_SERVICE_DOCUMENT)) + { + endpoints.setServiceDocument(element.attr("href")); + } + else if (rel.equals(UriRegistry.REL_DEPOSIT)) + { + endpoints.setCollection(element.attr("href")); + } + else if (rel.equals(UriRegistry.REL_EDIT)) + { + endpoints.setEdit(element.attr("href")); + } + else if (rel.equals(UriRegistry.REL_STATEMENT)) + { + endpoints.addStatement(element.attr("href"), element.attr("type")); + } + } + + return endpoints; + } + catch (IOException e) + { + throw new SWORDClientException(e); + } + } + public ServiceDocument getServiceDocument(String sdURL) throws SWORDClientException, ProtocolViolationException { Modified: JavaClient2.0/src/main/java/org/swordapp/client/UriRegistry.java =================================================================== --- JavaClient2.0/src/main/java/org/swordapp/client/UriRegistry.java 2012-03-25 16:17:58 UTC (rev 488) +++ JavaClient2.0/src/main/java/org/swordapp/client/UriRegistry.java 2012-03-25 17:40:48 UTC (rev 489) @@ -28,6 +28,9 @@ public static SQName SWORD_STATE_DESCRIPTION = new SQName(SWORD_TERMS_NAMESPACE, "stateDescription"); // rel values + public static String REL_SERVICE_DOCUMENT = "http://purl.org/net/sword/discovery/service-document"; + public static String REL_DEPOSIT = SWORD_TERMS_NAMESPACE + "deposit"; + public static String REL_EDIT = SWORD_TERMS_NAMESPACE + "edit"; public static String REL_STATEMENT = SWORD_TERMS_NAMESPACE + "statement"; public static String REL_SWORD_EDIT = SWORD_TERMS_NAMESPACE + "add"; public static String REL_ORIGINAL_DEPOSIT = SWORD_TERMS_NAMESPACE + "originalDeposit"; Modified: JavaClient2.0/src/test/java/org/swordapp/client/test/SSSSemiUnits.java =================================================================== --- JavaClient2.0/src/test/java/org/swordapp/client/test/SSSSemiUnits.java 2012-03-25 16:17:58 UTC (rev 488) +++ JavaClient2.0/src/test/java/org/swordapp/client/test/SSSSemiUnits.java 2012-03-25 17:40:48 UTC (rev 489) @@ -9,6 +9,7 @@ import org.swordapp.client.ClientConfiguration; import org.swordapp.client.Deposit; import org.swordapp.client.DepositReceipt; +import org.swordapp.client.Endpoints; import org.swordapp.client.EntryPart; import org.swordapp.client.OreStatement; import org.swordapp.client.ResourceState; @@ -24,8 +25,10 @@ import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; +import java.util.Map; import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; /** * This class uses explicit knowledge of the SSS test server configuration @@ -37,6 +40,9 @@ */ public class SSSSemiUnits { + private String homePage = null; + private String depositPage = null; + private String resourcePage = null; private String sdIRI = null; private String user = null; private String pass = null; @@ -48,6 +54,9 @@ public void setUp() throws Exception { + this.homePage = "http://localhost:8080/"; + this.depositPage = "http://localhost:8080/html/ded3c328-d8f0-4307-8b86-086cf46a953c"; + this.resourcePage = "http://localhost:8080/html/ded3c328-d8f0-4307-8b86-086cf46a953c/f2966e10-c6a0-40ab-90ad-6fc90d5b8bd3"; this.sdIRI = "http://localhost:8080/sd-uri"; this.user = "sword"; this.pass = "sword"; @@ -308,4 +317,49 @@ } assertTrue(checked); } + + @Test + public void autoDiscoverService() + throws Exception + { + SWORDClient client = new SWORDClient(new ClientConfiguration()); + Endpoints endpoints = client.autoDiscover(this.homePage); + + assertEquals(endpoints.getServiceDocument(), this.sdIRI); + assertNull(endpoints.getCollection()); + assertNull(endpoints.getEdit()); + assertNull(endpoints.getStatements()); + + endpoints = client.autoDiscover(this.depositPage); + + assertNull(endpoints.getServiceDocument()); + assertEquals(endpoints.getCollection(), "http://localhost:8080/col-uri/ded3c328-d8f0-4307-8b86-086cf46a953c"); + assertNull(endpoints.getEdit()); + assertNull(endpoints.getStatements()); + + endpoints = client.autoDiscover(this.resourcePage); + + assertNull(endpoints.getServiceDocument()); + assertNull(endpoints.getCollection()); + assertEquals(endpoints.getEdit(), "http://localhost:8080/edit-uri/ded3c328-d8f0-4307-8b86-086cf46a953c/f2966e10-c6a0-40ab-90ad-6fc90d5b8bd3"); + + Map<String, String> statements = endpoints.getStatements(); + int count = 0; + for (String url : statements.keySet()) + { + String type = statements.get(url); + + if (type.equals("application/atom+xml") || type.equals("application/atom+xml;type=feed")) + { + assertEquals(url, "http://localhost:8080/state-uri/ded3c328-d8f0-4307-8b86-086cf46a953c/f2966e10-c6a0-40ab-90ad-6fc90d5b8bd3.atom"); + count++; + } + else if (type.equals("application/rdf+xml")) + { + assertEquals(url, "http://localhost:8080/state-uri/ded3c328-d8f0-4307-8b86-086cf46a953c/f2966e10-c6a0-40ab-90ad-6fc90d5b8bd3.rdf"); + count++; + } + } + assertEquals(count, 2); + } } Modified: JavaClient2.0/src/test/java/org/swordapp/client/test/SpecTests.java =================================================================== --- JavaClient2.0/src/test/java/org/swordapp/client/test/SpecTests.java 2012-03-25 16:17:58 UTC (rev 488) +++ JavaClient2.0/src/test/java/org/swordapp/client/test/SpecTests.java 2012-03-25 17:40:48 UTC (rev 489) @@ -12,6 +12,7 @@ import org.swordapp.client.Content; import org.swordapp.client.Deposit; import org.swordapp.client.DepositReceipt; +import org.swordapp.client.Endpoints; import org.swordapp.client.EntryPart; import org.swordapp.client.OreStatement; import org.swordapp.client.SWORDClient; @@ -25,7 +26,12 @@ import java.io.FileInputStream; import java.util.List; +import java.util.Map; +// FIXME: these tests rely on a hard-coded set of fixtures to do with my local +// set up. This means anyone else trying to run these tests will need to reconfigure +// and recompile. Sorry. + public class SpecTests { private String sdIRI = null; Modified: JavaClient2.0/sword-client.iml =================================================================== --- JavaClient2.0/sword-client.iml 2012-03-25 16:17:58 UTC (rev 488) +++ JavaClient2.0/sword-client.iml 2012-03-25 17:40:48 UTC (rev 489) @@ -54,6 +54,7 @@ <orderEntry type="library" name="Maven: joda-time:joda-time:1.6" level="project" /> <orderEntry type="library" name="Maven: xom:xom:1.2.5" level="project" /> <orderEntry type="library" name="Maven: javax.servlet:servlet-api:2.4" level="project" /> + <orderEntry type="library" name="Maven: org.jsoup:jsoup:1.6.1" level="project" /> </component> </module> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |