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.page;
18  
19  // Java imports
20  import java.util.ArrayList;
21  import java.util.Collection;
22  import java.util.Iterator;
23  import java.util.List;
24  import java.util.Locale;
25  import java.util.Map;
26  
27  import junit.framework.Test;
28  import junit.framework.TestCase;
29  import junit.framework.TestSuite;
30  
31  import org.apache.commons.collections.CollectionUtils;
32  import org.apache.jetspeed.JetspeedActions;
33  import org.apache.jetspeed.om.common.GenericMetadata;
34  import org.apache.jetspeed.om.common.SecurityConstraint;
35  import org.apache.jetspeed.om.common.SecurityConstraints;
36  import org.apache.jetspeed.om.folder.Folder;
37  import org.apache.jetspeed.om.folder.FolderNotFoundException;
38  import org.apache.jetspeed.om.folder.MenuDefinition;
39  import org.apache.jetspeed.om.folder.MenuExcludeDefinition;
40  import org.apache.jetspeed.om.folder.MenuIncludeDefinition;
41  import org.apache.jetspeed.om.folder.MenuOptionsDefinition;
42  import org.apache.jetspeed.om.folder.MenuSeparatorDefinition;
43  import org.apache.jetspeed.om.page.Document;
44  import org.apache.jetspeed.om.page.Fragment;
45  import org.apache.jetspeed.om.page.Link;
46  import org.apache.jetspeed.om.page.Page;
47  import org.apache.jetspeed.om.preference.FragmentPreference;
48  import org.apache.jetspeed.page.document.DocumentNotFoundException;
49  import org.apache.jetspeed.page.psml.CastorXmlPageManager;
50  
51  /***
52   * TestCastorXmlPageManager
53   * 
54   * @author <a href="raphael@apache.org">Rapha\u00ebl Luta</a>
55   * @author <a href="rwatler@apache.org">Randy Watler</a>
56   * @version $Id: TestCastorXmlPageManager.java 553584 2007-07-05 18:09:45Z taylor $
57   */
58  public class TestCastorXmlPageManager extends TestCase implements PageManagerTestShared 
59  {
60      private String testPage002 = "/test002.psml";
61      private String testPage003 = "/test003.psml";
62      private String testPage004 = "/folder2/test004.psml";
63      private String testFolder2 = "/folder2";
64      private String testFolder3 = "/folder3";
65      private String testLink002 = "/test002.link";
66      private String testLink003 = "/test003.link";
67  
68      protected CastorXmlPageManager pageManager;
69  
70      /*
71       * (non-Javadoc)
72       * 
73       * @see junit.framework.TestCase#setUp()
74       */
75      protected void setUp() throws Exception
76      {
77          super.setUp();
78          pageManager = Shared.makeCastorXMLPageManager("pages", false, false);
79      }
80  
81      /***
82       * <p>
83       * tearDown
84       * </p>
85       * 
86       * @see junit.framework.TestCase#tearDown()
87       * @throws java.lang.Exception
88       */
89      protected void tearDown() throws Exception
90      {
91          super.tearDown();
92      }
93  
94      /***
95       * Defines the testcase name for JUnit.
96       * 
97       * @param name
98       *            the testcase's name.
99       */
100     public TestCastorXmlPageManager( String name )
101     {
102         super(name);
103     }
104 
105     /***
106      * Start the tests.
107      * 
108      * @param args
109      *            the arguments. Not used
110      */
111     public static void main( String args[] )
112     {
113         junit.awtui.TestRunner.main(new String[]{TestCastorXmlPageManager.class.getName()});
114     }
115 
116     /***
117      * Creates the test suite.
118      * 
119      * @return a test suite (<code>TestSuite</code>) that includes all
120      *         methods starting with "test"
121      */
122     public static Test suite()
123     {
124         // All methods starting with "test" will be executed in the test suite.
125         return new TestSuite(TestCastorXmlPageManager.class);
126     }
127 
128     public void testNewPage()
129     {
130         Page testpage = pageManager.newPage(this.testPage003);
131         assertNotNull(testpage);
132         assertNotNull(testpage.getId());
133         assertNotNull(testpage.getPath());
134         assertEquals(testpage.getId(), testpage.getPath());
135         assertNotNull(testpage.getRootFragment());
136         assertNotNull(testpage.getRootFragment().getId());
137     }
138 
139     public void testNewFragment()
140     {
141         Fragment f = pageManager.newFragment();
142         assertNotNull(f);
143         assertNotNull(f.getId());
144         assertTrue(f.getType().equals(Fragment.LAYOUT));
145     }
146 
147     public void testNewFolder()
148     {
149         Folder testfolder = pageManager.newFolder(this.testFolder3);
150         assertNotNull(testfolder);
151         assertNotNull(testfolder.getId());
152         assertNotNull(testfolder.getPath());
153         assertEquals(testfolder.getId(), testfolder.getPath());
154     }
155 
156     public void testNewLink()
157     {
158         Link testlink = pageManager.newLink(this.testLink003);
159         assertNotNull(testlink);
160         assertNotNull(testlink.getId());
161         assertNotNull(testlink.getPath());
162         assertEquals(testlink.getId(), testlink.getPath());
163     }
164 
165     public void testGetPage() throws Exception
166     {
167         Page testpage = pageManager.getPage("/test001.psml");
168         assertNotNull(testpage);
169         assertTrue(testpage.getId().equals("/test001.psml"));
170         assertTrue(testpage.getTitle().equals("Test Page"));
171         assertTrue(testpage.getSkin().equals("test-skin"));
172         assertTrue(testpage.getEffectiveDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
173         assertTrue(testpage.getDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
174         assertTrue(testpage.getDefaultDecorator(Fragment.PORTLET).equals("test-portlet"));
175         assertTrue(testpage.getVersion().equals("2.77"));
176 
177         GenericMetadata md = testpage.getMetadata();
178         Collection descriptions = md.getFields("description");
179         Collection subjects = md.getFields("subject");
180         assertEquals(2, descriptions.size());
181         assertEquals(1, subjects.size());
182 
183         Fragment root = testpage.getRootFragment();
184         assertNotNull(root);
185         assertTrue(root.getId().equals("f001"));
186         assertTrue(root.getName().equals("TwoColumns"));
187         assertTrue(root.getType().equals(Fragment.LAYOUT));
188         assertNull(root.getDecorator());
189 
190         List children = root.getFragments();
191         assertNotNull(children);
192         assertTrue(children.size() == 3);
193 
194         Fragment f = (Fragment) children.get(0);
195         assertTrue(f.getId().equals("pe001"));
196         assertTrue(f.getName().equals("HelloPortlet"));
197         assertTrue(f.getType().equals(Fragment.PORTLET));
198 
199         Map properties = f.getProperties();
200         assertNotNull(properties);
201         assertTrue(properties.size() == 7);
202         assertEquals("0", f.getProperty(Fragment.ROW_PROPERTY_NAME));
203         assertEquals(0, f.getIntProperty(Fragment.COLUMN_PROPERTY_NAME));
204         assertEquals(0, f.getLayoutRow());
205         assertEquals(0, f.getLayoutColumn());
206         assertNotNull(f.getProperty(Fragment.X_PROPERTY_NAME));
207         assertTrue(f.getProperty(Fragment.X_PROPERTY_NAME).startsWith("11.1"));
208         assertTrue((f.getLayoutX() > 11.0F) && (f.getLayoutX() < 12.0F));
209         assertTrue((f.getFloatProperty(Fragment.X_PROPERTY_NAME) > 11.0F) &&
210                    (f.getFloatProperty(Fragment.X_PROPERTY_NAME) < 12.0F));
211         assertTrue((f.getLayoutY() > 22.0F) && (f.getLayoutY() < 23.0F));
212         assertTrue((f.getLayoutZ() > 33.0F) && (f.getLayoutZ() < 34.0F));
213         assertTrue((f.getLayoutWidth() > 44.0F) && (f.getLayoutWidth() < 45.0F));
214         assertTrue((f.getLayoutHeight() > 55.0F) && (f.getLayoutWidth() < 56.0F));
215 
216         List preferences = f.getPreferences();
217         assertNotNull(preferences);
218         assertTrue(preferences.size() == 2);
219         assertEquals("pref0", ((FragmentPreference)preferences.get(0)).getName());
220         assertTrue(((FragmentPreference)preferences.get(0)).isReadOnly());
221         assertNotNull(((FragmentPreference)preferences.get(0)).getValueList());
222         assertEquals(2, ((FragmentPreference)preferences.get(0)).getValueList().size());
223         assertEquals("pref0-value0", (String)((FragmentPreference)preferences.get(0)).getValueList().get(0));
224         assertEquals("pref0-value1", (String)((FragmentPreference)preferences.get(0)).getValueList().get(1));
225         assertEquals("pref1", ((FragmentPreference)preferences.get(1)).getName());
226         assertFalse(((FragmentPreference)preferences.get(1)).isReadOnly());
227         assertNotNull(((FragmentPreference)preferences.get(1)).getValueList());
228         assertEquals(1, ((FragmentPreference)preferences.get(1)).getValueList().size());
229         assertEquals("pref1-value", (String)((FragmentPreference)preferences.get(1)).getValueList().get(0));
230 
231         f = (Fragment) children.get(1);
232         assertTrue(f.getId().equals("pe002"));
233         assertTrue(f.getName().equals("JMXPortlet"));
234         assertTrue(f.getType().equals(Fragment.PORTLET));
235 
236         properties = f.getProperties();
237         assertNotNull(properties);
238         assertTrue(properties.size() == 2);
239         assertEquals("0", f.getProperty(Fragment.ROW_PROPERTY_NAME));
240         assertEquals(1, f.getIntProperty(Fragment.COLUMN_PROPERTY_NAME));
241 
242         f = testpage.getFragmentById("f002");
243         assertNotNull(f);
244         assertTrue(f.getId().equals("f002"));
245         assertTrue(f.getName().equals("Card"));
246         assertTrue(f.getType().equals(Fragment.LAYOUT));
247         assertTrue(f.getDecorator().equals("Tab"));
248         assertNotNull(f.getFragments());
249         assertTrue(f.getFragments().size() == 2);
250 
251         List fragments = testpage.getFragmentsByName("JMXPortlet");
252         assertNotNull(fragments);
253         assertEquals(1, fragments.size());
254         assertTrue(((Fragment)fragments.get(0)).getId().equals("pe002"));
255         assertTrue(((Fragment)fragments.get(0)).getName().equals("JMXPortlet"));
256         assertTrue(((Fragment)fragments.get(0)).getType().equals(Fragment.PORTLET));
257     }
258 
259     public void testCreatePage() throws Exception
260     {
261         Page page = pageManager.newPage(this.testPage002);
262         System.out.println("Retrieved test_id in create " + this.testPage002);
263         page.setSkin("myskin");
264         page.setTitle("Created Page");
265         GenericMetadata metadata = page.getMetadata();
266         metadata.addField(Locale.FRENCH, "title", "Created Page de PSML");
267         metadata.addField(Locale.JAPANESE, "title", "Created \u3078\u3088\u3046\u3053\u305d");
268 
269         Fragment root = page.getRootFragment();
270         root.setName("TestLayout");
271         Fragment f = pageManager.newFragment();
272         f.setType(Fragment.PORTLET);
273         f.setName("TestPortlet");
274         Map properties = f.getProperties();
275         properties.put(Fragment.ROW_PROPERTY_NAME, "0");
276         properties.put(Fragment.COLUMN_PROPERTY_NAME, "0");
277         root.getFragments().add(f);
278 
279         SecurityConstraints constraints = page.newSecurityConstraints();
280         constraints.setOwner("new-user");
281         List constraintsList = new ArrayList(1);
282         SecurityConstraint constraint = page.newSecurityConstraint();
283         constraint.setUsers(Shared.makeListFromCSV("user10,user11"));
284         constraint.setRoles(Shared.makeListFromCSV("*"));
285         constraint.setPermissions(Shared.makeListFromCSV(JetspeedActions.EDIT + "," + JetspeedActions.VIEW));
286         constraintsList.add(constraint);
287         constraints.setSecurityConstraints(constraintsList);
288         List constraintsRefsList = new ArrayList(1);
289         constraintsRefsList.add("public-view");
290         constraints.setSecurityConstraintsRefs(constraintsRefsList);
291         page.setSecurityConstraints(constraints);
292 
293         try
294         {
295             pageManager.updatePage(page);
296         }
297         catch (Exception e)
298         {
299             String errmsg = "Exception in page update: " + e.toString();
300             e.printStackTrace();
301             System.err.println(errmsg);
302             assertNotNull(errmsg, null);
303         }
304 
305         page = pageManager.getPage(this.testPage002);
306         assertNotNull(page);
307         assertTrue(page.getId().equals(this.testPage002));
308         assertEquals("Created Page", page.getTitle());
309         assertEquals("Created Page de PSML", page.getTitle(Locale.FRENCH));
310         assertEquals("Created \u3078\u3088\u3046\u3053\u305d", page.getTitle(Locale.JAPANESE));
311         assertNotNull(page.getRootFragment());
312         assertTrue(page.getRootFragment().getName().equals("TestLayout"));
313         assertTrue(page.getRootFragment().getFragments().size() == 1);
314 
315         f = (Fragment) page.getRootFragment().getFragments().get(0);
316         assertNotNull(f.getProperties());
317         assertEquals(0, f.getIntProperty(Fragment.ROW_PROPERTY_NAME));
318     }
319 
320     public void testCreateFolder() throws Exception
321     {
322         Folder folder = pageManager.newFolder(this.testFolder2);
323         System.out.println("Retrieved test_id in create " + this.testFolder2);
324         folder.setTitle("Created Folder");
325         folder.setSkin("test-skin");
326         folder.setDefaultDecorator("test-layout", Fragment.LAYOUT);
327         folder.setDefaultDecorator("test-portlet", Fragment.PORTLET);
328 
329         try
330         {
331             pageManager.updateFolder(folder);
332         }
333         catch (Exception e)
334         {
335             String errmsg = "Exception in folder update: " + e.toString();
336             e.printStackTrace();
337             System.err.println(errmsg);
338             assertNotNull(errmsg, null);
339         }
340 
341         folder = pageManager.getFolder(this.testFolder2);
342         assertNotNull(folder);
343         assertTrue(folder.getId().equals(this.testFolder2));
344         assertTrue(folder.getTitle().equals("Created Folder"));
345         assertTrue(folder.getSkin().equals("test-skin"));
346         assertTrue(folder.getEffectiveDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
347         assertTrue(folder.getDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
348         assertTrue(folder.getDefaultDecorator(Fragment.PORTLET).equals("test-portlet"));
349     }
350 
351     public void testCreateLink() throws Exception
352     {
353         Link link = pageManager.newLink(this.testLink002);
354         System.out.println("Retrieved test_id in create " + this.testLink002);
355         link.setTitle("Created Link");
356         link.setSkin("test-skin");
357         link.setUrl("http://www.created.link.com/");
358 
359         try
360         {
361             pageManager.updateLink(link);
362         }
363         catch (Exception e)
364         {
365             String errmsg = "Exception in link update: " + e.toString();
366             e.printStackTrace();
367             System.err.println(errmsg);
368             assertNotNull(errmsg, null);
369         }
370 
371         link = pageManager.getLink(this.testLink002);
372         assertNotNull(link);
373         assertTrue(link.getId().equals(this.testLink002));
374         assertTrue(link.getTitle().equals("Created Link"));
375         assertTrue(link.getSkin().equals("test-skin"));
376     }
377 
378     public void testUpdatePage() throws Exception
379     {
380         Page page = pageManager.getPage(this.testPage002);
381         page.setTitle("Updated Title");
382         Fragment root = page.getRootFragment();
383         assertNotNull(root);
384         assertNotNull(root.getFragments());
385         assertEquals(1, root.getFragments().size());
386         String testId = ((Fragment)root.getFragments().get(0)).getId();
387         assertNotNull(page.removeFragmentById(testId));
388 
389         try
390         {
391             pageManager.updatePage(page);
392         }
393         catch (Exception e)
394         {
395             String errmsg = "Exception in page update: " + e.toString();
396             e.printStackTrace();
397             System.err.println(errmsg);
398             assertNotNull(errmsg, null);
399         }
400 
401         page = pageManager.getPage(this.testPage002);
402         assertTrue(page.getTitle().equals("Updated Title"));
403         root = page.getRootFragment();
404         assertNotNull(root);
405         assertNotNull(root.getFragments());
406         assertTrue(root.getFragments().isEmpty());
407     }
408 
409     public void testUpdateFolder() throws Exception
410     {
411         Folder folder = pageManager.getFolder(this.testFolder2);
412         folder.setTitle("Updated Title");
413 
414         try
415         {
416             pageManager.updateFolder(folder);
417         }
418         catch (Exception e)
419         {
420             String errmsg = "Exception in folder update: " + e.toString();
421             e.printStackTrace();
422             System.err.println(errmsg);
423             assertNotNull(errmsg, null);
424         }
425 
426         folder = pageManager.getFolder(this.testFolder2);
427         assertTrue(folder.getTitle().equals("Updated Title"));
428 
429         Page page = pageManager.newPage(this.testPage004);
430         page.setTitle("Folder Page");
431 
432         try
433         {
434             pageManager.updatePage(page);
435         }
436         catch (Exception e)
437         {
438             String errmsg = "Exception in page update: " + e.toString();
439             e.printStackTrace();
440             System.err.println(errmsg);
441             assertNotNull(errmsg, null);
442         }
443 
444         assertEquals(1, folder.getPages().size());
445         assertEquals(1, pageManager.getPages(folder).size());
446         assertNotNull(folder.getPages().get(this.testPage004));
447 
448         folder.setTitle("Updated Deep Title");
449         page.setTitle("Updated Deep Title");
450 
451         try
452         {
453             pageManager.updateFolder(folder, true);
454         }
455         catch (Exception e)
456         {
457             String errmsg = "Exception in deep folder update: " + e.toString();
458             e.printStackTrace();
459             System.err.println(errmsg);
460             assertNotNull(errmsg, null);
461         }
462 
463         folder = pageManager.getFolder(this.testFolder2);
464         assertTrue(folder.getTitle().equals("Updated Deep Title"));
465         page = pageManager.getPage(this.testPage004);
466         assertTrue(page.getTitle().equals("Updated Deep Title"));
467     }
468 
469     public void testUpdateLink() throws Exception
470     {
471         Link link = pageManager.getLink(this.testLink002);
472         link.setTitle("Updated Title");
473 
474         try
475         {
476             pageManager.updateLink(link);
477         }
478         catch (Exception e)
479         {
480             String errmsg = "Exception in link update: " + e.toString();
481             e.printStackTrace();
482             System.err.println(errmsg);
483             assertNotNull(errmsg, null);
484         }
485 
486         link = pageManager.getLink(this.testLink002);
487         assertTrue(link.getTitle().equals("Updated Title"));
488     }
489 
490     public void testGetFolders() throws Exception
491     {
492 
493         Folder subsites = pageManager.getFolder("/subsites");
494         assertNotNull(subsites);
495 
496         Iterator ssi = subsites.getFolders().iterator();
497         assertTrue(ssi.hasNext());
498         int count = 0;
499         while (ssi.hasNext())
500         {
501             Folder folder = (Folder)ssi.next();
502             System.out.println("folder = " + folder.getName());
503             count++;
504         }
505         assertEquals(4, count);
506     }
507     
508     public void testFolders() throws Exception
509     {
510 
511         Folder folder1 = pageManager.getFolder("/folder1");
512         assertNotNull(folder1);
513         assertTrue(folder1.getSkin().equals("test-skin"));
514         assertTrue(folder1.getEffectiveDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
515         assertTrue(folder1.getDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
516         assertTrue(folder1.getDefaultDecorator(Fragment.PORTLET).equals("test-portlet"));
517                 
518         assertEquals(2, folder1.getFolders().size());
519         assertEquals(2, pageManager.getFolders(folder1).size());
520         Iterator childItr = folder1.getFolders().iterator();
521         // Test that the folders are naturally orderd
522         Folder folder2 = (Folder) childItr.next();
523         assertEquals("/folder1/folder2", folder2.getPath());
524         assertEquals("folder2", folder2.getName());
525         Folder folder3 = (Folder) childItr.next();
526         assertEquals("/folder1/folder3", folder3.getPath());
527         assertEquals("test001.psml", folder3.getDefaultPage());
528         assertEquals(1, folder2.getPages().size());
529         assertEquals(2, folder3.getPages().size());
530         assertEquals(2, pageManager.getPages(folder3).size());
531 
532         // test folder decoration inheritance
533         Page page = (Page)folder3.getPages().get("test001.psml");
534         assertTrue(page.getEffectiveDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
535         assertTrue(page.getEffectiveDefaultDecorator(Fragment.PORTLET).equals("test-portlet"));
536         
537         // Check link order
538         assertEquals(6, folder3.getAll().size());
539         assertEquals(6, pageManager.getAll(folder3).size());
540         Iterator linkItr = folder3.getAll().iterator();
541         assertEquals("Jetspeed2Wiki.link", ((Link)linkItr.next()).getName());
542         assertEquals("Jetspeed2.link", ((Link)linkItr.next()).getName());        
543         assertEquals("apache_portals.link", ((Link)linkItr.next()).getName());
544         assertEquals("apache.link", ((Link)linkItr.next()).getName());
545         assertEquals("test001.psml", ((Page)linkItr.next()).getName());
546         assertEquals("default-page.psml", ((Page)linkItr.next()).getName());
547 
548         //Test FolderSet with both absolute and relative names
549         assertNotNull(folder1.getFolders().get("/folder1/folder2"));
550         assertNotNull(folder1.getFolders().get("folder2"));
551         assertEquals(folder1.getFolders().get("/folder1/folder2"), folder1.getFolders().get("folder2"));
552 
553         //Test PageSet with both absolute and relative names
554         assertNotNull(folder3.getPages().get("/folder1/folder3/test001.psml"));
555         assertNotNull(folder3.getPages().get("test001.psml"));
556         assertEquals("test001.psml", folder3.getPages().get("/folder1/folder3/test001.psml").getName());
557         
558         assertTrue(folder3.isHidden());
559         assertTrue(folder3.getPage("default-page.psml").isHidden());
560         assertTrue(folder3.getLinks().get("Jetspeed2.link").isHidden());
561         assertFalse(folder3.getLinks().get("apache.link").isHidden());
562         
563         assertNotNull(folder3.getAll().get("Jetspeed2.link"));
564         assertNull(folder3.getAll().exclusiveSubset("Jetspeed2//.link").get("Jetspeed2.link"));
565         assertNull(folder3.getAll().inclusiveSubset("apache//.link").get("Jetspeed2.link"));
566         assertNotNull(folder3.getAll().inclusiveSubset("apache//.link").get("apache.link"));
567     }
568 
569     public void testFolderMetaData() throws Exception
570     {
571         Folder folder1French = pageManager.getFolder("/folder1");        
572 
573         assertEquals("Titre francais pour la chemise 1", folder1French.getTitle(Locale.FRENCH));
574         assertEquals("Titre francais pour la chemise 1", folder1French.getTitle(Locale.FRANCE));
575 
576         Folder folder1English = pageManager.getFolder("/folder1");
577 
578         assertEquals("English Title for Folder 1", folder1English.getTitle(Locale.ENGLISH));
579 
580         // check that default works
581         Folder folder1German = pageManager.getFolder("/folder1");
582        
583         assertEquals("Default Title for Folder 1", folder1German.getTitle(Locale.GERMAN));
584         
585         // Test folder with no metadata assigned
586         Folder rootFolder = pageManager.getFolder("/");
587         assertEquals(rootFolder.getTitle(), rootFolder.getTitle(Locale.FRENCH));
588     }
589 
590     public void testDefaultTitles() throws Exception
591     {
592         Page defaultPage = pageManager.getPage("/folder1/folder2/default-page.psml");
593         assertNotNull(defaultPage);
594         assertEquals("Default Page", defaultPage.getTitle());
595 
596         Folder rootFolder = pageManager.getFolder("/");
597         assertEquals("Top", rootFolder.getTitle());
598     }
599 
600     public void testPageMetaData() throws Exception
601     {
602         Page page = pageManager.getPage("/default-page.psml");
603         assertNotNull(page);
604         String frenchTitle = page.getTitle(Locale.FRENCH);
605         assertNotNull(frenchTitle);
606         assertEquals("Ma Premiere Page de PSML", frenchTitle);
607         String japaneseTitle = page.getTitle(Locale.JAPANESE);
608         assertNotNull(japaneseTitle);
609         assertEquals("Jetspeed 2 \u3078\u3088\u3046\u3053\u305d", japaneseTitle);
610         String defaultTitle = page.getTitle(Locale.GERMAN);
611         assertNotNull(defaultTitle);
612         assertEquals("My First PSML Page", defaultTitle);
613     }
614 
615     public void testLinks() throws Exception
616     {
617         Link link = pageManager.getLink("/apache_portals.link");
618         assertNotNull(link);
619         assertEquals("http://portals.apache.org", link.getUrl());
620         assertEquals("Apache Portals Website", link.getTitle());
621         assertEquals("Apache Software Foundation [french]", link.getTitle(Locale.FRENCH));
622         assertEquals("test-skin", link.getSkin());
623 
624         Folder folder = pageManager.getFolder("/");
625         assertNotNull(folder);
626         assertNotNull(folder.getLinks());
627         assertEquals(2,folder.getLinks().size());
628         assertEquals(2,pageManager.getLinks(folder).size());
629         assertEquals("http://portals.apache.org", ((Document) folder.getLinks().get("/apache_portals.link")).getUrl());
630     }
631 
632     public void testMenuDefinitions() throws Exception
633     {
634         // test folder resident menu definitions
635         Folder folder = pageManager.getFolder("/");
636         assertNotNull(folder);
637         List menus = folder.getMenuDefinitions();
638         assertNotNull(menus);
639         assertEquals(5, menus.size());
640 
641         MenuDefinition simpleMenu = (MenuDefinition)menus.get(0);
642         assertNotNull(simpleMenu);
643         assertEquals("simple", simpleMenu.getName());
644         assertNotNull(simpleMenu.getMenuElements());
645         assertEquals(1, simpleMenu.getMenuElements().size());
646         assertTrue(simpleMenu.getMenuElements().get(0) instanceof MenuOptionsDefinition);
647         assertEquals("/test001.psml,/folder1/folder2", ((MenuOptionsDefinition)simpleMenu.getMenuElements().get(0)).getOptions());
648 
649         MenuDefinition top2LevelsMenu = (MenuDefinition)menus.get(1);
650         assertNotNull(top2LevelsMenu);
651         assertEquals("top-2-levels", top2LevelsMenu.getName());
652         assertNull(top2LevelsMenu.getMenuElements());
653         assertEquals("/", top2LevelsMenu.getOptions());
654         assertEquals(2, top2LevelsMenu.getDepth());
655         assertEquals("dhtml-pull-down", top2LevelsMenu.getSkin());
656 
657         MenuDefinition topRolePagesMenu = (MenuDefinition)menus.get(2);
658         assertNotNull(topRolePagesMenu);
659         assertEquals("top-role-pages", topRolePagesMenu.getName());
660         assertTrue(topRolePagesMenu.isRegexp());
661         assertEquals("roles", topRolePagesMenu.getProfile());
662         assertEquals("*.psml,*.link", topRolePagesMenu.getOrder());
663 
664         MenuDefinition breadCrumbsMenu = (MenuDefinition)menus.get(3);
665         assertNotNull(breadCrumbsMenu);
666         assertEquals("bread-crumbs", breadCrumbsMenu.getName());
667         assertTrue(breadCrumbsMenu.isPaths());
668 
669         MenuDefinition topCustomMenu = (MenuDefinition)menus.get(4);
670         assertNotNull(topCustomMenu);
671         assertEquals("top-custom", topCustomMenu.getName());
672         assertEquals("Top Menu", topCustomMenu.getTitle());
673         assertEquals("Top", topCustomMenu.getShortTitle());
674         assertEquals("Haut", topCustomMenu.getTitle(Locale.FRENCH));
675         assertEquals("H", topCustomMenu.getShortTitle(Locale.FRENCH));
676         assertNotNull(topCustomMenu.getMenuElements());
677         assertEquals(5, topCustomMenu.getMenuElements().size());
678         assertTrue(topCustomMenu.getMenuElements().get(0) instanceof MenuOptionsDefinition);
679         assertTrue(((MenuOptionsDefinition)topCustomMenu.getMenuElements().get(0)).isRegexp());
680         assertEquals("groups", ((MenuOptionsDefinition)topCustomMenu.getMenuElements().get(0)).getProfile());
681         assertTrue(topCustomMenu.getMenuElements().get(1) instanceof MenuDefinition);
682         assertTrue(topCustomMenu.getMenuElements().get(2) instanceof MenuExcludeDefinition);
683         assertEquals("top-role-pages", ((MenuExcludeDefinition)topCustomMenu.getMenuElements().get(2)).getName());
684         assertTrue(topCustomMenu.getMenuElements().get(3) instanceof MenuSeparatorDefinition);
685         assertEquals("More Top Pages", ((MenuSeparatorDefinition)topCustomMenu.getMenuElements().get(3)).getText());
686         assertTrue(topCustomMenu.getMenuElements().get(4) instanceof MenuIncludeDefinition);
687         assertEquals("simple", ((MenuIncludeDefinition)topCustomMenu.getMenuElements().get(4)).getName());
688         assertTrue(((MenuIncludeDefinition)topCustomMenu.getMenuElements().get(4)).isNest());
689 
690         MenuDefinition topCustomNestedMenu = (MenuDefinition)topCustomMenu.getMenuElements().get(1);
691         assertEquals("/", topCustomNestedMenu.getOptions());
692         assertEquals("page", topCustomNestedMenu.getProfile());
693         assertEquals(5, topCustomNestedMenu.getMenuElements().size());
694         assertTrue(topCustomNestedMenu.getMenuElements().get(0) instanceof MenuSeparatorDefinition);
695         assertEquals("Top Pages", ((MenuSeparatorDefinition)topCustomNestedMenu.getMenuElements().get(0)).getText());
696         assertEquals("Ye Olde Top Pages", ((MenuSeparatorDefinition)topCustomNestedMenu.getMenuElements().get(0)).getText(Locale.ENGLISH));
697         assertEquals("Select from Top Pages menu...", ((MenuSeparatorDefinition)topCustomNestedMenu.getMenuElements().get(0)).getTitle());
698         assertEquals("Haut", ((MenuSeparatorDefinition)topCustomNestedMenu.getMenuElements().get(0)).getTitle(Locale.FRENCH));
699         assertTrue(topCustomNestedMenu.getMenuElements().get(1) instanceof MenuOptionsDefinition);
700         assertTrue(topCustomNestedMenu.getMenuElements().get(2) instanceof MenuSeparatorDefinition);
701         assertEquals("bold", ((MenuSeparatorDefinition)topCustomNestedMenu.getMenuElements().get(2)).getSkin());
702         assertEquals("Custom Pages", ((MenuSeparatorDefinition)topCustomNestedMenu.getMenuElements().get(2)).getTitle());
703         assertTrue(topCustomNestedMenu.getMenuElements().get(3) instanceof MenuOptionsDefinition);
704         assertEquals(1, ((MenuOptionsDefinition)topCustomNestedMenu.getMenuElements().get(3)).getDepth());
705         assertEquals("*.psml", ((MenuOptionsDefinition)topCustomNestedMenu.getMenuElements().get(3)).getOrder());
706         assertTrue(topCustomNestedMenu.getMenuElements().get(4) instanceof MenuOptionsDefinition);
707         assertTrue(((MenuOptionsDefinition)topCustomNestedMenu.getMenuElements().get(4)).isPaths());
708         assertEquals("*", ((MenuOptionsDefinition)topCustomNestedMenu.getMenuElements().get(4)).getProfile());
709         assertEquals("links", ((MenuOptionsDefinition)topCustomNestedMenu.getMenuElements().get(4)).getSkin());
710         assertEquals("@", ((MenuOptionsDefinition)topCustomNestedMenu.getMenuElements().get(4)).getOptions());
711 
712         // test page resident menu definitions
713         Page page = pageManager.getPage("/test001.psml");
714         assertNotNull(page);
715         menus = page.getMenuDefinitions();
716         assertNotNull(menus);
717         assertEquals(1, menus.size());
718 
719         simpleMenu = (MenuDefinition)menus.get(0);
720         assertNotNull(simpleMenu);
721         assertEquals("simple", simpleMenu.getName());
722         assertNotNull(simpleMenu.getMenuElements());
723         assertEquals(2, simpleMenu.getMenuElements().size());
724 
725         // test writing page menu definitions
726         page = pageManager.getPage(this.testPage002);
727         page.setMenuDefinitions(new ArrayList());
728         MenuDefinition newMenu = page.newMenuDefinition();
729         newMenu.setName("updated-menu");
730         newMenu.setSkin("tabs");
731         newMenu.setMenuElements(new ArrayList());
732         MenuSeparatorDefinition newSeparator = page.newMenuSeparatorDefinition();
733         newSeparator.setText("-- Updated Menu --");
734         newMenu.getMenuElements().add(newSeparator);
735         MenuOptionsDefinition newOptions0 = page.newMenuOptionsDefinition();
736         newOptions0.setOptions("/*.psml");
737         newOptions0.setRegexp(true);
738         newMenu.getMenuElements().add(newOptions0);
739         MenuOptionsDefinition newOptions1 = page.newMenuOptionsDefinition();
740         newOptions1.setOptions("/folder0");
741         newMenu.getMenuElements().add(newOptions1);
742         MenuDefinition newNestedMenu = page.newMenuDefinition();
743         newNestedMenu.setOptions("/*/");
744         newNestedMenu.setRegexp(true);
745         newMenu.getMenuElements().add(newNestedMenu);
746         MenuExcludeDefinition newExcludeMenu = page.newMenuExcludeDefinition();
747         newExcludeMenu.setName("exclude-menu");
748         newMenu.getMenuElements().add(newExcludeMenu);
749         MenuIncludeDefinition newIncludeMenu = page.newMenuIncludeDefinition();
750         newIncludeMenu.setName("include-menu");
751         newIncludeMenu.setNest(true);
752         newMenu.getMenuElements().add(newIncludeMenu);
753         page.getMenuDefinitions().add(newMenu);
754         try
755         {
756             pageManager.updatePage(page);
757         }
758         catch (Exception e)
759         {
760             String errmsg = "Exception in page update: " + e.toString();
761             e.printStackTrace();
762             System.err.println(errmsg);
763             assertNotNull(errmsg, null);
764         }
765         page = pageManager.getPage(this.testPage002);
766         assertNotNull(page.getMenuDefinitions());
767         assertEquals(1, page.getMenuDefinitions().size());
768         assertNotNull(((MenuDefinition)page.getMenuDefinitions().get(0)).getMenuElements());
769         assertEquals(6,((MenuDefinition)page.getMenuDefinitions().get(0)).getMenuElements().size());
770         assertTrue(((MenuDefinition)page.getMenuDefinitions().get(0)).getMenuElements().get(0) instanceof MenuSeparatorDefinition);
771         assertTrue(((MenuDefinition)page.getMenuDefinitions().get(0)).getMenuElements().get(1) instanceof MenuOptionsDefinition);
772         assertTrue(((MenuDefinition)page.getMenuDefinitions().get(0)).getMenuElements().get(2) instanceof MenuOptionsDefinition);
773         assertTrue(((MenuDefinition)page.getMenuDefinitions().get(0)).getMenuElements().get(3) instanceof MenuDefinition);
774         assertTrue(((MenuDefinition)page.getMenuDefinitions().get(0)).getMenuElements().get(4) instanceof MenuExcludeDefinition);
775         assertTrue(((MenuDefinition)page.getMenuDefinitions().get(0)).getMenuElements().get(5) instanceof MenuIncludeDefinition);
776 
777         // test writing folder menu definitions
778         folder = pageManager.getFolder(this.testFolder2);
779         folder.setMenuDefinitions(new ArrayList());
780         newMenu = folder.newMenuDefinition();
781         newMenu.setName("updated-menu");
782         newMenu.setSkin("bread-crumbs");
783         newMenu.setOptions("./");
784         newMenu.setPaths(true);
785         folder.getMenuDefinitions().add(newMenu);
786         try
787         {
788             pageManager.updateFolder(folder);
789         }
790         catch (Exception e)
791         {
792             String errmsg = "Exception in folder update: " + e.toString();
793             e.printStackTrace();
794             System.err.println(errmsg);
795             assertNotNull(errmsg, null);
796         }
797         folder = pageManager.getFolder(this.testFolder2);
798         assertNotNull(folder.getMenuDefinitions());
799         assertEquals(1, folder.getMenuDefinitions().size());
800         assertEquals("updated-menu", ((MenuDefinition)folder.getMenuDefinitions().get(0)).getName());
801         assertEquals("bread-crumbs", ((MenuDefinition)folder.getMenuDefinitions().get(0)).getSkin());
802         assertEquals("./", ((MenuDefinition)folder.getMenuDefinitions().get(0)).getOptions());
803     }
804 
805     public void testRemovePage() throws Exception
806     {
807         Page page = pageManager.getPage(this.testPage002);
808 
809         try
810         {
811             pageManager.removePage(page);
812         }
813         catch (Exception e)
814         {
815             String errmsg = "Exception in page remove: " + e.toString();
816             e.printStackTrace();
817             System.err.println(errmsg);
818             assertNotNull(errmsg, null);
819         }
820 
821         boolean exceptionFound = false;
822         try
823         {
824             page = pageManager.getPage(this.testPage002);
825         }
826         catch (DocumentNotFoundException dnfe)
827         {
828             exceptionFound = true;
829         }
830         assertTrue(exceptionFound);
831     }
832 
833     public void testRemoveFolder() throws Exception
834     {
835         Folder folder = pageManager.getFolder(this.testFolder2);
836 
837         try
838         {
839             pageManager.removeFolder(folder);
840         }
841         catch (Exception e)
842         {
843             String errmsg = "Exception in folder remove: " + e.toString();
844             e.printStackTrace();
845             System.err.println(errmsg);
846             assertNotNull(errmsg, null);
847         }
848 
849         boolean exceptionFound = false;
850         try
851         {
852             folder = pageManager.getFolder(this.testFolder2);
853         }
854         catch (FolderNotFoundException fnfe)
855         {
856             exceptionFound = true;
857         }
858         assertTrue(exceptionFound);
859     }
860 
861     public void testRemoveLink() throws Exception
862     {
863         Link link = pageManager.getLink(this.testLink002);
864 
865         try
866         {
867             pageManager.removeLink(link);
868         }
869         catch (Exception e)
870         {
871             String errmsg = "Exception in link remove: " + e.toString();
872             e.printStackTrace();
873             System.err.println(errmsg);
874             assertNotNull(errmsg, null);
875         }
876 
877         boolean exceptionFound = false;
878         try
879         {
880             link = pageManager.getLink(this.testLink002);
881         }
882         catch (DocumentNotFoundException dnfe)
883         {
884             exceptionFound = true;
885         }
886         assertTrue(exceptionFound);
887     }
888     
889     public void testClonePage() throws Exception
890     {
891         Page testpage = pageManager.getPage("/clonetest.psml");
892         assertNotNull(testpage);
893         Page clone = pageManager.copyPage(testpage, "/cloned.psml");
894         assertNotNull(clone);
895         
896         assertTrue(clone.getId().equals("/cloned.psml"));
897         assertTrue(clone.getName().equals("cloned.psml"));
898         assertTrue(clone.getTitle().equals("Test Page"));
899         assertTrue(clone.getSkin().equals("test-skin"));
900         assertTrue(clone.getEffectiveDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
901         assertTrue(clone.getDefaultDecorator(Fragment.LAYOUT).equals("test-layout"));
902         assertTrue(clone.getDefaultDecorator(Fragment.PORTLET).equals("test-portlet"));
903 
904         // TODO: Test Meta data
905         Fragment root = testpage.getRootFragment();
906         Fragment cloneRoot = clone.getRootFragment();
907         
908         assertNotNull(cloneRoot);
909         assertNotNull(cloneRoot.getId());        
910         assertFalse(cloneRoot.getId().equals(root.getId()));
911         assertTrue(cloneRoot.getName().equals("TwoColumns"));
912         assertTrue(cloneRoot.getType().equals(Fragment.LAYOUT));
913         assertNull(cloneRoot.getDecorator());
914 
915         List children = root.getFragments();
916         List cloneChildren = cloneRoot.getFragments();
917         assertNotNull(cloneChildren);
918         assertTrue(cloneChildren.size() == 3);
919 
920         Fragment f = (Fragment) children.get(0);
921         Fragment cf = (Fragment) cloneChildren.get(0);
922         assertNotNull(cf.getId());
923         assertFalse(cf.getId().equals(f.getId()));
924         assertTrue(cf.getName().equals("HelloPortlet"));
925         assertTrue(cf.getType().equals(Fragment.PORTLET));
926 
927         Map properties = f.getProperties();
928         Map cloneProperties = cf.getProperties();
929 
930         assertNotNull(cloneProperties);
931         assertTrue(cloneProperties.size() == 2);
932         assertEquals("0", cf.getProperty(Fragment.ROW_PROPERTY_NAME));
933         assertEquals(0, cf.getIntProperty(Fragment.COLUMN_PROPERTY_NAME));
934 
935         cf = (Fragment) cloneChildren.get(1);
936         f = (Fragment) children.get(1);
937         assertNotNull(cf.getId());
938         assertFalse(cf.getId().equals(f.getId()));
939         assertTrue(cf.getName().equals("JMXPortlet"));
940         assertTrue(cf.getType().equals(Fragment.PORTLET));
941 
942         properties = cf.getProperties();
943         assertNotNull(properties);
944         assertTrue(properties.size() == 2);
945         assertEquals("0", cf.getProperty(Fragment.ROW_PROPERTY_NAME));
946         assertEquals(1, cf.getIntProperty(Fragment.COLUMN_PROPERTY_NAME));
947 
948         f = testpage.getFragmentById("f002");
949         cf = (Fragment) cloneChildren.get(2);
950         String id = cf.getId();
951         cf = clone.getFragmentById(id);
952         
953         assertNotNull(cf);        
954         assertNotNull(cf.getId());        
955         assertFalse(cf.getId().equals(f.getId()));
956         assertTrue(cf.getName().equals("Card"));
957         assertTrue(cf.getType().equals(Fragment.LAYOUT));
958         assertTrue(cf.getDecorator().equals("Tab"));
959         assertNotNull(cf.getFragments());
960         assertTrue(cf.getFragments().size() == 2);
961         
962         // security testing
963         SecurityConstraints constraints = clone.getSecurityConstraints();
964         assertNotNull(constraints); 
965         assertTrue(constraints.getOwner().equals("new-user"));
966         List secs = constraints.getSecurityConstraints();
967         assertNotNull(secs);
968         assertTrue(secs.size() == 1);
969         SecurityConstraint constraint = (SecurityConstraint)secs.get(0);
970         assertNotNull(constraint);
971         assertTrue(constraint.getUsers() != null);
972         assertTrue(constraint.getUsers().size() == 2);
973         assertTrue(Shared.makeCSVFromList(constraint.getUsers()).equals("user10,user11"));
974         assertTrue(constraint.getRoles() != null);
975         assertTrue(constraint.getRoles().size() == 1);
976         assertTrue(Shared.makeCSVFromList(constraint.getRoles()).equals("*"));
977         assertTrue(constraint.getPermissions() != null);
978         assertTrue(constraint.getPermissions().size() == 2);
979         assertTrue(Shared.makeCSVFromList(constraint.getPermissions()).equals("edit,view"));
980         List refs = constraints.getSecurityConstraintsRefs();
981         assertNotNull(refs);
982         assertTrue(refs.size() == 1);
983         String ref = (String)refs.get(0);
984         assertNotNull(ref);
985         assertTrue(ref.equals("public-view"));
986         
987         // TODO: menu testing
988     }
989     
990     public Collection collectIds(Folder f) throws Exception {
991         Collection result = new ArrayList();
992         
993         for (Iterator iter = f.getAll().iterator(); iter.hasNext();)
994         {
995            Object obj = iter.next();
996            
997            if (obj instanceof Page){
998                Page thisPage = (Page) obj;
999                if (thisPage.getRootFragment()!=null){
1000                    result.addAll(collectIds(thisPage.getRootFragment()));    
1001                }                          
1002            } else
1003            if (obj instanceof Folder){
1004                Folder thisFolder = (Folder)obj;
1005                result.addAll(collectIds((Folder)obj));
1006            }            
1007         }   
1008         
1009         return result;
1010     }
1011     
1012     public Collection collectIds(Fragment f){
1013     	Collection result = new ArrayList();
1014     	
1015         
1016     	result.add(f.getId());
1017     	if (f.getFragments().size() > 0){
1018     		for (Iterator iter = f.getFragments().iterator(); iter.hasNext();) {
1019 				Fragment child = (Fragment) iter.next();
1020 				result.addAll(collectIds(child));
1021 			}
1022     	}
1023     	return result;
1024     }
1025     
1026     private int countFragments(Fragment f){
1027         int result = 1;
1028         for (Iterator iter = f.getFragments().iterator(); iter.hasNext();)
1029         {
1030             result+=countFragments((Fragment)iter.next());
1031         }
1032         
1033         return result;
1034     }
1035     
1036     private void compareFolders(Folder folder1, Folder folder2) throws Exception {
1037         for (Iterator iter = folder1.getAll().iterator(); iter.hasNext();)
1038         {
1039            Object obj = iter.next();
1040            
1041            if (obj instanceof Page){
1042                Page thisPage = (Page) obj;
1043                Page otherPage = folder2.getPage(thisPage.getName());
1044                assertEquals(thisPage.getRootFragment()!=null,otherPage.getRootFragment() != null);
1045                if (thisPage.getRootFragment() != null){
1046                    Fragment thisRootFragment = thisPage.getRootFragment();
1047                    Fragment otherRootFragment = otherPage.getRootFragment();
1048                    assertEquals(thisRootFragment.getFragments().size(),otherRootFragment.getFragments().size());
1049                    assertEquals(countFragments(thisRootFragment),countFragments(otherRootFragment));
1050                }               
1051            } else
1052            if (obj instanceof Folder){
1053                Folder thisFolder = (Folder)obj;
1054                compareFolders(thisFolder, folder2.getFolder(thisFolder.getName())); 
1055            }
1056             
1057         }        
1058     }
1059     
1060     public void testIdGeneration() throws Exception{
1061         Folder webappIds = pageManager.getFolder("/webapp-ids");
1062         Folder webappNoIds = pageManager.getFolder("/webapp-no-ids");
1063         
1064         compareFolders(webappIds,webappNoIds);
1065         
1066         Collection allIds = collectIds(webappNoIds); 
1067         for (Iterator iter = allIds.iterator(); iter.hasNext();) {
1068 			String id = (String) iter.next();
1069 			assertNotNull(id);
1070 			assertEquals(true,id.length() > 0);
1071             if (CollectionUtils.cardinality(id, allIds) > 1){
1072                  System.out.println("Fragment with id "+id+" has duplicates");
1073             }
1074 			assertEquals(1, CollectionUtils.cardinality(id, allIds)); // uniqueness test			
1075 		}        
1076     }
1077    
1078 }