Author: jdonnerstag Date: Sun Dec 2 02:22:40 2007 New Revision: 600264 URL: http://svn.apache.org/viewvc?rev=600264&view=rev Log: fixed wicket-609: Wicket should provide an easy method to generate absolute urls to bookmarkable pages
Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java?rev=600264&r1=600263&r2=600264&view=diff ============================================================================== --- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java (original) +++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java Sun Dec 2 02:22:40 2007 @@ -22,6 +22,9 @@ import java.util.Arrays; import java.util.List; +import javax.servlet.http.HttpServletRequest; + +import org.apache.wicket.RequestCycle; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.util.string.Strings; import org.apache.wicket.util.value.ValueMap; @@ -121,5 +124,67 @@ { throw new WicketRuntimeException(e); } + } + + /** + * Calculates absolute path to url relative to another absolute url. + * + * @param relativePagePath + * path, relative to requestPath + * @return absolute path for given url + */ + public final static String toAbsolutePath(final String relativePagePath) + { + HttpServletRequest req = ((WebRequest)RequestCycle.get().getRequest()).getHttpServletRequest(); + return toAbsolutePath(req.getRequestURL().toString(), relativePagePath); + } + + /** + * Calculates absolute path to url relative to another absolute url. + * + * @param requestPath + * absolute path. + * @param relativePagePath + * path, relative to requestPath + * @return absolute path for given url + */ + public final static String toAbsolutePath(final String requestPath, + final String relativePagePath) + { + final StringBuffer result; + if (requestPath.endsWith("/")) + { + result = new StringBuffer(requestPath); + } + else + { + // Remove everything after last slash (but not slash itself) + result = new StringBuffer(requestPath.substring(0, requestPath.lastIndexOf('/') + 1)); + } + + if (relativePagePath.startsWith("../")) + { + StringBuffer tempRelative = new StringBuffer(relativePagePath); + + // Go up through hierarchy until we find most common directory for both pathes. + while (tempRelative.indexOf("../") == 0) + { + // Delete ../ from relative path + tempRelative.delete(0, 3); + + // Delete last slash from result + result.setLength(result.length() - 1); + + // Delete everyting up to last slash + result.delete(result.lastIndexOf("/") + 1, result.length()); + } + result.append(tempRelative); + } + else + { + // Pages are in the same directory + result.append(relativePagePath); + } + return result.toString(); } } Modified: wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java?rev=600264&r1=600263&r2=600264&view=diff ============================================================================== --- wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java (original) +++ wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java Sun Dec 2 02:22:40 2007 @@ -18,8 +18,15 @@ import junit.framework.TestCase; +/** + * + * @author Johan + */ public class RequestUtilsTest extends TestCase { + /** + * + */ public void testDoubleDotsMiddle() { assertEquals("/a/b", RequestUtils.removeDoubleDots("/a/b/../b")); @@ -27,27 +34,54 @@ assertEquals("a/b/", RequestUtils.removeDoubleDots("a/b/../b/")); } + /** + * + */ public void testDoubleDotsEnd() { assertEquals("/a/b", RequestUtils.removeDoubleDots("/a/b/c/..")); assertEquals("a/b", RequestUtils.removeDoubleDots("a/b/c/..")); } + /** + * + */ public void testDoubleDotsStart() { assertEquals("/../a/b", RequestUtils.removeDoubleDots("/../a/b")); assertEquals("../a/b", RequestUtils.removeDoubleDots("../a/b")); } + /** + * + */ public void testEmptyDoubleDots() { assertEquals("", RequestUtils.removeDoubleDots("")); } + /** + * + */ public void testOneDoubleDots() { assertEquals("..", RequestUtils.removeDoubleDots("..")); assertEquals("../", RequestUtils.removeDoubleDots("../")); assertEquals("/..", RequestUtils.removeDoubleDots("/..")); + } + + /** + * + */ + public void testToAbsolutePath() + { + assertEquals(RequestUtils.toAbsolutePath("http://aif.ru/test/test", "../blah/zzz"), + "http://aif.ru/blah/zzz"); + assertEquals(RequestUtils.toAbsolutePath("http://aif.ru/test", "blah/zzz"), + "http://aif.ru/blah/zzz"); + assertEquals(RequestUtils.toAbsolutePath("http://aif.ru/test/", "../blah/zzz"), + "http://aif.ru/blah/zzz"); + assertEquals(RequestUtils.toAbsolutePath("http://aif.ru/blah/test", "zzz"), + "http://aif.ru/blah/zzz"); } }