| // Copyright 2004, 2005, 2006 The Apache Software Foundation |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package org.apache.tapestry.asset; |
| |
| import static org.easymock.EasyMock.eq; |
| import static org.easymock.EasyMock.expect; |
| import static org.easymock.EasyMock.isA; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.TreeMap; |
| |
| import org.apache.hivemind.impl.DefaultClassResolver; |
| import org.apache.oro.text.regex.MalformedPatternException; |
| import org.apache.oro.text.regex.Pattern; |
| import org.apache.oro.text.regex.PatternCompiler; |
| import org.apache.oro.text.regex.PatternMatcher; |
| import org.apache.oro.text.regex.Perl5Compiler; |
| import org.apache.oro.text.regex.Perl5Matcher; |
| import org.apache.tapestry.BaseComponentTestCase; |
| import org.apache.tapestry.engine.ILink; |
| import org.apache.tapestry.services.LinkFactory; |
| import org.apache.tapestry.services.ServiceConstants; |
| import org.testng.annotations.Test; |
| |
| /** |
| * Tests for unprotected resource contributions. |
| * |
| * @author jkuhnert |
| */ |
| @Test(sequential=true) |
| public class TestUnprotectedAsset extends BaseComponentTestCase |
| { |
| |
| PatternCompiler compiler = new Perl5Compiler(); |
| PatternMatcher matcher = new Perl5Matcher(); |
| |
| /** |
| * Tests for regexp patterns describing unprotected resources. |
| */ |
| public void test_Protected_Pattern_Match() |
| { |
| Pattern pr = newPattern("org/apache/tapestry/asset/.*.txt"); |
| |
| assertFalse(matcher.contains("org/apache/tapestry/foobar.png", pr)); |
| assertTrue(matcher.contains("org/apache/tapestry/asset/base-resource.txt", pr)); |
| assertFalse(matcher.contains("org/apache/tapestry/asset/foobar.png", pr)); |
| } |
| |
| /** |
| * Creates {@link Pattern} objects for regexp matching. |
| * |
| * @param pattern |
| */ |
| protected Pattern newPattern(String pattern) |
| { |
| Pattern pr = null; |
| try |
| { |
| pr = compiler.compile("org/apache/tapestry/asset/.*.txt", Perl5Compiler.READ_ONLY_MASK |
| | Perl5Compiler.CASE_INSENSITIVE_MASK | Perl5Compiler.MULTILINE_MASK); |
| } |
| catch (MalformedPatternException e) |
| { |
| unreachable(); |
| } |
| |
| return pr; |
| } |
| |
| /** |
| * Tests and asserts that it doesn't take ~longer~ to work with undigested |
| * resources using patterns than normal digested resources. |
| */ |
| public void test_Resource_Performance_Comparison() |
| { |
| Pattern pr = newPattern("/org/apache/tapestry/asset/tapestry-in-action.png"); |
| |
| ResourceDigestSourceImpl s = new ResourceDigestSourceImpl(); |
| s.setClassResolver(new DefaultClassResolver()); |
| |
| // call methods once to be sure things get cached properly |
| |
| assertEquals("a5f4663532ea3efe22084df086482290", s |
| .getDigestForResource("/org/apache/tapestry/asset/tapestry-in-action.png")); |
| |
| matcher.contains("/org/apache/tapestry/asset/tapestry-in-action.png", pr); |
| |
| long currTime = System.currentTimeMillis(); |
| s.getDigestForResource("/org/apache/tapestry/asset/tapestry-in-action.png"); |
| long drtime = System.currentTimeMillis() - currTime; |
| |
| currTime = System.currentTimeMillis(); |
| matcher.contains("/org/apache/tapestry/asset/tapestry-in-action.png", pr); |
| long urtime = System.currentTimeMillis() - currTime; |
| |
| assertFalse(urtime < drtime, "Urtime > drtime: " + urtime + " > " + drtime); |
| } |
| |
| /** |
| * Tests new path ordering encoding. |
| */ |
| public void test_Path_Comparator() |
| { |
| Map parameters = new TreeMap(new AssetComparator()); |
| |
| parameters.put(ServiceConstants.SERVICE, "test"); |
| parameters.put("PATH", "value"); |
| parameters.put("digest", "digvalue"); |
| |
| assertEquals("test", parameters.get(ServiceConstants.SERVICE)); |
| assertEquals("value", parameters.get("PATH")); |
| assertEquals("digvalue", parameters.get("digest")); |
| |
| int count = parameters.size(); |
| String[] result = (String[]) parameters.keySet().toArray(new String[count]); |
| assertEquals(3, result.length); |
| |
| assertEquals("PATH", result[2]); |
| } |
| |
| /** |
| * Tests the implementation of {@link ResourceMatcher}. |
| */ |
| public void test_Resource_Matcher() |
| { |
| ResourceMatcherImpl rm = new ResourceMatcherImpl(); |
| List patterns = new ArrayList(); |
| patterns.add("/org/apache/tapestry/asset/.*.txt"); |
| patterns.add("/org/apache/tapestry/asset/.*.css"); |
| patterns.add("/org/apache/tapestry/asset/.*.js"); |
| patterns.add("/org/apache/tapestry/asset/[%$4]rew\\invalidpattern"); |
| patterns.add("/org/apache/tapestry/html/dojo*"); |
| patterns.add("org/apache/tapestry/html/dojo/*/*.png"); |
| rm.setContributions(patterns); |
| rm.initializeService(); |
| |
| assertFalse(rm.containsResource("/org/apache/tapestry/asset/AbstractAsset.class")); |
| assertFalse(rm.containsResource("/org/apache/tapestry/.*.class")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/asset/assetBuilder.js")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/asset/foo.txt")); |
| assertFalse(rm.containsResource("/org/apache/tapestry/asset/foo.TXT")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/asset/subdirectory/foo.css")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/dojo.js")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/src/json.js")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/src/test.png")); |
| } |
| |
| public void test_Configured_Paths() |
| { |
| ResourceMatcherImpl rm = new ResourceMatcherImpl(); |
| List patterns = new ArrayList(); |
| patterns.add("^/tapestry/"); |
| patterns.add("^/dojo/"); |
| patterns.add("^/org/apache/tapestry/.*.css"); |
| patterns.add("^/org/apache/tapestry/.*.gif"); |
| patterns.add("^/org/apache/tapestry/.*.png"); |
| patterns.add("^/org/apache/tapestry/.*.jpg"); |
| patterns.add("^/org/apache/tapestry/.*.js"); |
| patterns.add("^/org/apache/tapestry/.*.htm"); |
| patterns.add("^/org/apache/tapestry/.*.html"); |
| |
| rm.setContributions(patterns); |
| rm.initializeService(); |
| |
| assertTrue(rm.containsResource("/dojo/src/widget/templates/DatePicker.css")); |
| assertTrue(rm.containsResource("/tapestry/core.js")); |
| |
| assertFalse(rm.containsResource("/com/foo/tapestry/foo.properties")); |
| assertFalse(rm.containsResource("/com/foo/tapestry/Bar.class")); |
| |
| assertTrue(rm.containsResource("/org/apache/tapestry/asset/subdirectory/foo.css")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/dojo.js")); |
| assertTrue(rm.containsResource("/org/apache/tapestry/html/dojo/src/json.js")); |
| } |
| |
| public void test_Css_Paths() |
| { |
| AssetService service = new AssetService(); |
| |
| String path = "/dojo/src/widget/template/HtmlComboBox.cssimages/foo.gif"; |
| |
| assertEquals("/dojo/src/widget/template/images/foo.gif", service.translatePath(path)); |
| assertEquals("/boo/templates/things/", |
| service.translatePath("/boo/templates/somethingdumb.cssthings/")); |
| assertEquals("/foo/path/css/images.png", |
| service.translatePath("/foo/path/css/images.png")); |
| assertEquals("/things/mytemplate.css", |
| service.translatePath("/things/mytemplate.css")); |
| assertNull(service.translatePath(null)); |
| } |
| |
| public void test_Relative_Paths() |
| { |
| AssetService service = new AssetService(); |
| |
| assertEquals("/src", service.translatePath("/dojo/../src")); |
| assertEquals("src", service.translatePath("dojo/../src")); |
| assertEquals("/src", service.translatePath("/dojo/blah/../../src")); |
| assertEquals("src", service.translatePath("dojo/blah/../../src")); |
| assertEquals("/src", service.translatePath("/dojo/../blah/../src")); |
| assertEquals("src", service.translatePath("dojo/../blah/../src")); |
| assertEquals("/src/", service.translatePath("/dojo/../src/")); |
| assertEquals("src/", service.translatePath("dojo/../src/")); |
| assertEquals("/", service.translatePath("/dojo/../")); |
| assertEquals("", service.translatePath("dojo/../")); |
| } |
| |
| public void test_Relative_Css_Paths() |
| { |
| AssetService service = new AssetService(); |
| |
| String path = "/dojo/src/widget/template/HtmlComboBox.css../images/foo.gif"; |
| |
| assertEquals("/dojo/src/widget/images/foo.gif", service.translatePath(path)); |
| |
| path = "/dojo/src/widget/template/HtmlComboBox.css../../images/foo.gif"; |
| assertEquals("/dojo/src/images/foo.gif", service.translatePath(path)); |
| |
| assertEquals("/boo/things/", |
| service.translatePath("/boo/templates/somethingdumb.css../things/")); |
| } |
| |
| |
| public void test_Resource_Link_Paths() |
| { |
| LinkFactory factory = newMock(LinkFactory.class); |
| ILink link = newMock(ILink.class); |
| |
| AssetService service = new AssetService(); |
| |
| ResourceMatcherImpl rm = new ResourceMatcherImpl(); |
| List patterns = new ArrayList(); |
| patterns.add("tapestry/*"); |
| patterns.add("dojo/*"); |
| rm.setContributions(patterns); |
| rm.initializeService(); |
| |
| service.setUnprotectedMatcher(rm); |
| service.setLinkFactory(factory); |
| |
| expect(factory.constructLink(eq(service), eq(false), isA(Map.class), eq(false))).andReturn(link); |
| |
| replay(); |
| |
| service.getLink(false, "dojo/src/html.js"); |
| |
| verify(); |
| } |
| } |