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  import java.util.ArrayList;
20  import java.util.Iterator;
21  import java.util.List;
22  import java.util.Locale;
23  import org.apache.jetspeed.components.util.DatasourceEnabledSpringTestCase;
24  import org.apache.jetspeed.om.common.GenericMetadata;
25  import org.apache.jetspeed.om.common.SecurityConstraint;
26  import org.apache.jetspeed.om.common.SecurityConstraints;
27  import org.apache.jetspeed.om.folder.Folder;
28  import org.apache.jetspeed.om.folder.FolderNotFoundException;
29  import org.apache.jetspeed.om.folder.MenuDefinition;
30  import org.apache.jetspeed.om.folder.MenuExcludeDefinition;
31  import org.apache.jetspeed.om.folder.MenuIncludeDefinition;
32  import org.apache.jetspeed.om.folder.MenuOptionsDefinition;
33  import org.apache.jetspeed.om.folder.MenuSeparatorDefinition;
34  import org.apache.jetspeed.om.page.Fragment;
35  import org.apache.jetspeed.om.page.Link;
36  import org.apache.jetspeed.om.page.Page;
37  import org.apache.jetspeed.om.page.PageSecurity;
38  import org.apache.jetspeed.om.page.SecurityConstraintsDef;
39  import org.apache.jetspeed.om.preference.FragmentPreference;
40  import org.apache.jetspeed.page.document.DocumentNotFoundException;
41  import org.apache.jetspeed.page.document.FailedToUpdateDocumentException;
42  import org.apache.jetspeed.page.document.Node;
43  
44  import org.springframework.context.support.ClassPathXmlApplicationContext;
45  
46  import junit.framework.Test;
47  import junit.framework.TestSuite;
48  
49  /***
50   * TestPageXmlPersistence
51   * 
52   * @author <a href="taylor@apache.org">David Sean Taylor</a>
53   * @version $Id: $
54   *          
55   */
56  public class TestDatabasePageManager extends DatasourceEnabledSpringTestCase implements PageManagerTestShared, PageManagerEventListener
57  {
58      private String deepFolderPath = "/__subsite-rootx/_user/userx/_role/rolex/_group/groupx/_mediatype/xhtml/_language/en/_country/us/_custom/customx";
59      private String deepPagePath = deepFolderPath + "/default-page.psml";
60  
61      private static ClassPathXmlApplicationContext context;
62      private static boolean lastTestRun;
63  
64      private static PageManager pageManager;
65  
66      private static int newNodeCount;
67      private static int updatedNodeCount;
68      private static int removedNodeCount;
69  
70      public static void main(String args[])
71      {
72          junit.awtui.TestRunner.main(new String[]
73          { TestDatabasePageManager.class.getName() });
74      }
75      
76      protected void setUp() throws Exception
77      {
78          // reuse context between test cases below
79          // that is normally configured if null in
80          // super class setUp() implementation
81          if (context == null)
82          {
83              // new context
84              super.setUp();
85              context = ctx;
86              lastTestRun = false;
87  
88              // lookup page manager in context and reset to initial state
89              pageManager = (PageManager)context.getBean("pageManager");
90              try
91              {
92                  Folder removeRootFolder = pageManager.getFolder("/");
93                  pageManager.removeFolder(removeRootFolder);
94                  pageManager.reset();
95              }
96              catch (FolderNotFoundException e)
97              {
98              }
99  
100             // setup page manager listener
101             pageManager.addListener(this);
102         }
103         else
104         {
105             // recycle context
106             ctx = context;
107             super.setUp();
108         }
109     }
110 
111     protected void tearDown() throws Exception
112     {
113         // save context for reuse
114         if (!lastTestRun)
115         {
116             ctx = null;
117         }
118         super.tearDown();
119     }
120     
121     public static Test suite()
122     {
123         // All methods starting with "test" will be executed in the test suite.
124         return new TestSuite(TestDatabasePageManager.class);
125     }
126     
127     protected String[] getConfigurations()
128     {
129         return new String[]
130         { "database-page-manager.xml", "transaction.xml" };
131     }
132 
133     /* (non-Javadoc)
134      * @see org.apache.jetspeed.page.PageManagerEventListener#newNode(org.apache.jetspeed.page.document.Node)
135      */
136     public void newNode(Node node)
137     {
138         newNodeCount++;
139     }
140 
141     /* (non-Javadoc)
142      * @see org.apache.jetspeed.page.PageManagerEventListener#newNode(org.apache.jetspeed.page.document.Node)
143      */
144     public void updatedNode(Node node)
145     {
146         updatedNodeCount++;
147     }
148 
149     /* (non-Javadoc)
150      * @see org.apache.jetspeed.page.PageManagerEventListener#newNode(org.apache.jetspeed.page.document.Node)
151      */
152     public void removedNode(Node node)
153     {
154         removedNodeCount++;
155     }
156 
157     public void testCreates() throws Exception
158     {
159         // reset page manager cache
160         pageManager.reset();
161 
162         // test document and folder creation
163         Folder folder = pageManager.newFolder("/");
164         assertEquals("Top", folder.getTitle());
165         folder.setTitle("Root Folder");
166         folder.setDefaultDecorator("jetspeed", Fragment.LAYOUT);
167         folder.setDefaultDecorator("gray-gradient", Fragment.PORTLET);
168         folder.setSkin("skin-1");
169         folder.setDefaultPage("default-page.psml");
170         folder.setShortTitle("Root");
171         GenericMetadata metadata = folder.getMetadata();
172         metadata.addField(Locale.FRENCH, "title", "[fr] Root Folder");
173         SecurityConstraints folderConstraints = pageManager.newSecurityConstraints();
174         folderConstraints.setOwner("admin");
175         List inlineFolderConstraints = new ArrayList(2);
176         SecurityConstraint folderConstraint = pageManager.newFolderSecurityConstraint();
177         folderConstraint.setUsers(Shared.makeListFromCSV("user,admin"));
178         folderConstraint.setRoles(Shared.makeListFromCSV("manager"));
179         folderConstraint.setGroups(Shared.makeListFromCSV("*"));
180         folderConstraint.setPermissions(Shared.makeListFromCSV("view,edit"));
181         inlineFolderConstraints.add(folderConstraint);
182         folderConstraint = folder.newSecurityConstraint();
183         folderConstraint.setPermissions(Shared.makeListFromCSV("edit"));
184         inlineFolderConstraints.add(folderConstraint);
185         folderConstraints.setSecurityConstraints(inlineFolderConstraints);
186         List folderConstraintsRefs = new ArrayList(2);
187         folderConstraintsRefs.add("public-view");
188         folderConstraintsRefs.add("public-edit");
189         folderConstraints.setSecurityConstraintsRefs(folderConstraintsRefs);
190         folder.setSecurityConstraints(folderConstraints);
191         List documentOrder = new ArrayList(2);
192         documentOrder.add("some-other-page.psml");
193         documentOrder.add("default-page.psml");
194         folder.setDocumentOrder(documentOrder);
195         MenuDefinition newMenu = folder.newMenuDefinition();
196         newMenu.setName("folder-menu");
197         newMenu.setTitle("The Test Folder Menu");
198         newMenu.setShortTitle("Folder Menu");
199         newMenu.setProfile("group-fallback");
200         metadata = newMenu.getMetadata();
201         metadata.addField(Locale.FRENCH, "short-title", "[fr] Folder Menu");
202         metadata.addField(Locale.FRENCH, "title", "[fr] The Test Folder Menu");
203         MenuSeparatorDefinition newSeparator = folder.newMenuSeparatorDefinition();
204         newSeparator.setText("-- Folder Menu --");
205         newSeparator.setTitle("Rollover: Folder Menu");
206         newSeparator.setSkin("header");
207         metadata = newSeparator.getMetadata();
208         metadata.addField(Locale.FRENCH, "text", "-- [fr] Folder Menu --");
209         metadata.addField(Locale.FRENCH, "title", "[fr] Rollover: Folder Menu");
210         newMenu.getMenuElements().add(newSeparator);
211         MenuOptionsDefinition newOptions0 = folder.newMenuOptionsDefinition();
212         newOptions0.setOptions("/*.psml");
213         newOptions0.setRegexp(true);
214         newOptions0.setSkin("flash");
215         newMenu.getMenuElements().add(newOptions0);
216         MenuOptionsDefinition newOptions1 = folder.newMenuOptionsDefinition();
217         newOptions1.setOptions("/folder0");
218         newOptions1.setProfile("role-fallback");
219         newOptions1.setOrder("/folder*");
220         newOptions1.setDepth(1);
221         newOptions1.setPaths(true);
222         newMenu.getMenuElements().add(newOptions1);
223         MenuDefinition newNestedMenu = folder.newMenuDefinition();
224         newNestedMenu.setOptions("/*/");
225         newNestedMenu.setRegexp(true);
226         newNestedMenu.setDepth(2);
227         newNestedMenu.setOrder("/x*/,/y*/,/z*/");
228         newNestedMenu.setSkin("bold");
229         newMenu.getMenuElements().add(newNestedMenu);
230         MenuExcludeDefinition newExcludeMenu = folder.newMenuExcludeDefinition();
231         newExcludeMenu.setName("exclude-menu");
232         newMenu.getMenuElements().add(newExcludeMenu);
233         MenuIncludeDefinition newIncludeMenu = folder.newMenuIncludeDefinition();
234         newIncludeMenu.setName("include-menu");
235         newIncludeMenu.setNest(true);
236         newMenu.getMenuElements().add(newIncludeMenu);
237         folder.getMenuDefinitions().add(newMenu);
238         newMenu = folder.newMenuDefinition();
239         newMenu.setName("folder-breadcrumb-menu");
240         newMenu.setSkin("bread-crumbs");
241         newMenu.setOptions("./");
242         newMenu.setPaths(true);
243         folder.getMenuDefinitions().add(newMenu);
244         pageManager.updateFolder(folder);
245         
246         assertNull(folder.getParent());
247 
248         Page page = pageManager.newPage("/default-page.psml");
249         assertEquals("Default Page", page.getTitle());
250         page.setTitle("Default Page");
251         page.setVersion("6.89");
252         page.setDefaultDecorator("tigris", Fragment.LAYOUT);
253         page.setDefaultDecorator("blue-gradient", Fragment.PORTLET);
254         page.setSkin("skin-1");
255         page.setShortTitle("Default");
256         metadata = page.getMetadata();
257         metadata.addField(Locale.FRENCH, "title", "[fr] Default Page");
258         metadata.addField(Locale.JAPANESE, "title", "[ja] Default Page");
259         SecurityConstraints pageConstraints = page.newSecurityConstraints();
260         pageConstraints.setOwner("user");
261         List inlinePageConstraints = new ArrayList(1);
262         SecurityConstraint pageConstraint = page.newSecurityConstraint();
263         pageConstraint.setUsers(Shared.makeListFromCSV("jetspeed"));
264         pageConstraint.setPermissions(Shared.makeListFromCSV("edit"));
265         inlinePageConstraints.add(pageConstraint);
266         pageConstraints.setSecurityConstraints(inlinePageConstraints);
267         List pageConstraintsRefs = new ArrayList(1);
268         pageConstraintsRefs.add("manager-edit");
269         pageConstraints.setSecurityConstraintsRefs(pageConstraintsRefs);
270         page.setSecurityConstraints(pageConstraints);
271         List pageMenus = new ArrayList();
272         newMenu = page.newMenuDefinition();
273         newMenu.setName("page-menu-1");
274         newMenu.setTitle("The Test Page Menu");
275         metadata = newMenu.getMetadata();
276         metadata.addField(Locale.FRENCH, "title", "[fr] The Test Page Menu");
277         newSeparator = page.newMenuSeparatorDefinition();
278         newSeparator.setText("-- Page Menu --");
279         List menuElements = new ArrayList();
280         menuElements.add(newSeparator);
281         newOptions0 = page.newMenuOptionsDefinition();
282         newOptions0.setOptions("/*.psml");
283         menuElements.add(newOptions0);
284         newNestedMenu = page.newMenuDefinition();
285         newNestedMenu.setOptions("/*/");
286         menuElements.add(newNestedMenu);
287         newExcludeMenu = page.newMenuExcludeDefinition();
288         newExcludeMenu.setName("exclude-menu");
289         menuElements.add(newExcludeMenu);
290         newIncludeMenu = page.newMenuIncludeDefinition();
291         newIncludeMenu.setName("include-menu");
292         menuElements.add(newIncludeMenu);
293         newMenu.setMenuElements(menuElements);
294         pageMenus.add(newMenu);
295         newMenu = page.newMenuDefinition();
296         newMenu.setName("page-menu-2");
297         newMenu.setOptions("./");
298         pageMenus.add(newMenu);
299         page.setMenuDefinitions(pageMenus);
300 
301         Fragment root = page.getRootFragment();
302         root.setDecorator("blue-gradient");
303         root.setName("jetspeed-layouts::VelocityTwoColumns");
304         root.setShortTitle("Root");
305         root.setTitle("Root Fragment");
306         root.setState("Normal");
307         root.setLayoutSizes("50%,50%");
308         root.getProperties().put("custom-prop1", "custom-prop-value1");
309         root.getProperties().put("custom-prop2", "custom-prop-value2");
310         
311         Fragment portlet = pageManager.newPortletFragment();
312         portlet.setName("security::LoginPortlet");
313         portlet.setShortTitle("Portlet");
314         portlet.setTitle("Portlet Fragment");
315         portlet.setState("Normal");
316         portlet.setLayoutRow(88);
317         portlet.setLayoutColumn(99);
318         portlet.setLayoutX(12.34F);
319         portlet.setLayoutY(23.45F);
320         portlet.setLayoutZ(34.56F);
321         portlet.setLayoutWidth(45.67F);
322         portlet.setLayoutHeight(56.78F);
323         List preferences = new ArrayList(2);
324         FragmentPreference preference = pageManager.newFragmentPreference();
325         preference.setName("pref0");
326         preference.setReadOnly(true);
327         List preferenceValues = new ArrayList(2);
328         preferenceValues.add("pref0-value0");
329         preferenceValues.add("pref0-value1");
330         preference.setValueList(preferenceValues);
331         preferences.add(preference);
332         preference = pageManager.newFragmentPreference();
333         preference.setName("pref1");
334         preferenceValues = new ArrayList(1);
335         preferenceValues.add("pref1-value");
336         preference.setValueList(preferenceValues);
337         preferences.add(preference);
338         portlet.setPreferences(preferences);
339         root.getFragments().add(portlet);
340         portlet = pageManager.newPortletFragment();
341         portlet.setName("some-app::SomePortlet");
342         portlet.setShortTitle("Some Portlet");
343         portlet.setTitle("Some Portlet Fragment");
344         portlet.setState("Normal");
345         portlet.setLayoutRow(22);
346         portlet.setLayoutColumn(11);
347         portlet.setLayoutX(11.11F);
348         portlet.setLayoutY(22.22F);
349         portlet.setLayoutZ(33.33F);
350         portlet.setLayoutWidth(44.44F);
351         portlet.setLayoutHeight(55.55F);
352         SecurityConstraints fragmentConstraints = portlet.newSecurityConstraints();
353         fragmentConstraints.setOwner("user");
354         portlet.setSecurityConstraints(fragmentConstraints);
355         root.getFragments().add(portlet);
356 
357         pageManager.updatePage(page);
358 
359         assertNotNull(page.getParent());
360         assertEquals(page.getParent().getId(), folder.getId());
361         assertNotNull(folder.getPages());
362         assertEquals(1, folder.getPages().size());
363         assertNotNull(pageManager.getPages(folder));
364         assertEquals(1, pageManager.getPages(folder).size());
365 
366         page = pageManager.newPage("/another-page.psml");
367         assertEquals("Another Page", page.getTitle());
368         page.setTitle("Another Page");
369         pageManager.updatePage(page);
370         assertNotNull(page.getParent());
371         assertEquals(page.getParent().getId(), folder.getId());
372         page = pageManager.newPage("/some-other-page.psml");
373         assertEquals("Some Other Page", page.getTitle());
374         page.setTitle("Some Other Page");
375         pageManager.updatePage(page);
376         assertNotNull(page.getParent());
377         assertEquals(page.getParent().getId(), folder.getId());
378         assertEquals(3, folder.getPages().size());
379         assertEquals(3, pageManager.getPages(folder).size());
380 
381         Link link = pageManager.newLink("/default.link");
382         assertEquals("Default", link.getTitle());
383         link.setTitle("Default Link");
384         link.setVersion("1.23");
385         link.setShortTitle("Default");
386         link.setTarget("top");
387         link.setUrl("http://www.default.org/");
388         metadata = link.getMetadata();
389         metadata.addField(Locale.FRENCH, "title", "[fr] Default Link");
390         metadata.addField(Locale.GERMAN, "title", "[de] Default Link");
391         SecurityConstraints linkConstraints = link.newSecurityConstraints();
392         linkConstraints.setOwner("user");
393         List inlineLinkConstraints = new ArrayList(1);
394         SecurityConstraint linkConstraint = link.newSecurityConstraint();
395         linkConstraint.setUsers(Shared.makeListFromCSV("jetspeed"));
396         linkConstraint.setPermissions(Shared.makeListFromCSV("edit"));
397         inlineLinkConstraints.add(linkConstraint);
398         linkConstraints.setSecurityConstraints(inlineLinkConstraints);
399         List linkConstraintsRefs = new ArrayList(1);
400         linkConstraintsRefs.add("manager-edit");
401         linkConstraints.setSecurityConstraintsRefs(linkConstraintsRefs);
402         link.setSecurityConstraints(linkConstraints);
403 
404         pageManager.updateLink(link);
405 
406         assertNotNull(link.getParent());
407         assertEquals(link.getParent().getId(), folder.getId());
408         assertNotNull(folder.getLinks());
409         assertEquals(1, folder.getLinks().size());
410         assertNotNull(pageManager.getLinks(folder));
411         assertEquals(1, pageManager.getLinks(folder).size());
412 
413         PageSecurity pageSecurity = pageManager.newPageSecurity();
414         List constraintsDefs = new ArrayList(2);
415         SecurityConstraintsDef constraintsDef = pageManager.newSecurityConstraintsDef();
416         constraintsDef.setName("public-view");
417         List defConstraints = new ArrayList(1);
418         SecurityConstraint defConstraint = pageSecurity.newSecurityConstraint();
419         defConstraint.setUsers(Shared.makeListFromCSV("*"));
420         defConstraint.setPermissions(Shared.makeListFromCSV("view"));
421         defConstraints.add(defConstraint);
422         constraintsDef.setSecurityConstraints(defConstraints);
423         constraintsDefs.add(constraintsDef);
424         constraintsDef = pageSecurity.newSecurityConstraintsDef();
425         constraintsDef.setName("admin-all");
426         defConstraints = new ArrayList(2);
427         defConstraint = pageSecurity.newSecurityConstraint();
428         defConstraint.setRoles(Shared.makeListFromCSV("admin"));
429         defConstraint.setPermissions(Shared.makeListFromCSV("view,edit"));
430         defConstraints.add(defConstraint);
431         defConstraint = pageSecurity.newSecurityConstraint();
432         defConstraint.setRoles(Shared.makeListFromCSV("nobody"));
433         defConstraints.add(defConstraint);
434         constraintsDef.setSecurityConstraints(defConstraints);
435         constraintsDefs.add(constraintsDef);
436         pageSecurity.setSecurityConstraintsDefs(constraintsDefs);
437         List globalConstraintsRefs = new ArrayList(2);
438         globalConstraintsRefs.add("admin-all");
439         globalConstraintsRefs.add("public-view");
440         pageSecurity.setGlobalSecurityConstraintsRefs(globalConstraintsRefs);
441 
442         pageManager.updatePageSecurity(pageSecurity);
443 
444         assertNotNull(pageSecurity.getParent());
445         assertEquals(pageSecurity.getParent().getId(), folder.getId());
446         assertNotNull(folder.getPageSecurity());
447 
448         // test duplicate creates
449         try
450         {
451             Folder dupFolder = pageManager.newFolder("/");
452             pageManager.updateFolder(dupFolder);
453             assertTrue("Duplicate Folder / CREATED", false);
454         }
455         catch (FolderNotUpdatedException e)
456         {
457         }
458         try
459         {
460             Page dupPage = pageManager.newPage("/default-page.psml");
461             pageManager.updatePage(dupPage);
462             assertTrue("Duplicate Page / CREATED", false);
463         }
464         catch (PageNotUpdatedException e)
465         {
466         }
467         try
468         {
469             Link dupLink = pageManager.newLink("/default.link");
470             pageManager.updateLink(dupLink);
471             assertTrue("Duplicate Link / CREATED", false);
472         }
473         catch (FailedToUpdateDocumentException e)
474         {
475         }
476         try
477         {
478             PageSecurity dupPageSecurity = pageManager.newPageSecurity();
479             pageManager.updatePageSecurity(dupPageSecurity);
480             assertTrue("Duplicate PageSecurity / CREATED", false);
481         }
482         catch (FailedToUpdateDocumentException e)
483         {
484         }
485 
486         // test folder/page creation with attributes on deep path
487         Folder deepFolder = null;
488         int pathIndex = deepFolderPath.indexOf('/', 1);
489         while ((pathIndex != -1) && (pathIndex <= deepFolderPath.length()))
490         {
491             deepFolder = pageManager.newFolder(deepFolderPath.substring(0, pathIndex));
492             pageManager.updateFolder(deepFolder);
493             assertNotNull(deepFolder.getParent());
494             assertNotNull(((Folder)deepFolder.getParent()).getFolders());
495             assertEquals(1, ((Folder)deepFolder.getParent()).getFolders().size());
496             assertNotNull(pageManager.getFolders((Folder)deepFolder.getParent()));
497             assertEquals(1, pageManager.getFolders((Folder)deepFolder.getParent()).size());
498             if (pathIndex < deepFolderPath.length())
499             {
500                 pathIndex = deepFolderPath.indexOf('/', pathIndex+1);
501                 if (pathIndex == -1)
502                 {
503                     pathIndex = deepFolderPath.length();
504                 }
505             }
506             else
507             {
508                 pathIndex = -1;
509             }
510         }
511         Page deepPage = pageManager.newPage(deepPagePath);
512         pageManager.updatePage(deepPage);
513         assertNotNull(deepPage.getParent());
514         assertEquals(deepPage.getParent().getId(), deepFolder.getId());
515 
516         // test folder nodesets
517         assertNotNull(folder.getFolders());
518         assertEquals(1, folder.getFolders().size());
519         assertNotNull(pageManager.getFolders(folder));
520         assertEquals(1, pageManager.getFolders(folder).size());
521         assertNotNull(folder.getAll());
522         assertEquals(6, folder.getAll().size());
523         assertNotNull(pageManager.getAll(folder));
524         assertEquals(6, pageManager.getAll(folder).size());
525         Iterator all = folder.getAll().iterator();
526         assertEquals("some-other-page.psml", ((Node)all.next()).getName());
527         assertEquals("default-page.psml", ((Node)all.next()).getName());
528         assertEquals("__subsite-rootx", ((Node)all.next()).getName());
529         assertEquals("another-page.psml", ((Node)all.next()).getName());
530         assertEquals("default.link", ((Node)all.next()).getName());
531         assertEquals("page.security", ((Node)all.next()).getName());
532         assertNotNull(folder.getAll().subset(Page.DOCUMENT_TYPE));
533         assertEquals(3, folder.getAll().subset(Page.DOCUMENT_TYPE).size());
534         assertNotNull(folder.getAll().inclusiveSubset(".*other.*"));
535         assertEquals(2, folder.getAll().inclusiveSubset(".*other.*").size());
536         assertNotNull(folder.getAll().inclusiveSubset("nomatch"));
537         assertEquals(0, folder.getAll().inclusiveSubset("nomatch").size());
538         assertNotNull(folder.getAll().exclusiveSubset(".*-page.psml"));
539         assertEquals(3, folder.getAll().exclusiveSubset(".*-page.psml").size());
540     }
541 
542     public void testGets() throws Exception
543     {
544         // reset page manager cache
545         pageManager.reset();
546         
547         // read documents and folders from persisted store
548         try
549         {
550             PageSecurity check = pageManager.getPageSecurity();
551             assertEquals("/page.security", check.getPath());
552             assertEquals("page.security", check.getName());
553             assertEquals("/page.security", check.getUrl());
554             assertNotNull(check.getSecurityConstraintsDefs());
555             assertEquals(2, check.getSecurityConstraintsDefs().size());
556             assertEquals("admin-all", ((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(0)).getName());
557             assertNotNull(((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(0)).getSecurityConstraints());
558             assertEquals(2, ((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(0)).getSecurityConstraints().size());
559             assertEquals("view,edit", Shared.makeCSVFromList(((SecurityConstraint)((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(0)).getSecurityConstraints().get(0)).getPermissions()));
560             assertEquals("public-view", ((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(1)).getName());
561             assertNotNull(((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(1)).getSecurityConstraints());
562             assertEquals(1, ((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(1)).getSecurityConstraints().size());
563             assertEquals("*", Shared.makeCSVFromList(((SecurityConstraint)((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(1)).getSecurityConstraints().get(0)).getUsers()));
564             assertEquals("view", Shared.makeCSVFromList(((SecurityConstraint)((SecurityConstraintsDef)check.getSecurityConstraintsDefs().get(1)).getSecurityConstraints().get(0)).getPermissions()));
565             assertNotNull(check.getGlobalSecurityConstraintsRefs());
566             assertEquals(2, check.getGlobalSecurityConstraintsRefs().size());
567             assertEquals("admin-all", (String)check.getGlobalSecurityConstraintsRefs().get(0));
568             assertEquals("public-view", (String)check.getGlobalSecurityConstraintsRefs().get(1));
569             assertNotNull(check.getParent());
570         }
571         catch (DocumentNotFoundException e)
572         {
573             assertTrue("PageSecurity NOT FOUND", false);
574         }
575         try
576         {
577             Link check = pageManager.getLink("/default.link");
578             assertEquals("/default.link", check.getPath());
579             assertEquals("default.link", check.getName());
580             assertEquals("Default Link", check.getTitle());
581             assertEquals("1.23", check.getVersion());            
582             assertEquals("Default", check.getShortTitle());
583             assertEquals("top", check.getTarget());
584             assertEquals("http://www.default.org/", check.getUrl());
585             assertNotNull(check.getMetadata());
586             assertEquals("[fr] Default Link", check.getTitle(Locale.FRENCH));
587             assertEquals("[de] Default Link", check.getTitle(Locale.GERMAN));
588             assertNotNull(check.getSecurityConstraints());
589             assertEquals("user", check.getSecurityConstraints().getOwner());
590             assertNotNull(check.getSecurityConstraints().getSecurityConstraintsRefs());
591             assertEquals(1, check.getSecurityConstraints().getSecurityConstraintsRefs().size());
592             assertEquals("manager-edit", (String)check.getSecurityConstraints().getSecurityConstraintsRefs().get(0));
593             assertNotNull(check.getSecurityConstraints().getSecurityConstraints());
594             assertEquals(1, check.getSecurityConstraints().getSecurityConstraints().size());
595             assertEquals("jetspeed", Shared.makeCSVFromList(((SecurityConstraint)check.getSecurityConstraints().getSecurityConstraints().get(0)).getUsers()));
596             assertNotNull(check.getParent());
597         }
598         catch (PageNotFoundException e)
599         {
600             assertTrue("Link /default.link NOT FOUND", false);
601         }
602         try
603         {
604             Page check = pageManager.getPage("/default-page.psml");
605             assertEquals("/default-page.psml", check.getPath());
606             assertEquals("default-page.psml", check.getName());
607             assertEquals("/default-page.psml", check.getUrl());
608             assertEquals("Default Page", check.getTitle());
609             assertEquals("6.89", check.getVersion());            
610             assertEquals("tigris", check.getEffectiveDefaultDecorator(Fragment.LAYOUT));
611             assertEquals("tigris", check.getDefaultDecorator(Fragment.LAYOUT));
612             assertEquals("blue-gradient", check.getDefaultDecorator(Fragment.PORTLET));
613             assertEquals("skin-1", check.getSkin());
614             assertEquals("Default", check.getShortTitle());
615             assertNotNull(check.getMetadata());
616             assertEquals("[fr] Default Page", check.getTitle(Locale.FRENCH));
617             assertEquals("[ja] Default Page", check.getTitle(Locale.JAPANESE));
618             assertNotNull(check.getSecurityConstraints());
619             assertEquals("user", check.getSecurityConstraints().getOwner());
620             assertNotNull(check.getSecurityConstraints().getSecurityConstraintsRefs());
621             assertEquals(1, check.getSecurityConstraints().getSecurityConstraintsRefs().size());
622             assertEquals("manager-edit", (String)check.getSecurityConstraints().getSecurityConstraintsRefs().get(0));
623             assertNotNull(check.getSecurityConstraints().getSecurityConstraints());
624             assertEquals(1, check.getSecurityConstraints().getSecurityConstraints().size());
625             assertEquals("jetspeed", Shared.makeCSVFromList(((SecurityConstraint)check.getSecurityConstraints().getSecurityConstraints().get(0)).getUsers()));
626             assertNotNull(check.getMenuDefinitions());
627             assertEquals(2, check.getMenuDefinitions().size());
628             MenuDefinition checkMenu = (MenuDefinition)check.getMenuDefinitions().get(0);
629             assertEquals("page-menu-1", checkMenu.getName());
630             assertEquals("The Test Page Menu", checkMenu.getTitle());
631             assertEquals("[fr] The Test Page Menu", checkMenu.getTitle(Locale.FRENCH));
632             assertNotNull(checkMenu.getMenuElements());
633             assertEquals(5,checkMenu.getMenuElements().size());
634             assertTrue(checkMenu.getMenuElements().get(0) instanceof MenuSeparatorDefinition);
635             assertEquals("-- Page Menu --", ((MenuSeparatorDefinition)checkMenu.getMenuElements().get(0)).getText());
636             assertTrue(checkMenu.getMenuElements().get(1) instanceof MenuOptionsDefinition);
637             assertEquals("/*.psml", ((MenuOptionsDefinition)checkMenu.getMenuElements().get(1)).getOptions());
638             assertTrue(checkMenu.getMenuElements().get(2) instanceof MenuDefinition);
639             assertEquals("/*/", ((MenuDefinition)checkMenu.getMenuElements().get(2)).getOptions());
640             assertNotNull(((MenuDefinition)checkMenu.getMenuElements().get(2)).getMenuElements());
641             assertTrue(((MenuDefinition)checkMenu.getMenuElements().get(2)).getMenuElements().isEmpty());
642             assertTrue(checkMenu.getMenuElements().get(3) instanceof MenuExcludeDefinition);
643             assertEquals("exclude-menu", ((MenuExcludeDefinition)checkMenu.getMenuElements().get(3)).getName());
644             assertTrue(checkMenu.getMenuElements().get(4) instanceof MenuIncludeDefinition);
645             assertEquals("include-menu", ((MenuIncludeDefinition)checkMenu.getMenuElements().get(4)).getName());
646             checkMenu = (MenuDefinition)check.getMenuDefinitions().get(1);
647             assertEquals("page-menu-2", checkMenu.getName());
648             assertNotNull(checkMenu.getMenuElements());
649             assertTrue(checkMenu.getMenuElements().isEmpty());
650             assertNotNull(check.getRootFragment());
651             assertEquals("blue-gradient", check.getRootFragment().getDecorator());
652             assertEquals("jetspeed-layouts::VelocityTwoColumns", check.getRootFragment().getName());
653             assertEquals("Root", check.getRootFragment().getShortTitle());
654             assertEquals("Root Fragment", check.getRootFragment().getTitle());
655             assertEquals("Normal", check.getRootFragment().getState());
656             assertEquals("50%,50%", check.getRootFragment().getLayoutSizes());
657             assertNotNull(check.getRootFragment().getProperties());
658             assertEquals("custom-prop-value1", check.getRootFragment().getProperty("custom-prop1"));
659             assertNotNull(check.getRootFragment().getFragments());
660             assertEquals(2, check.getRootFragment().getFragments().size());
661             Fragment check0 = (Fragment)check.getRootFragment().getFragments().get(0);
662             assertEquals("security::LoginPortlet", check0.getName());
663             assertEquals("Portlet", check0.getShortTitle());
664             assertEquals("Portlet Fragment", check0.getTitle());
665             assertEquals("Normal", check0.getState());
666             assertEquals(88, check0.getLayoutRow());
667             assertEquals(88, check0.getIntProperty(Fragment.ROW_PROPERTY_NAME));
668             assertEquals(99, check0.getLayoutColumn());
669             assertNotNull(check0.getProperty(Fragment.X_PROPERTY_NAME));
670             assertTrue(check0.getProperty(Fragment.X_PROPERTY_NAME).startsWith("12.3"));
671             assertTrue((check0.getLayoutX() > 12.0F) && (check0.getLayoutX() < 13.0F));
672             assertTrue((check0.getFloatProperty(Fragment.X_PROPERTY_NAME) > 12.0F) &&
673                        (check0.getFloatProperty(Fragment.X_PROPERTY_NAME) < 13.0F));
674             assertTrue((check0.getLayoutY() > 23.0F) && (check0.getLayoutY() < 24.0F));
675             assertTrue((check0.getLayoutZ() > 34.0F) && (check0.getLayoutZ() < 35.0F));
676             assertTrue((check0.getLayoutWidth() > 45.0F) && (check0.getLayoutWidth() < 46.0F));
677             assertTrue((check0.getLayoutHeight() > 56.0F) && (check0.getLayoutWidth() < 57.0F));
678             assertNotNull(check0.getPreferences());
679             assertEquals(2, check0.getPreferences().size());
680             assertEquals("pref0", ((FragmentPreference)check0.getPreferences().get(0)).getName());
681             assertTrue(((FragmentPreference)check0.getPreferences().get(0)).isReadOnly());
682             assertNotNull(((FragmentPreference)check0.getPreferences().get(0)).getValueList());
683             assertEquals(2, ((FragmentPreference)check0.getPreferences().get(0)).getValueList().size());
684             assertEquals("pref0-value0", (String)((FragmentPreference)check0.getPreferences().get(0)).getValueList().get(0));
685             assertEquals("pref0-value1", (String)((FragmentPreference)check0.getPreferences().get(0)).getValueList().get(1));
686             assertEquals("pref1", ((FragmentPreference)check0.getPreferences().get(1)).getName());
687             assertFalse(((FragmentPreference)check0.getPreferences().get(1)).isReadOnly());
688             assertNotNull(((FragmentPreference)check0.getPreferences().get(1)).getValueList());
689             assertEquals(1, ((FragmentPreference)check0.getPreferences().get(1)).getValueList().size());
690             assertEquals("pref1-value", (String)((FragmentPreference)check0.getPreferences().get(1)).getValueList().get(0));
691             Fragment check1 = (Fragment)check.getRootFragment().getFragments().get(1);
692             assertEquals("some-app::SomePortlet", check1.getName());
693             assertEquals("Some Portlet", check1.getShortTitle());
694             assertEquals("Some Portlet Fragment", check1.getTitle());
695             assertEquals("Normal", check1.getState());
696             assertEquals(22, check1.getLayoutRow());
697             assertEquals(11, check1.getLayoutColumn());
698             assertTrue((check1.getLayoutX() > 11.0F) && (check1.getLayoutX() < 12.0F));
699             assertTrue((check1.getLayoutY() > 22.0F) && (check1.getLayoutY() < 23.0F));
700             assertTrue((check1.getLayoutZ() > 33.0F) && (check1.getLayoutZ() < 34.0F));
701             assertTrue((check1.getLayoutWidth() > 44.0F) && (check1.getLayoutWidth() < 45.0F));
702             assertTrue((check1.getLayoutHeight() > 55.0F) && (check1.getLayoutWidth() < 56.0F));
703             assertNotNull(check1.getSecurityConstraints());
704             assertEquals("user", check1.getSecurityConstraints().getOwner());
705             assertNotNull(check.getFragmentById(check0.getId()));
706             assertNotNull(check.getFragmentsByName("some-app::SomePortlet"));
707             assertEquals(1, check.getFragmentsByName("some-app::SomePortlet").size());
708             assertNotNull(check.getParent());
709         }
710         catch (PageNotFoundException e)
711         {
712             assertTrue("Page /default-page.psml NOT FOUND", false);
713         }
714         try
715         {
716             Folder check = pageManager.getFolder("/");
717             assertEquals("/", check.getPath());
718             assertEquals("/", check.getName());
719             assertEquals("/", check.getUrl());
720             assertEquals("Root Folder", check.getTitle());
721             assertEquals("jetspeed", check.getEffectiveDefaultDecorator(Fragment.LAYOUT));
722             assertEquals("jetspeed", check.getDefaultDecorator(Fragment.LAYOUT));
723             assertEquals("gray-gradient", check.getDefaultDecorator(Fragment.PORTLET));
724             assertEquals("skin-1", check.getSkin());
725             assertEquals("default-page.psml", check.getDefaultPage());
726             assertEquals("Root", check.getShortTitle());
727             assertNotNull(check.getMetadata());
728             assertEquals("[fr] Root Folder", check.getTitle(Locale.FRENCH));
729             assertNotNull(check.getSecurityConstraints());
730             assertEquals("admin", check.getSecurityConstraints().getOwner());
731             assertNotNull(check.getSecurityConstraints().getSecurityConstraintsRefs());
732             assertEquals(2, check.getSecurityConstraints().getSecurityConstraintsRefs().size());
733             assertEquals("public-edit", (String)check.getSecurityConstraints().getSecurityConstraintsRefs().get(1));
734             assertNotNull(check.getSecurityConstraints().getSecurityConstraints());
735             assertEquals(2, check.getSecurityConstraints().getSecurityConstraints().size());
736             assertEquals("user,admin", Shared.makeCSVFromList(((SecurityConstraint)check.getSecurityConstraints().getSecurityConstraints().get(0)).getUsers()));
737             assertEquals("manager", Shared.makeCSVFromList(((SecurityConstraint)check.getSecurityConstraints().getSecurityConstraints().get(0)).getRoles()));
738             assertEquals("*", Shared.makeCSVFromList(((SecurityConstraint)check.getSecurityConstraints().getSecurityConstraints().get(0)).getGroups()));
739             assertEquals("edit", Shared.makeCSVFromList(((SecurityConstraint)check.getSecurityConstraints().getSecurityConstraints().get(1)).getPermissions()));
740             assertNotNull(check.getDocumentOrder());
741             assertEquals(2, check.getDocumentOrder().size());
742             assertEquals("some-other-page.psml", (String)check.getDocumentOrder().get(0));
743             assertEquals("default-page.psml", (String)check.getDocumentOrder().get(1));
744             assertNull(check.getParent());
745             assertNotNull(check.getPageSecurity());
746             assertNotNull(check.getPages());
747             assertEquals(3, check.getPages().size());
748             assertNotNull(check.getLinks());
749             assertEquals(1, check.getLinks().size());
750             assertNotNull(check.getFolders());
751             assertEquals(1, check.getFolders().size());
752             assertNotNull(check.getAll());
753             assertEquals(6, check.getAll().size());
754             Iterator all = check.getAll().iterator();
755             assertEquals("some-other-page.psml", ((Node)all.next()).getName());
756             assertEquals("default-page.psml", ((Node)all.next()).getName());
757             assertEquals("__subsite-rootx", ((Node)all.next()).getName());
758             assertEquals("another-page.psml", ((Node)all.next()).getName());
759             assertEquals("default.link", ((Node)all.next()).getName());
760             assertEquals("page.security", ((Node)all.next()).getName());
761             assertNotNull(check.getMenuDefinitions());
762             assertEquals(2, check.getMenuDefinitions().size());
763             MenuDefinition checkMenu = (MenuDefinition)check.getMenuDefinitions().get(0);
764             assertEquals("folder-breadcrumb-menu", checkMenu.getName());
765             assertEquals("bread-crumbs", checkMenu.getSkin());
766             assertEquals("./", checkMenu.getOptions());
767             assertTrue(checkMenu.isPaths());
768             assertNotNull(checkMenu.getMenuElements());
769             assertTrue(checkMenu.getMenuElements().isEmpty());
770             checkMenu = (MenuDefinition)check.getMenuDefinitions().get(1);
771             assertEquals("folder-menu", checkMenu.getName());
772             assertEquals("The Test Folder Menu", checkMenu.getTitle());
773             assertEquals("Folder Menu", checkMenu.getShortTitle());
774             assertEquals("group-fallback", checkMenu.getProfile());
775             assertEquals("[fr] Folder Menu", checkMenu.getShortTitle(Locale.FRENCH));
776             assertEquals("[fr] The Test Folder Menu", checkMenu.getTitle(Locale.FRENCH));
777             assertNotNull(checkMenu.getMenuElements());
778             assertEquals(6,checkMenu.getMenuElements().size());
779             assertTrue(checkMenu.getMenuElements().get(0) instanceof MenuSeparatorDefinition);
780             assertEquals("-- Folder Menu --", ((MenuSeparatorDefinition)checkMenu.getMenuElements().get(0)).getText());
781             assertEquals("Rollover: Folder Menu", ((MenuSeparatorDefinition)checkMenu.getMenuElements().get(0)).getTitle());
782             assertEquals("header", ((MenuSeparatorDefinition)checkMenu.getMenuElements().get(0)).getSkin());
783             assertEquals("-- [fr] Folder Menu --", ((MenuSeparatorDefinition)checkMenu.getMenuElements().get(0)).getText(Locale.FRENCH));
784             assertEquals("[fr] Rollover: Folder Menu", ((MenuSeparatorDefinition)checkMenu.getMenuElements().get(0)).getTitle(Locale.FRENCH));
785             assertTrue(checkMenu.getMenuElements().get(1) instanceof MenuOptionsDefinition);
786             assertEquals("/*.psml", ((MenuOptionsDefinition)checkMenu.getMenuElements().get(1)).getOptions());
787             assertTrue(((MenuOptionsDefinition)checkMenu.getMenuElements().get(1)).isRegexp());
788             assertEquals("flash", ((MenuOptionsDefinition)checkMenu.getMenuElements().get(1)).getSkin());
789             assertTrue(checkMenu.getMenuElements().get(2) instanceof MenuOptionsDefinition);
790             assertEquals("/folder0", ((MenuOptionsDefinition)checkMenu.getMenuElements().get(2)).getOptions());
791             assertEquals("role-fallback", ((MenuOptionsDefinition)checkMenu.getMenuElements().get(2)).getProfile());
792             assertEquals("/folder*", ((MenuOptionsDefinition)checkMenu.getMenuElements().get(2)).getOrder());
793             assertEquals(1, ((MenuOptionsDefinition)checkMenu.getMenuElements().get(2)).getDepth());
794             assertTrue(((MenuOptionsDefinition)checkMenu.getMenuElements().get(2)).isPaths());
795             assertTrue(checkMenu.getMenuElements().get(3) instanceof MenuDefinition);
796             assertEquals("/*/", ((MenuDefinition)checkMenu.getMenuElements().get(3)).getOptions());
797             assertTrue(((MenuDefinition)checkMenu.getMenuElements().get(3)).isRegexp());
798             assertEquals(2, ((MenuDefinition)checkMenu.getMenuElements().get(3)).getDepth());
799             assertEquals("/x*/,/y*/,/z*/", ((MenuDefinition)checkMenu.getMenuElements().get(3)).getOrder());
800             assertEquals("bold", ((MenuDefinition)checkMenu.getMenuElements().get(3)).getSkin());
801             assertNotNull(((MenuDefinition)checkMenu.getMenuElements().get(3)).getMenuElements());
802             assertTrue(((MenuDefinition)checkMenu.getMenuElements().get(3)).getMenuElements().isEmpty());
803             assertTrue(checkMenu.getMenuElements().get(4) instanceof MenuExcludeDefinition);
804             assertEquals("exclude-menu", ((MenuExcludeDefinition)checkMenu.getMenuElements().get(4)).getName());
805             assertTrue(checkMenu.getMenuElements().get(5) instanceof MenuIncludeDefinition);
806             assertEquals("include-menu", ((MenuIncludeDefinition)checkMenu.getMenuElements().get(5)).getName());
807             assertTrue(((MenuIncludeDefinition)checkMenu.getMenuElements().get(5)).isNest());
808         }
809         catch (FolderNotFoundException e)
810         {
811             assertTrue("Folder / NOT FOUND", false);
812         }
813         try
814         {
815             Page check = pageManager.getPage("/another-page.psml");
816             assertEquals("/another-page.psml", check.getPath());
817             assertEquals("another-page.psml", check.getName());
818             assertEquals("Another Page", check.getTitle());
819             assertEquals("jetspeed", check.getEffectiveDefaultDecorator(Fragment.LAYOUT));
820             assertEquals("gray-gradient", check.getEffectiveDefaultDecorator(Fragment.PORTLET));
821             assertNull(check.getDefaultDecorator(Fragment.LAYOUT));
822             assertNull(check.getDefaultDecorator(Fragment.PORTLET));
823         }
824         catch (PageNotFoundException e)
825         {
826             assertTrue("Page /default-page.psml NOT FOUND", false);
827         }
828 
829         try
830         {
831             Page check = pageManager.getPage(deepPagePath);
832             assertEquals(deepPagePath, check.getPath());
833             assertNotNull(check.getParent());
834         }
835         catch (PageNotFoundException e)
836         {
837             assertTrue("Page " + deepPagePath + " NOT FOUND", false);
838         }
839         try
840         {
841             Folder check = pageManager.getFolder(deepFolderPath);
842             assertEquals(deepFolderPath, check.getPath());
843             assertNotNull(check.getParent());
844         }
845         catch (FolderNotFoundException e)
846         {
847             assertTrue("Folder " + deepFolderPath + " NOT FOUND", false);
848         }
849     }
850 
851     public void testUpdates() throws Exception
852     {
853         // reset page manager cache
854         pageManager.reset();
855         
856         // update documents and folders in persisted store
857         PageSecurity pageSecurity = pageManager.getPageSecurity();
858         assertEquals("/page.security", pageSecurity.getPath());
859         pageSecurity.getGlobalSecurityConstraintsRefs().add("UPDATED");
860         pageManager.updatePageSecurity(pageSecurity);
861 
862         Page page = pageManager.getPage("/default-page.psml");
863         assertEquals("/default-page.psml", page.getPath());
864         page.setTitle("UPDATED");
865         page.getRootFragment().getProperties().remove("custom-prop1");
866         page.getRootFragment().getProperties().put("UPDATED", "UPDATED");
867         assertNotNull(page.getRootFragment().getFragments());
868         assertEquals(2, page.getRootFragment().getFragments().size());
869         String removeId = ((Fragment)page.getRootFragment().getFragments().get(1)).getId();
870         assertNotNull(page.removeFragmentById(removeId));
871         SecurityConstraint pageConstraint = page.newSecurityConstraint();
872         pageConstraint.setUsers(Shared.makeListFromCSV("UPDATED"));
873         page.getSecurityConstraints().getSecurityConstraints().add(0, pageConstraint);
874         pageManager.updatePage(page);
875 
876         Link link = pageManager.getLink("/default.link");
877         assertEquals("/default.link", link.getPath());
878         link.setTitle("UPDATED");
879         link.getSecurityConstraints().setOwner("UPDATED");
880         pageManager.updateLink(link);
881 
882         Folder folder = pageManager.getFolder("/");
883         assertEquals("/", folder.getPath());
884         folder.setTitle("UPDATED");
885         folder.getDocumentOrder().remove("some-other-page.psml");
886         folder.getDocumentOrder().add("UPDATED");
887         folder.getDocumentOrder().add("some-other-page.psml");
888         MenuDefinition updateMenu = (MenuDefinition)folder.getMenuDefinitions().get(1);
889         updateMenu.setName("UPDATED");
890         updateMenu.setTitle("UPDATED");
891         updateMenu.getMetadata().addField(Locale.JAPANESE, "short-title", "[ja] UPDATED");
892         ((MenuOptionsDefinition)updateMenu.getMenuElements().get(2)).setProfile("UPDATED");
893         pageManager.updateFolder(folder);
894         assertNotNull(folder.getAll());
895         assertEquals(6, folder.getAll().size());
896         Iterator all = folder.getAll().iterator();
897         assertEquals("default-page.psml", ((Node)all.next()).getName());
898         assertEquals("some-other-page.psml", ((Node)all.next()).getName());
899 
900         folder.setTitle("FOLDER-UPDATED-DEEP");
901         page.setTitle("FOLDER-UPDATED-DEEP");
902         link.setTitle("FOLDER-UPDATED-DEEP");
903         Folder deepFolder = pageManager.getFolder(deepFolderPath);
904         deepFolder.setTitle("FOLDER-UPDATED-DEEP");
905         Page deepPage = pageManager.getPage(deepPagePath);
906         deepPage.setTitle("FOLDER-UPDATED-DEEP");
907         pageManager.updateFolder(folder, true);
908     }
909 
910     public void testRemoves() throws Exception
911     {
912         // reset page manager cache
913         pageManager.reset();
914         
915         // remove root folder
916         try
917         {
918             Folder remove = pageManager.getFolder("/");
919             assertEquals("/", remove.getPath());
920             pageManager.removeFolder(remove);
921         }
922         catch (FolderNotFoundException e)
923         {
924             assertTrue("Folder / NOT FOUND", false);
925         }
926         
927         // reset page manager cache
928         pageManager.reset();
929         
930         // verify root folder deep removal
931         try
932         {
933             pageManager.getFolder("/");
934             assertTrue("Folder / FOUND", false);
935         }
936         catch (FolderNotFoundException e)
937         {
938         }
939         try
940         {
941             pageManager.getPageSecurity();
942             assertTrue("PageSecurity FOUND", false);
943         }
944         catch (DocumentNotFoundException e)
945         {
946         }
947         try
948         {
949             pageManager.getLink("/default.link");
950             assertTrue("Link /default.link FOUND", false);
951         }
952         catch (DocumentNotFoundException e)
953         {
954         }
955         try
956         {
957             pageManager.getPage("/default-page.psml");
958             assertTrue("Page /default-page.psml FOUND", false);
959         }
960         catch (PageNotFoundException e)
961         {
962         }
963         try
964         {
965             pageManager.getFolder("/");
966             assertTrue("Folder / FOUND", false);
967         }
968         catch (FolderNotFoundException e)
969         {
970         }
971         try
972         {
973             pageManager.getFolder(deepFolderPath);
974             assertTrue("Folder " + deepFolderPath + " FOUND", false);
975         }
976         catch (FolderNotFoundException e)
977         {
978         }
979         try
980         {
981             pageManager.getPage(deepPagePath);
982             assertTrue("Page " + deepPagePath + " FOUND", false);
983         }
984         catch (PageNotFoundException e)
985         {
986         }
987     }
988 
989     public void testEvents() throws Exception
990     {
991         // verify listener functionality and operation counts
992         assertEquals(22, newNodeCount);
993         assertEquals(26, updatedNodeCount);
994         assertEquals(22, removedNodeCount);
995 
996         // last test has been run
997         lastTestRun = true;
998     }
999 }