Author: svenmeier
Date: Thu Jul 28 18:02:09 2011
New Revision: 1151942

URL: http://svn.apache.org/viewvc?rev=1151942&view=rev
Log:
WICKET-3514 more tests, simplified CryptoMapper implementation

Added:
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
   (with props)
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
   (with props)
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
   (with props)
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
   (with props)
Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java?rev=1151942&r1=1151941&r2=1151942&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
 Thu Jul 28 18:02:09 2011
@@ -44,6 +44,7 @@ import org.slf4j.LoggerFactory;
  * 
  * @author igor.vaynberg
  * @author Jesse Long
+ * @author svenmeier
  */
 public class CryptoMapper implements IRequestMapper
 {
@@ -125,22 +126,10 @@ public class CryptoMapper implements IRe
                encryptedUrl.getSegments().add(encryptedUrlString);
 
                int numberOfSegments = url.getSegments().size();
-               char[] encryptedChars = encryptedUrlString.toCharArray();
-               int hash = 0;
+               HashedSegmentGenerator generator = new 
HashedSegmentGenerator(encryptedUrlString);
                for (int segNo = 0; segNo < numberOfSegments; segNo++)
                {
-                       char a = encryptedChars[Math.abs(hash % 
encryptedChars.length)];
-                       hash++;
-                       char b = encryptedChars[Math.abs(hash % 
encryptedChars.length)];
-                       hash++;
-                       char c = encryptedChars[Math.abs(hash % 
encryptedChars.length)];
-
-                       String segment = "" + a + b + c;
-                       hash = hashString(segment);
-
-                       segment += String.format("%02x", Math.abs(hash % 256));
-                       encryptedUrl.getSegments().add(segment);
-                       hash = hashString(segment);
+                       encryptedUrl.getSegments().add(generator.next());
                }
                return encryptedUrl;
        }
@@ -152,8 +141,8 @@ public class CryptoMapper implements IRe
                        return encryptedUrl;
                }
 
-               List<String> segments = encryptedUrl.getSegments();
-               if (segments.size() < 1)
+               List<String> encryptedSegments = encryptedUrl.getSegments();
+               if (encryptedSegments.size() < 1)
                {
                        return null;
                }
@@ -161,7 +150,7 @@ public class CryptoMapper implements IRe
                Url url = new Url(request.getCharset());
                try
                {
-                       String encryptedUrlString = segments.get(0);
+                       String encryptedUrlString = encryptedSegments.get(0);
                        if (Strings.isEmpty(encryptedUrlString))
                        {
                                return null;
@@ -171,41 +160,25 @@ public class CryptoMapper implements IRe
                        Url originalUrl = Url.parse(decryptedUrl, 
request.getCharset());
 
                        int originalNumberOfSegments = 
originalUrl.getSegments().size();
-                       int numberOfSegments = 
encryptedUrl.getSegments().size();
-
-                       char[] encryptedChars = 
encryptedUrlString.toCharArray();
-                       int hash = 0;
+                       int encryptedNumberOfSegments = 
encryptedUrl.getSegments().size();
 
-                       int segNo;
-                       for (segNo = 1; segNo < numberOfSegments && segNo < 
originalNumberOfSegments + 1; segNo++)
+                       HashedSegmentGenerator generator = new 
HashedSegmentGenerator(encryptedUrlString);
+                       int segNo = 1;
+                       for (; segNo < encryptedNumberOfSegments; segNo++)
                        {
-                               char a = encryptedChars[Math.abs(hash % 
encryptedChars.length)];
-                               hash++;
-                               char b = encryptedChars[Math.abs(hash % 
encryptedChars.length)];
-                               hash++;
-                               char c = encryptedChars[Math.abs(hash % 
encryptedChars.length)];
-
-                               String segment = "" + a + b + c;
-                               hash = hashString(segment);
-
-                               segment += String.format("%02x", Math.abs(hash 
% 256));
-                               hash = hashString(segment);
-
-                               if (segment.equals(segments.get(segNo)) &&
-                                       originalUrl.getSegments().size() >= 
segNo)
-                               {
-                                       
url.getSegments().add(originalUrl.getSegments().get(segNo - 1));
-                               }
-                               else
+                               if (segNo > originalNumberOfSegments ||
+                                       
!generator.next().equals(encryptedSegments.get(segNo)))
                                {
-                                       // append new segments from browser
-                                       while (segNo < numberOfSegments)
-                                       {
-                                               
url.getSegments().add(encryptedUrl.getSegments().get(segNo));
-                                               segNo++;
-                                       }
                                        break;
                                }
+
+                               // unmodified segment
+                               
url.getSegments().add(originalUrl.getSegments().get(segNo - 1));
+                       }
+                       for (; segNo < encryptedNumberOfSegments; segNo++)
+                       {
+                               // modified or additional segment
+                               
url.getSegments().add(encryptedUrl.getSegments().get(segNo));
                        }
 
                        
url.getQueryParameters().addAll(originalUrl.getQueryParameters());
@@ -219,19 +192,6 @@ public class CryptoMapper implements IRe
                return url;
        }
 
-       private int hashString(final String str)
-       {
-               int hash = 97;
-
-               for (char c : str.toCharArray())
-               {
-                       int i = c;
-                       hash = 47 * hash + i;
-               }
-
-               return hash;
-       }
-
        private static class ApplicationCryptProvider implements 
IProvider<ICrypt>
        {
                private final Application application;
@@ -247,4 +207,53 @@ public class CryptoMapper implements IRe
                }
        }
 
-}
+       /**
+        * A generator of hashed segments.
+        */
+       private static class HashedSegmentGenerator
+       {
+               private char[] characters;
+
+               private int hash = 0;
+
+               public HashedSegmentGenerator(String string)
+               {
+                       characters = string.toCharArray();
+               }
+
+               /**
+                * Generate the next segment
+                * 
+                * @return segment
+                */
+               public String next()
+               {
+                       char a = characters[Math.abs(hash % characters.length)];
+                       hash++;
+                       char b = characters[Math.abs(hash % characters.length)];
+                       hash++;
+                       char c = characters[Math.abs(hash % characters.length)];
+
+                       String segment = "" + a + b + c;
+                       hash = hashString(segment);
+
+                       segment += String.format("%02x", Math.abs(hash % 256));
+                       hash = hashString(segment);
+
+                       return segment;
+               }
+
+               private int hashString(final String str)
+               {
+                       int hash = 97;
+
+                       for (char c : str.toCharArray())
+                       {
+                               int i = c;
+                               hash = 47 * hash + i;
+                       }
+
+                       return hash;
+               }
+       }
+}
\ No newline at end of file

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java?rev=1151942&r1=1151941&r2=1151942&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/CryptoMapperTest.java
 Thu Jul 28 18:02:09 2011
@@ -148,11 +148,11 @@ public class CryptoMapperTest extends Ab
        }
 
        /**
-        * Test resources appended via CSS, WICKET-3514
+        * Relative ResourceReferences, WICKET-3514
         */
-       public void testCSSResource()
+       public void testResourceReference()
        {
-               String encrypted = 
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPIRVhLnwK6Xt2SsvC5G0ygfWLeZ9Qr1gPztSHdUoNloddRxz1zXnW4JHmqip6HVj10wfCyvF7GzNwI7oJfqdt5GjpprCHL1dEe89Ef8QXhwD-ag1NTrt8in9/X5E87/1dEa1/qipf7/10w47/base-tree-images.png";
+               String encrypted = 
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPITjbCTT6mLI5l-7b-WJucu-Kc8StVsu-PL5htkbIxuxphv3mYi5-mmkCvkxPsriihj5VPg3naw2fA/X5E87/b-W6b/l-795/Juc97/mG5fa";
 
                Request request = getRequest(Url.parse(encrypted));
 
@@ -161,8 +161,61 @@ public class CryptoMapperTest extends Ab
                assertTrue(requestHandler instanceof 
ResourceReferenceRequestHandler);
                ResourceReferenceRequestHandler handler = 
(ResourceReferenceRequestHandler)requestHandler;
 
-               assertEquals(org.apache.wicket.markup.html.tree.BaseTree.class,
-                       handler.getResourceReference().getScope());
-               assertEquals("res/base-tree-images.png", 
handler.getResourceReference().getName());
+               assertEquals(getClass(), 
handler.getResourceReference().getScope());
+               assertEquals("crypt/crypt.txt", 
handler.getResourceReference().getName());
+       }
+
+       /**
+        * Relative ResourceReferences, WICKET-3514
+        */
+       public void testResourceReferenceWithModifiedSegments()
+       {
+               String encrypted = 
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPITjbCTT6mLI5l-7b-WJucu-Kc8StVsu-PL5htkbIxuxphv3mYi5-mmkCvkxPsriihj5VPg3naw2fA/X5E87/b-W6b/l-795/Juc97/modified-crypt.txt";
+
+               Request request = getRequest(Url.parse(encrypted));
+
+               IRequestHandler requestHandler = mapper.mapRequest(request);
+
+               assertTrue(requestHandler instanceof 
ResourceReferenceRequestHandler);
+               ResourceReferenceRequestHandler handler = 
(ResourceReferenceRequestHandler)requestHandler;
+
+               assertEquals(getClass(), 
handler.getResourceReference().getScope());
+               assertEquals("crypt/modified-crypt.txt", 
handler.getResourceReference().getName());
+       }
+
+       /**
+        * Relative ResourceReferences, WICKET-3514
+        */
+       public void testResourceReferenceWithMoreSegments()
+       {
+               String encrypted = 
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPITjbCTT6mLI5l-7b-WJucu-Kc8StVsu-PL5htkbIxuxphv3mYi5-mmkCvkxPsriihj5VPg3naw2fA/X5E87/b-W6b/l-795/Juc97/more/crypt.txt";
+
+               Request request = getRequest(Url.parse(encrypted));
+
+               IRequestHandler requestHandler = mapper.mapRequest(request);
+
+               assertTrue(requestHandler instanceof 
ResourceReferenceRequestHandler);
+               ResourceReferenceRequestHandler handler = 
(ResourceReferenceRequestHandler)requestHandler;
+
+               assertEquals(getClass(), 
handler.getResourceReference().getScope());
+               assertEquals("crypt/more/crypt.txt", 
handler.getResourceReference().getName());
+       }
+
+       /**
+        * Relative ResourceReferences, WICKET-3514
+        */
+       public void testResourceReferenceWithLessSegments()
+       {
+               String encrypted = 
"X5EA-RpmG5-t7GSByiSposVVWJ28fpoU-XgFo7bOPITjbCTT6mLI5l-7b-WJucu-Kc8StVsu-PL5htkbIxuxphv3mYi5-mmkCvkxPsriihj5VPg3naw2fA/X5E87/b-W6b/l-795/less-crypt.txt";
+
+               Request request = getRequest(Url.parse(encrypted));
+
+               IRequestHandler requestHandler = mapper.mapRequest(request);
+
+               assertTrue(requestHandler instanceof 
ResourceReferenceRequestHandler);
+               ResourceReferenceRequestHandler handler = 
(ResourceReferenceRequestHandler)requestHandler;
+
+               assertEquals(getClass(), 
handler.getResourceReference().getScope());
+               assertEquals("less-crypt.txt", 
handler.getResourceReference().getName());
        }
 }
\ No newline at end of file

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt?rev=1151942&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
 Thu Jul 28 18:02:09 2011
@@ -0,0 +1 @@
+CryptoMapperTest#testResourceReference()
\ No newline at end of file

Propchange: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/crypt.txt
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt?rev=1151942&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
 Thu Jul 28 18:02:09 2011
@@ -0,0 +1 @@
+CryptoMapperTest#testResourceReferenceWithModifiedSegments()
\ No newline at end of file

Propchange: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/modified-crypt.txt
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt?rev=1151942&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
 Thu Jul 28 18:02:09 2011
@@ -0,0 +1 @@
+CryptoMapperTest#testResourceReferenceWithMoreSegments()
\ No newline at end of file

Propchange: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/crypt/more/crypt.txt
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt?rev=1151942&view=auto
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
 (added)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
 Thu Jul 28 18:02:09 2011
@@ -0,0 +1 @@
+CryptoMapperTest#testResourceReferenceWithLessSegments()
\ No newline at end of file

Propchange: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/request/mapper/less-crypt.txt
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to