1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.jetspeed.rewriter;
18  
19  import java.io.File;
20  import java.io.FileReader;
21  import java.io.FileWriter;
22  import java.io.IOException;
23  import java.io.InputStream;
24  import java.io.InputStreamReader;
25  import java.io.Reader;
26  import java.net.URL;
27  import java.util.Arrays;
28  import java.util.Iterator;
29  
30  import junit.framework.Test;
31  import junit.framework.TestCase;
32  import junit.framework.TestSuite;
33  
34  import org.apache.commons.httpclient.HttpClient;
35  import org.apache.commons.httpclient.methods.GetMethod;
36  import org.apache.jetspeed.rewriter.html.SwingParserAdaptor;
37  import org.apache.jetspeed.rewriter.rules.Attribute;
38  import org.apache.jetspeed.rewriter.rules.Rule;
39  import org.apache.jetspeed.rewriter.rules.Ruleset;
40  import org.apache.jetspeed.rewriter.rules.Tag;
41  import org.apache.jetspeed.rewriter.xml.SaxParserAdaptor;
42  
43  /***
44   * TestRewriterRules
45   * 
46   * @author <a href="mailto:taylor@apache.org">David Sean Taylor </a>
47   * @version $Id: TestRewriterController.java,v 1.3 2004/10/13 15:53:22 weaver
48   *          Exp $
49   */
50  public class TestRewriterController extends TestCase
51  {
52  
53      /***
54       * Defines the testcase name for JUnit.
55       * 
56       * @param name
57       *            the testcase's name.
58       */
59      public TestRewriterController(String name)
60      {
61          super(name);
62      }
63  
64      public String getBaseProject()
65      {
66          return "components/jetspeed";
67      }
68  
69      /***
70       * Start the tests.
71       * 
72       * @param args
73       *            the arguments. Not used
74       */
75      public static void main(String args[])
76      {
77          junit.awtui.TestRunner.main(new String[]
78          { TestRewriterController.class.getName()});
79      }
80  
81      public static Test suite()
82      {
83          // All methods starting with "test" will be executed in the test suite.
84          return new TestSuite(TestRewriterController.class);
85      }
86  
87      public void testFactories() throws Exception
88      {
89          RewriterController component = getController();
90          assertNotNull("template component is null", component);
91  
92          Rewriter basic = component.createRewriter();
93          assertNotNull("basic rewriter is null", basic);
94          FileReader reader = new FileReader("test/rewriter/test-rewriter-rules.xml");
95          Ruleset ruleset = component.loadRuleset(reader);
96          assertNotNull("ruleset is null", ruleset);
97          RulesetRewriter rewriter = component.createRewriter(ruleset);
98          assertNotNull("ruleset rewriter is null", rewriter);
99          assertNotNull("ruleset is null", rewriter.getRuleset());
100     }
101 
102     public void testRules() throws Exception
103     {
104         RewriterController component = getController();
105         assertNotNull("template component is null", component);
106 
107         assertNotNull("rewriter component is null", component);
108         FileReader reader = new FileReader("test/rewriter/test-rewriter-rules.xml");
109         Ruleset ruleset = component.loadRuleset(reader);
110         assertNotNull("ruleset is null", ruleset);
111         assertEquals("ruleset id", "test-set-101", ruleset.getId());
112         Iterator rules = ruleset.getRules().iterator();
113         assertNotNull("rules is null", rules);
114 
115         //
116         // test tags
117         //                   
118         Iterator tags = ruleset.getTags().iterator();
119         while (tags.hasNext())
120         {
121             Tag tag = (Tag) tags.next();
122             if (tag.getId().equalsIgnoreCase("FORM"))
123             {
124                 assertFalse("Remove", tag.getRemove());
125                 Iterator attributes = tag.getAttributes().iterator();
126                 while (attributes.hasNext())
127                 {
128                     Attribute attribute = (Attribute) attributes.next();
129                     assertTrue("attribute is not ACTION", attribute.getId().equals("ACTION"));
130                     assertEquals("attribute rule not equal", attribute.getRule().getId(), "merge");
131                 }
132             }
133             else if (tag.getId().equalsIgnoreCase("INPUT"))
134             {
135                 assertFalse("Remove", tag.getRemove());
136                 Iterator attributes = tag.getAttributes().iterator();
137                 while (attributes.hasNext())
138                 {
139                     Attribute attribute = (Attribute) attributes.next();
140                     assertTrue("attribute is not SOURCE", attribute.getId().equals("SOURCE"));
141                     assertEquals("attribute rule not equal", attribute.getRule().getId(), "test");
142                 }
143 
144             }
145             else if (tag.getId().equalsIgnoreCase("LINK"))
146             {
147                 assertFalse("Remove", tag.getRemove());
148                 Iterator attributes = tag.getAttributes().iterator();
149                 while (attributes.hasNext())
150                 {
151                     Attribute attribute = (Attribute) attributes.next();
152                     assertTrue("attribute is not HREF", attribute.getId().equals("HREF"));
153                     assertEquals("attribute rule not equal", attribute.getRule().getId(), "merge");
154                 }
155             }
156             else if (tag.getId().equalsIgnoreCase("HEAD"))
157             {
158                 assertTrue("Remove", tag.getRemove());
159             }
160             else
161             {
162                 assertTrue("tag name unexpected: " + tag.getId(), false);
163             }
164 
165         }
166         assertNotNull("tags is null", tags);
167 
168         //
169         // test rules
170         //           
171         while (rules.hasNext())
172         {
173             Rule rule = (Rule) rules.next();
174             assertNotNull("rule is null", rule);
175             if (rule.getId().equals("merge"))
176             {
177                 assertEquals("Rule id", rule.getId(), "merge");
178                 assertTrue("Rule Use Base", rule.getUseBase());
179                 assertFalse("Rule Popup", rule.getPopup());
180                 assertEquals("Rule Suffix", rule.getSuffix(), "/web");
181             }
182             else if (rule.getId().equals("test"))
183             {
184                 assertEquals("Rule id", rule.getId(), "test");
185                 assertFalse("Rule Use Base", rule.getUseBase());
186                 assertTrue("Rule Popup", rule.getPopup());
187                 assertEquals("Rule Suffix", rule.getSuffix(), "/whatever&xxx=1");
188             }
189             else
190             {
191                 assertTrue("rule name unexpected: " + rule.getId(), false);
192             }
193         }
194 
195     }
196 
197     public void testRewriting() throws Exception
198     {
199         RewriterController component = getController();
200         assertNotNull("template component is null", component);
201 
202         assertNotNull("rewriter component is null", component);
203 
204         FileReader reader = new FileReader("test/rewriter/test-remove-rules.xml");
205 
206         Ruleset ruleset = component.loadRuleset(reader);
207         reader.close();
208         assertNotNull("ruleset is null", ruleset);
209         RulesetRewriter rewriter = component.createRewriter(ruleset);
210         assertNotNull("ruleset rewriter is null", rewriter);
211         assertNotNull("ruleset is null", rewriter.getRuleset());
212 
213         FileReader htmlReader = new FileReader("test/rewriter/test-001.html");
214         FileWriter htmlWriter = getTestWriter("test-001-output.html");
215 
216         ParserAdaptor adaptor = component.createParserAdaptor("text/html");
217         rewriter.setBaseUrl("http://www.rewriter.com");
218         rewriter.rewrite(adaptor, htmlReader, htmlWriter);
219         htmlWriter.close();
220         htmlReader.close();
221 
222         // validate result
223         FileReader testReader = new FileReader("target/test/rewriter/test-001-output.html");
224         UnitTestRewriter testRewriter = new UnitTestRewriter();
225         testRewriter.parse(component.createParserAdaptor("text/html"), testReader);
226         assertTrue("1st rewritten anchor: " + testRewriter.getAnchorValue("1"), testRewriter.getAnchorValue("1")
227                 .equals("http://www.bluesunrise.com/suffix"));
228         assertTrue("2nd rewritten anchor: " + testRewriter.getAnchorValue("2"), testRewriter.getAnchorValue("2")
229                 .equals("http://www.rewriter.com/stuff/junk/stuffedjunk.html/suffix"));
230         assertTrue("3rd rewritten anchor: " + testRewriter.getAnchorValue("3"), testRewriter.getAnchorValue("3")
231                 .equals("http://www.rewriter.com/stuff/junk/stuffedjunk.html/suffix"));
232         assertTrue("4th rewritten anchor: " + testRewriter.getAnchorValue("4"), testRewriter.getAnchorValue("4")
233                 .equals("javascript:whatever()"));
234         assertTrue("5th rewritten anchor: " + testRewriter.getAnchorValue("5"), testRewriter.getAnchorValue("5")
235                 .equals("mailto:david@bluesunrise.com"));
236         assertTrue("6th rewritten anchor: " + testRewriter.getAnchorValue("6"), testRewriter.getAnchorValue("6")
237                 .equals("#INTERNAL"));
238 
239         assertTrue("Paragraph text: " + testRewriter.getParagraph(), testRewriter.getParagraph().equals(
240                 "This is a test"));
241     }
242 
243     /***
244      * Gets a writer for a given filename in the test directory.
245      * 
246      * @return A file reader to the test rules file
247      * @throws IOException
248      */
249     private FileWriter getTestWriter(String filename) throws IOException
250     {
251         new File("target/test/rewriter").mkdirs();
252         return new FileWriter("target/test/rewriter/" + filename);
253     }
254 
255 
256     private RewriterController getController() throws Exception
257     {
258         Class[] rewriterClasses = new Class[]
259         { RulesetRewriterImpl.class, RulesetRewriterImpl.class};
260         
261         //Class[] rewriterClasses = new Class[]
262           //     { WebContentRewriter.class, WebContentRewriter.class};
263         
264         Class[] adaptorClasses = new Class[]
265         { SwingParserAdaptor.class, SaxParserAdaptor.class};
266         return new JetspeedRewriterController("test/WEB-INF/conf/rewriter-rules-mapping.xml", Arrays
267                 .asList(rewriterClasses), Arrays.asList(adaptorClasses));
268     }
269     
270     public void XXXtestExternalRewriting() throws Exception
271     {
272         RewriterController component = getController();
273         assertNotNull("template component is null", component);
274 
275         assertNotNull("rewriter component is null", component);
276 
277         Reader reader = new FileReader("test/rewriter/default-rewriter-rules.xml");
278 
279         Ruleset ruleset = component.loadRuleset(reader);
280         reader.close();
281         assertNotNull("ruleset is null", ruleset);
282         RulesetRewriter rewriter = component.createRewriter(ruleset);
283         assertNotNull("ruleset rewriter is null", rewriter);
284         assertNotNull("ruleset is null", rewriter.getRuleset());
285 
286         String source = "http://jakarta.apache.org/tomcat/";
287         Reader htmlReader = getRemoteReader(source);
288         FileWriter htmlWriter = getTestWriter("test-002-output.html");
289 
290         ParserAdaptor adaptor = component.createParserAdaptor("text/html");
291         
292         URL baseURL = new URL(source);
293         String baseurl = baseURL.getProtocol() + "://" + baseURL.getHost();        
294         
295         rewriter.setBaseUrl(baseurl);
296         rewriter.rewrite(adaptor, htmlReader, htmlWriter);
297         htmlWriter.close();
298         htmlReader.close();
299     }
300 
301     private Reader getRemoteReader(String uri) throws IOException
302     {
303         HttpClient client = new HttpClient();
304         GetMethod get = new GetMethod(uri);
305         client.executeMethod(get);
306         InputStream is = get.getResponseBodyAsStream();
307         return new InputStreamReader(is);
308     }
309     
310 }