|
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.
|