diff --git a/webapp/lib/easymock-3.2.jar b/webapp/lib/easymock-3.2.jar new file mode 100644 index 000000000..7c439f82c Binary files /dev/null and b/webapp/lib/easymock-3.2.jar differ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java index 80994386c..ed3a6430a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java @@ -242,23 +242,12 @@ public class UrlBuilder { } public static String getIndividualProfileUrl(Individual individual, VitroRequest vreq) { - return getIndividualProfileUrl(individual, individual.getURI(),vreq); - } - - public static String getIndividualProfileUrl(String individualUri, VitroRequest vreq) { - Individual individual = new IndividualImpl(individualUri); - return getIndividualProfileUrl(individual, individualUri, vreq); - } - - private static String getIndividualProfileUrl(Individual individual, String individualUri, VitroRequest vreq) { WebappDaoFactory wadf = vreq.getWebappDaoFactory(); String profileUrl = null; try { - URI uri = new URIImpl(individualUri); // throws exception if individualUri is invalid - String namespace = uri.getNamespace(); - String defaultNamespace = wadf.getDefaultNamespace(); - String localName = individual.getLocalName(); + String namespace = individual.getNamespace(); + String defaultNamespace = wadf.getDefaultNamespace(); if (defaultNamespace.equals(namespace)) { profileUrl = getUrl(Route.INDIVIDUAL.path() + "/" + localName); @@ -267,7 +256,7 @@ public class UrlBuilder { log.debug("Found externally linked namespace " + namespace); profileUrl = namespace + localName; } else { - ParamMap params = new ParamMap("uri", individualUri); + ParamMap params = new ParamMap("uri", individual.getURI()); profileUrl = getUrl("/individual", params); } } @@ -276,25 +265,56 @@ public class UrlBuilder { return null; } - if (profileUrl != null) { - LinkedHashMap specialParams = getModelParams(vreq); - if(specialParams.size() != 0) { - profileUrl = addParams(profileUrl, new ParamMap(specialParams)); - } - } - - return profileUrl; + if (profileUrl != null) { + LinkedHashMap specialParams = getModelParams(vreq); + if(specialParams.size() != 0) { + profileUrl = addParams(profileUrl, new ParamMap(specialParams)); + } + } + + return profileUrl; } + /** + * If you already have an Individual object around, + * call getIndividualProfileUrl(Individual, VitroRequest) + * instead of this method. + */ + public static String getIndividualProfileUrl(String individualUri, VitroRequest vreq) { + return getIndividualProfileUrl(new IndividualImpl(individualUri), vreq); + } + + protected static String getIndividualProfileUrl( + String individualUri, + String namespace, String localName, + String defaultNamespace){ + String profileUrl = ""; + try{ + if ( isUriInDefaultNamespace( individualUri, defaultNamespace) ) { + profileUrl = getUrl(Route.INDIVIDUAL.path() + "/" + localName); + } else { + ParamMap params = new ParamMap("uri", individualUri); + profileUrl = getUrl("/individual", params); + } + } catch (Exception e) { + log.warn(e); + return null; + } + return profileUrl; + } + public static boolean isUriInDefaultNamespace(String individualUri, VitroRequest vreq) { return isUriInDefaultNamespace(individualUri, vreq.getWebappDaoFactory()); } - public static boolean isUriInDefaultNamespace(String individualUri, WebappDaoFactory wadf) { + public static boolean isUriInDefaultNamespace(String individualUri, WebappDaoFactory wadf) { + return isUriInDefaultNamespace( individualUri, wadf.getDefaultNamespace()); + } + + public static boolean isUriInDefaultNamespace(String individualUri, String defaultNamespace){ try { - URI uri = new URIImpl(individualUri); // throws exception if individualUri is invalid - String namespace = uri.getNamespace(); - String defaultNamespace = wadf.getDefaultNamespace(); + Individual ind = new IndividualImpl(individualUri); + String namespace = ind.getNamespace(); return defaultNamespace.equals(namespace); } catch (Exception e) { log.warn(e); diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java index 56ee04719..7cc7b9508 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilderTest.java @@ -3,12 +3,21 @@ package edu.cornell.mannlib.vitro.webapp.controller.freemarker; +import static org.easymock.EasyMock.*; + +import javax.servlet.http.HttpServletRequest; + import junit.framework.Assert; import org.junit.Test; +import stubs.edu.cornell.mannlib.vitro.webapp.dao.ApplicationDaoStub; +import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub; import edu.cornell.mannlib.vitro.testing.AbstractTestClass; +import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap; +import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; +import edu.cornell.mannlib.vitro.webapp.web.URLEncoder; public class UrlBuilderTest extends AbstractTestClass { @@ -77,5 +86,80 @@ public class UrlBuilderTest extends AbstractTestClass { Assert.assertEquals(vClassUri, UrlBuilder.urlDecode(vClassUriEncoded)); } + + @Test + public void testGetIndividualProfileURI(){ + VitroRequest vreq = makeMockVitroRequest( "http://example.com/individual/"); + UrlBuilder.contextPath = "http://example.com"; + + String uri = "http://example.com/individual/n2343"; + String url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual/n2343", url); + + uri = "http://example.com/individual/bob"; + url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual/bob",url); + + uri = "http://nondefaultNS.com/individual/n2343"; + url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual?uri=" + URLEncoder.encode(uri), url); + + uri = "http://example.com/individual#n2343"; + url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual?uri=" + URLEncoder.encode(uri), url); + + uri = "http://example.com/individual/5LNCannotStartWithNumber"; + url = UrlBuilder.getIndividualProfileUrl(uri, vreq); + Assert.assertEquals("http://example.com/individual?uri=" + URLEncoder.encode(uri), url); + } + + protected VitroRequest makeMockVitroRequest( final String defaultNS){ + HttpServletRequest req = createMock( HttpServletRequest.class ); + return new VitroRequest(req){ + + @Override + public String getParameter(String key){ return null; } + + @Override + public WebappDaoFactory getWebappDaoFactory(){ + return makeMockWDF(defaultNS); + } + }; + } + protected WebappDaoFactoryStub makeMockWDF( String defaultNS){ + WebappDaoFactoryStub wdf = new WebappDaoFactoryStub(); + wdf.setDefaultNamespace("http://example.com/individual/"); + ApplicationDaoStub aDao = new ApplicationDaoStub(){ + @Override + public boolean isExternallyLinkedNamespace(String ns){ + return false; + } + }; + wdf.setApplicationDao( aDao ); + return wdf; + } + + @Test + public void testIsUriInDefaultNamespace(){ + String[][] examples = { + { "http://example.com/individual/n3234", "http://example.com/individual/"}, + { "http://example.com/individual#n3234", "http://example.com/individual#"}, + { "http://example.com:8080/individual/n3234", "http://example.com:8080/individual/"}, + { "http://example.com:8080/individual#n3234", "http://example.com:8080/individual#"} + }; + + for( String[] example : examples ){ + Assert.assertTrue("expected '"+ example[0] + "' to be in the default NS of '"+example[1]+"'", + UrlBuilder.isUriInDefaultNamespace(example[0], example[1])); + } + + String[][] counterExamples = { + { "http://example.com/individual/5LNCannotStartWithNumber", "http://example.com/individual/" } + }; + for( String[] example : counterExamples ){ + Assert.assertFalse("expected '"+ example[0] + "' to NOT be in the default NS of '"+example[1]+"'", + UrlBuilder.isUriInDefaultNamespace(example[0], example[1])); + } + } }