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.portalsite;
18  
19  import java.lang.reflect.Proxy;
20  import java.util.HashMap;
21  import java.util.Iterator;
22  import java.util.List;
23  import java.util.Locale;
24  import java.util.Map;
25  import java.util.Set;
26  
27  import junit.framework.Test;
28  import junit.framework.TestSuite;
29  
30  import org.apache.jetspeed.components.test.AbstractSpringTestCase;
31  import org.apache.jetspeed.om.folder.Folder;
32  import org.apache.jetspeed.om.folder.MenuDefinition;
33  import org.apache.jetspeed.om.page.Link;
34  import org.apache.jetspeed.om.page.Page;
35  import org.apache.jetspeed.page.PageManager;
36  import org.apache.jetspeed.page.document.NodeSet;
37  import org.apache.jetspeed.page.document.proxy.NodeProxy;
38  import org.apache.jetspeed.portalsite.impl.MenuImpl;
39  import org.apache.jetspeed.portalsite.view.SiteView;
40  import org.apache.jetspeed.profiler.ProfileLocator;
41  import org.apache.jetspeed.profiler.impl.JetspeedProfileLocator;
42  
43  /***
44   * TestPortalSite
45   *
46   * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
47   * @version $Id: TestPortalSite.java 534967 2007-05-03 19:23:06Z taylor $
48   */
49  public class TestPortalSite extends AbstractSpringTestCase
50  {
51      /***
52       * pageManager - PageManager component
53       */
54      private PageManager pageManager;
55  
56      /***
57       * portalSite - PortalSite component
58       */
59      private PortalSite portalSite;
60  
61      /* (non-Javadoc)
62       * @see junit.framework.TestCase#setUp()
63       */
64      protected void setUp() throws Exception
65      {
66          super.setUp();
67          this.pageManager = (PageManager) ctx.getBean("pageManager");
68          this.portalSite = (PortalSite) ctx.getBean("portalSite");
69      }
70  
71      /* (non-Javadoc)
72       * @see junit.framework.TestCase#tearDown()
73       */
74      protected void tearDown() throws Exception
75      {
76          super.tearDown();
77      }
78  
79      /***
80       * Start the tests.
81       *
82       * @param args the arguments. Not used
83       */
84      public static void main(String args[])
85      {
86          junit.awtui.TestRunner.main(new String[] {TestPortalSite.class.getName()});
87      }
88  
89      /***
90       * Define test suite.
91       *
92       * @return the test suite
93       */
94      public static Test suite()
95      {
96          // All methods starting with "test" will be executed in the test suite.
97          return new TestSuite(TestPortalSite.class);
98      }
99  
100     /***
101      * Define configuration paths.
102      *
103      * @return array of paths.
104      */
105     protected String[] getConfigurations()
106     {
107         return new String[] {"/JETSPEED-INF/spring/test-spring.xml"};
108     }
109 
110     /***
111      * testPageManagerSetup - Test PageManager test configuration
112      *
113      * @throws Exception
114      */
115     public void testPageManagerSetup() throws Exception
116     {
117         assertNotNull(pageManager);
118         Folder rootFolder = pageManager.getFolder("/");
119         assertNotNull(rootFolder);
120         Page rootPage0 = pageManager.getPage("/page0.psml");
121         assertNotNull(rootPage0);
122         assertEquals(rootFolder.getPage("page0.psml"), rootPage0);        
123         Link rootLink0 = pageManager.getLink("/link0.link");        
124         assertNotNull(rootLink0);
125         assertEquals(rootFolder.getLink("link0.link"), rootLink0);        
126     }
127 
128     public void testRelativeNavigations() throws Exception
129     {
130         JetspeedProfileLocator locator = new JetspeedProfileLocator();
131 
132         locator.init(null, "/");
133         locator.add("hostname", true, false, "dash");
134         locator.add("user", true, false, "joe");
135         locator.add("page", false, false, "home");
136         SiteView profileView = new SiteView(pageManager, locator);
137         assertEquals("/_hostname/dash/_user/joe,/_hostname/dash,/", profileView.getSearchPathsString());
138         
139         locator = new JetspeedProfileLocator();
140         locator.init(null, "/");
141         locator.add("hostname", true, false, "dash");
142         locator.add("user", true, false, "joe");
143         locator.add("navigation", false, true, "/");
144         locator.add("hostname", true, false, "dash");
145         locator.add("role", true, false, "user");
146         locator.add("page", false, false, "home");
147         profileView = new SiteView(pageManager, locator);
148         assertEquals("/_hostname/dash/_user/joe,/_hostname/dash/_role/user,/_hostname/dash,/", profileView.getSearchPathsString());
149   
150         locator = new JetspeedProfileLocator();
151         //locator.init(null, "/__subsite-root");
152         locator.init(null, "/");        
153         locator.add("navigation", false, true, "subsite-root");
154         locator.add("hostname", true, false, "localhost");
155         locator.add("user", true, false, "sublocal");
156         locator.add("navigation", false, true, "subsite-root");
157         locator.add("hostname", true, false, "localhost");
158         locator.add("role", true, false, "somerole");
159         locator.add("path", false, false, "home");
160         profileView = new SiteView(pageManager, locator);
161         assertEquals("/__subsite-root/_hostname/localhost/_user/sublocal,/__subsite-root/_hostname/localhost/_role/somerole,/__subsite-root/_hostname/localhost,/__subsite-root", profileView.getSearchPathsString());                       
162     }
163     
164     /***
165      * testSiteView - Test SiteView operation
166      *
167      * @throws Exception
168      */
169     public void testSiteView() throws Exception
170     {
171         // test degenerate SiteView
172         SiteView baseView = new SiteView(pageManager);
173         assertEquals("/", baseView.getSearchPathsString());
174         Folder rootFolderProxy = baseView.getRootFolderProxy();
175         assertNotNull(rootFolderProxy);
176         assertEquals("/", rootFolderProxy.getName());
177         assertEquals("root", rootFolderProxy.getTitle());
178         assertEquals("/", extractFileSystemPathFromId(rootFolderProxy.getId()));
179         assertEquals(4, rootFolderProxy.getFolders().size());
180         Iterator foldersIter = rootFolderProxy.getFolders().iterator();
181         assertEquals("folder0", ((Folder)foldersIter.next()).getName());
182         assertEquals("folder1", ((Folder)foldersIter.next()).getName());
183         assertEquals("folder2", ((Folder)foldersIter.next()).getName());
184         assertEquals("folder3", ((Folder)foldersIter.next()).getName());
185         assertEquals(4, rootFolderProxy.getPages().size());
186         Iterator pagesIter = rootFolderProxy.getPages().iterator();
187         assertEquals("page2.psml", ((Page)pagesIter.next()).getName());
188         assertEquals("page1.psml", ((Page)pagesIter.next()).getName());
189         assertEquals("page0.psml", ((Page)pagesIter.next()).getName());
190         assertEquals("hidden.psml", ((Page)pagesIter.next()).getName());
191         assertEquals(2, rootFolderProxy.getLinks().size());
192         Iterator linksIter = rootFolderProxy.getLinks().iterator();
193         assertEquals("link1.link", ((Link)linksIter.next()).getName());
194         assertEquals("link0.link", ((Link)linksIter.next()).getName());
195         Page rootPage0Proxy = rootFolderProxy.getPage("page0.psml");
196         assertNotNull(rootPage0Proxy);
197         assertEquals(rootFolderProxy, rootPage0Proxy.getParent());
198         assertEquals("page0.psml", rootPage0Proxy.getName());
199         assertEquals("/page0.psml", extractFileSystemPathFromId(rootPage0Proxy.getId()));
200         Page rootHiddenProxy = rootFolderProxy.getPage("hidden.psml");
201         assertNotNull(rootHiddenProxy);
202         assertEquals("hidden.psml", rootHiddenProxy.getName());
203         assertTrue(rootHiddenProxy.isHidden());
204         Link rootLink0Proxy = rootFolderProxy.getLink("link0.link");
205         assertNotNull(rootLink0Proxy);
206         assertEquals(rootFolderProxy, rootLink0Proxy.getParent());
207         assertEquals("link0.link", rootLink0Proxy.getName());
208         assertEquals("/link0.link", extractFileSystemPathFromId(rootLink0Proxy.getId()));
209         Folder rootFolder0Proxy = rootFolderProxy.getFolder("folder0");
210         assertNotNull(rootFolder0Proxy);
211         assertEquals(rootFolderProxy, rootFolder0Proxy.getParent());
212         assertEquals(1, rootFolder0Proxy.getPages().size());
213         assertEquals(null, rootFolder0Proxy.getLinks());
214         assertEquals("folder0", rootFolder0Proxy.getName());
215         assertEquals("/folder0", extractFileSystemPathFromId(rootFolder0Proxy.getId()));
216         Page folder0Page0Proxy = rootFolder0Proxy.getPage("page0.psml");
217         assertNotNull(folder0Page0Proxy);
218         assertEquals(rootFolder0Proxy, folder0Page0Proxy.getParent());
219         assertEquals("page0.psml", folder0Page0Proxy.getName());
220         assertEquals("/folder0/page0.psml", extractFileSystemPathFromId(folder0Page0Proxy.getId()));
221 
222         // test SiteView access by path
223         Folder rootFolderProxyByPath = (Folder)baseView.getNodeProxy("/", null, false, false);
224         assertNotNull(rootFolderProxyByPath);
225         assertEquals(rootFolderProxy, rootFolderProxyByPath);
226         Folder rootFolder0ProxyByPath = (Folder)baseView.getNodeProxy("/folder0/", null, false, false);
227         assertNotNull(rootFolder0ProxyByPath);
228         assertEquals(rootFolder0Proxy, rootFolder0ProxyByPath);
229         Page folder0Page0ProxyByPath = (Page)baseView.getNodeProxy("/folder0/page0.psml", null, false, false);
230         assertNotNull(folder0Page0ProxyByPath);
231         assertEquals(folder0Page0Proxy, folder0Page0ProxyByPath);
232         folder0Page0ProxyByPath = (Page)baseView.getNodeProxy("page0.psml", rootFolder0Proxy, false, false);
233         assertNotNull(folder0Page0ProxyByPath);
234         assertEquals(folder0Page0Proxy, folder0Page0ProxyByPath);
235         List rootPageProxiesByPath = baseView.getNodeProxies("/page?.psml", null, false, false);
236         assertNotNull(rootPageProxiesByPath);
237         assertEquals(3,rootPageProxiesByPath.size());
238         assertTrue(rootPageProxiesByPath.contains(rootPage0Proxy));
239         List rootFolderProxiesByPath = baseView.getNodeProxies("/*/", null, false, false);
240         assertNotNull(rootFolderProxiesByPath);
241         assertEquals(4,rootFolderProxiesByPath.size());
242         assertTrue(rootFolderProxiesByPath.contains(rootFolder0Proxy));
243         List folderPageProxiesByPath = baseView.getNodeProxies("*/p*[0-9].psml", rootFolderProxy, false, false);
244         assertNotNull(folderPageProxiesByPath);
245         assertEquals(2,folderPageProxiesByPath.size());
246         assertTrue(folderPageProxiesByPath.contains(folder0Page0Proxy));
247 
248         // test aggregating SiteView
249         SiteView aggregateView = new SiteView(pageManager, "/_user/user,/_role/role0,/_group/group,/");
250         assertEquals("/_user/user,/_role/role0,/_group/group,/", aggregateView.getSearchPathsString());
251         rootFolderProxy = aggregateView.getRootFolderProxy();
252         assertNotNull(rootFolderProxy);
253         assertEquals("/", rootFolderProxy.getName());
254         assertEquals("user root", rootFolderProxy.getTitle());
255         assertEquals("/_user/user", extractFileSystemPathFromId(rootFolderProxy.getId()));
256         assertEquals(4, rootFolderProxy.getFolders().size());
257         assertEquals(4, rootFolderProxy.getPages().size());
258         assertEquals(2, rootFolderProxy.getLinks().size());
259         rootPage0Proxy = rootFolderProxy.getPage("page0.psml");
260         assertNotNull(rootPage0Proxy);
261         assertEquals(rootFolderProxy, rootPage0Proxy.getParent());
262         assertEquals("page0.psml", rootPage0Proxy.getName());
263         assertEquals("/page0.psml", extractFileSystemPathFromId(rootPage0Proxy.getId()));
264         List rootPage0ProxyMenus = rootPage0Proxy.getMenuDefinitions();
265         assertNotNull(rootPage0ProxyMenus);
266         assertEquals(2 + aggregateView.getStandardMenuNames().size(), rootPage0ProxyMenus.size());
267         Iterator menusIter = rootPage0ProxyMenus.iterator();
268         MenuDefinition rootPage0ProxyTopMenu = (MenuDefinition)menusIter.next();
269         assertEquals("top", rootPage0ProxyTopMenu.getName());
270         assertEquals("/", rootPage0ProxyTopMenu.getOptions());
271         assertEquals(2, rootPage0ProxyTopMenu.getDepth());
272         assertEquals("dhtml-pull-down", rootPage0ProxyTopMenu.getSkin());
273         MenuDefinition rootPage0ProxyBreadCrumbMenu = (MenuDefinition)menusIter.next();
274         assertEquals("bread-crumbs", rootPage0ProxyBreadCrumbMenu.getName());
275         assertEquals("./", rootPage0ProxyBreadCrumbMenu.getOptions());
276         assertEquals(true, rootPage0ProxyBreadCrumbMenu.isPaths());
277         for (int i = 0; (i < aggregateView.getStandardMenuNames().size()); i++)
278         {
279             assertTrue(aggregateView.getStandardMenuNames().contains(((MenuDefinition)menusIter.next()).getName()));
280         }
281         Page rootPage2Proxy = rootFolderProxy.getPage("page2.psml");
282         assertNotNull(rootPage2Proxy);
283         assertEquals(rootFolderProxy, rootPage2Proxy.getParent());
284         assertEquals("page2.psml", rootPage2Proxy.getName());
285         assertEquals("/_user/user/page2.psml", extractFileSystemPathFromId(rootPage2Proxy.getId()));
286         List rootPage2ProxyMenus = rootPage2Proxy.getMenuDefinitions();
287         assertNotNull(rootPage2ProxyMenus);
288         assertEquals(2 + aggregateView.getStandardMenuNames().size(), rootPage2ProxyMenus.size());
289         menusIter = rootPage2ProxyMenus.iterator();
290         MenuDefinition rootPage2ProxyTopMenu = (MenuDefinition)menusIter.next();
291         assertEquals("top", rootPage2ProxyTopMenu.getName());
292         assertEquals("/", rootPage2ProxyTopMenu.getOptions());
293         assertEquals(1, rootPage2ProxyTopMenu.getDepth());
294         MenuDefinition rootPage2ProxyBreadCrumbMenu = (MenuDefinition)menusIter.next();
295         assertEquals("bread-crumbs", rootPage2ProxyBreadCrumbMenu.getName());
296         for (int i = 0; (i < aggregateView.getStandardMenuNames().size()); i++)
297         {
298             assertTrue(aggregateView.getStandardMenuNames().contains(((MenuDefinition)menusIter.next()).getName()));
299         }
300         rootLink0Proxy = rootFolderProxy.getLink("link0.link");
301         assertNotNull(rootLink0Proxy);
302         assertEquals(rootFolderProxy, rootLink0Proxy.getParent());
303         assertEquals("link0.link", rootLink0Proxy.getName());
304         assertEquals("/_group/group/link0.link", extractFileSystemPathFromId(rootLink0Proxy.getId()));
305         rootFolder0Proxy = rootFolderProxy.getFolder("folder0");
306         assertNotNull(rootFolder0Proxy);
307         assertEquals(rootFolderProxy, rootFolder0Proxy.getParent());
308         assertEquals(1, rootFolder0Proxy.getPages().size());
309         assertEquals(null, rootFolder0Proxy.getLinks());
310         assertEquals(null, rootFolder0Proxy.getFolders());
311         assertEquals("folder0", rootFolder0Proxy.getName());
312         assertEquals("folder0", rootFolder0Proxy.getTitle());
313         assertEquals("/folder0", extractFileSystemPathFromId(rootFolder0Proxy.getId()));
314         folder0Page0Proxy = rootFolder0Proxy.getPage("page0.psml");
315         assertNotNull(folder0Page0Proxy);
316         assertEquals(rootFolder0Proxy, folder0Page0Proxy.getParent());
317         assertEquals("page0.psml", folder0Page0Proxy.getName());
318         assertEquals("/folder0/page0.psml", extractFileSystemPathFromId(folder0Page0Proxy.getId()));
319         Folder rootFolder1Proxy = rootFolderProxy.getFolder("folder1");
320         assertNotNull(rootFolder1Proxy);
321         assertEquals(rootFolderProxy, rootFolder1Proxy.getParent());
322         assertEquals(2, rootFolder1Proxy.getPages().size());
323         assertEquals(null, rootFolder1Proxy.getLinks());
324         assertEquals(null, rootFolder1Proxy.getFolders());
325         assertEquals("folder1", rootFolder1Proxy.getName());
326         assertEquals("group folder1", rootFolder1Proxy.getTitle());
327         assertEquals("/_user/user/folder1", extractFileSystemPathFromId(rootFolder1Proxy.getId()));
328 
329         // test degenerate aggregating SiteView
330         aggregateView = new SiteView(pageManager, "/__subsite-root");
331         assertEquals("/__subsite-root", aggregateView.getSearchPathsString());
332         rootFolderProxy = aggregateView.getRootFolderProxy();
333         assertNotNull(rootFolderProxy);
334         assertEquals("/", rootFolderProxy.getName());
335         assertEquals("subsite root", rootFolderProxy.getTitle());
336         assertEquals("/__subsite-root", extractFileSystemPathFromId(rootFolderProxy.getId()));
337         assertEquals(null, rootFolderProxy.getFolders());
338         assertEquals(1, rootFolderProxy.getPages().size());
339         assertEquals(1, rootFolderProxy.getLinks().size());
340 
341         // test SiteView construction using profile locators
342         JetspeedProfileLocator locator = new JetspeedProfileLocator();
343         locator.init(null, "/");
344         SiteView profileView = new SiteView(pageManager, locator);
345         assertEquals("/", profileView.getSearchPathsString());
346         locator = new JetspeedProfileLocator();
347         locator.init(null, "/");
348         locator.add("user", true, false, "user");
349         locator.add("page", false, false, "default-page");
350         profileView = new SiteView(pageManager, locator);
351         assertEquals("/_user/user,/", profileView.getSearchPathsString());
352         locator = new JetspeedProfileLocator();
353         locator.init(null, "/");
354         locator.add("page", false, false, "default-page");
355         locator.add("user", true, false, "user");
356         locator.add("mediatype", true, false, "html");
357         locator.add("language", true, false, "en");
358         locator.add("country", true, false, "US");
359         profileView = new SiteView(pageManager, locator);
360         assertEquals("/_user/user/_mediatype/html,/_user/user,/", profileView.getSearchPathsString());
361         locator = new JetspeedProfileLocator();
362         locator.init(null, "/");
363         locator.add("page", false, false, "default-page");
364         locator.add("role", true, false, "role0");
365         locator.add("role", true, false, "role1");
366         profileView = new SiteView(pageManager, locator);
367         assertEquals("/_role/role0,/_role/role1,/", profileView.getSearchPathsString());
368         locator = new JetspeedProfileLocator();
369         locator.init(null, "/");
370         locator.add("user", true, false, "user");
371         locator.add("navigation", false, true, "/");
372         locator.add("role", true, false, "role0");
373         locator.add("navigation", false, true, "/");
374         locator.add("group", true, false, "group");
375         locator.add("page", false, false, "default-page");
376         profileView = new SiteView(pageManager, locator);
377         assertEquals("/_user/user,/_role/role0,/_group/group,/", profileView.getSearchPathsString());
378 
379         locator = new JetspeedProfileLocator();
380         locator.init(null, "/");
381         locator.add("hostname", true, false, "dash");
382         locator.add("user", true, false, "joe");
383         locator.add("page", false, false, "home");
384         profileView = new SiteView(pageManager, locator);
385         assertEquals("/_hostname/dash/_user/joe,/_hostname/dash,/", profileView.getSearchPathsString());
386         
387         locator = new JetspeedProfileLocator();
388         locator.init(null, "/");
389         locator.add("navigation", false, true, "subsite-root");
390         profileView = new SiteView(pageManager, locator);
391         assertEquals("/__subsite-root", profileView.getSearchPathsString());
392         Map locators = new HashMap();
393         locator = new JetspeedProfileLocator();
394         locator.init(null, "/");
395         locator.add("role", true, false, "role0");
396         locator.add("role", true, false, "role1");
397         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
398         locator = new JetspeedProfileLocator();
399         locator.init(null, "/");
400         locator.add("user", true, false, "user");
401         locator.add("navigation", false, true, "/");
402         locator.add("group", true, false, "group");
403         locators.put("alternate-locator-name", locator);
404         profileView = new SiteView(pageManager, locators);
405         assertEquals("/_role/role0,/_role/role1,/_user/user,/_group/group,/", profileView.getSearchPathsString());
406         rootFolderProxy = profileView.getRootFolderProxy();
407         assertNotNull(rootFolderProxy);
408         assertEquals("/", rootFolderProxy.getName());
409         assertEquals("user root", rootFolderProxy.getTitle());
410         assertEquals("/_role/role0", extractFileSystemPathFromId(rootFolderProxy.getId()));
411         assertEquals(ProfileLocator.PAGE_LOCATOR, extractLocatorNameFromProxy(rootFolderProxy));
412         rootPage2Proxy = rootFolderProxy.getPage("page2.psml");
413         assertNotNull(rootPage2Proxy);
414         assertEquals("page2.psml", rootPage2Proxy.getName());
415         assertEquals("/_role/role0/page2.psml", extractFileSystemPathFromId(rootPage2Proxy.getId()));
416         assertEquals(ProfileLocator.PAGE_LOCATOR, extractLocatorNameFromProxy(rootPage2Proxy));
417         rootFolder1Proxy = rootFolderProxy.getFolder("folder1");
418         assertNotNull(rootFolder1Proxy);
419         assertEquals("folder1", rootFolder1Proxy.getName());
420         assertEquals("group folder1", rootFolder1Proxy.getTitle());
421         assertEquals("/_user/user/folder1", extractFileSystemPathFromId(rootFolder1Proxy.getId()));
422         assertEquals("alternate-locator-name", extractLocatorNameFromProxy(rootFolder1Proxy));
423         Page folder1Page1Proxy = rootFolder1Proxy.getPage("page1.psml");
424         assertNotNull(folder1Page1Proxy);
425         assertEquals("page1.psml", folder1Page1Proxy.getName());
426         assertEquals("/_group/group/folder1/page1.psml", extractFileSystemPathFromId(folder1Page1Proxy.getId()));
427         assertEquals("alternate-locator-name", extractLocatorNameFromProxy(folder1Page1Proxy));
428     }
429 
430     /***
431      * testPortalSiteSetup - Test PortalSite test configuration
432      *
433      * @throws Exception
434      */
435     public void testPotalSiteSetup() throws Exception
436     {
437         assertNotNull(portalSite);
438         PortalSiteSessionContext sessionContext = portalSite.newSessionContext();
439         assertNotNull(sessionContext);
440         JetspeedProfileLocator locator = new JetspeedProfileLocator();
441         locator.init(null, "/");
442         locator.add("user", true, false, "user");
443         locator.add("navigation", false, true, "/");
444         locator.add("role", true, false, "role0");
445         locator.add("role", true, false, "role1");
446         locator.add("navigation", false, true, "/");
447         locator.add("group", true, false, "group");
448         Map locators = new HashMap();
449         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
450         PortalSiteRequestContext requestContext = sessionContext.newRequestContext(locators);
451         assertNotNull(requestContext);
452         Page requestPageProxy = requestContext.getPage();
453         assertNotNull(requestPageProxy);
454         assertEquals("page2.psml", requestPageProxy.getName());
455         assertEquals("/_user/user/page2.psml", extractFileSystemPathFromId(requestPageProxy.getId()));
456         Folder requestFolderProxy = requestContext.getFolder();
457         assertNotNull(requestFolderProxy);
458         assertEquals("/", requestFolderProxy.getName());
459         assertEquals("/_user/user", extractFileSystemPathFromId(requestFolderProxy.getId()));
460         NodeSet requestSiblingPageProxies = requestContext.getSiblingPages();
461         assertNotNull(requestSiblingPageProxies);
462         assertEquals(3, requestSiblingPageProxies.size());
463         assertNotNull(requestSiblingPageProxies.get("page0.psml"));
464         assertEquals("/page0.psml", extractFileSystemPathFromId(requestSiblingPageProxies.get("page0.psml").getId()));
465         assertNotNull(requestSiblingPageProxies.get("page1.psml"));
466         assertEquals("/page1.psml", extractFileSystemPathFromId(requestSiblingPageProxies.get("page1.psml").getId()));
467         assertNotNull(requestSiblingPageProxies.get("page2.psml"));
468         assertEquals("/_user/user/page2.psml", extractFileSystemPathFromId(requestSiblingPageProxies.get("page2.psml").getId()));
469         Folder requestParentFolderProxy = requestContext.getParentFolder();
470         assertNull(requestParentFolderProxy);
471         NodeSet requestSiblingFolderProxies = requestContext.getSiblingFolders();
472         assertNotNull(requestSiblingFolderProxies);
473         assertEquals(3, requestSiblingFolderProxies.size());
474         assertNotNull(requestSiblingFolderProxies.get("folder0"));
475         assertEquals("/folder0", extractFileSystemPathFromId(requestSiblingFolderProxies.get("folder0").getId()));
476         assertNotNull(requestSiblingFolderProxies.get("folder1"));
477         assertEquals("/_user/user/folder1", extractFileSystemPathFromId(requestSiblingFolderProxies.get("folder1").getId()));
478         assertNotNull(requestSiblingFolderProxies.get("folder2"));
479         assertEquals("/folder2", extractFileSystemPathFromId(requestSiblingFolderProxies.get("folder2").getId()));
480         Folder requestRootFolderProxy = requestContext.getRootFolder();
481         assertNotNull(requestRootFolderProxy);
482         assertEquals("/", requestRootFolderProxy.getName());
483         assertEquals("/_user/user", extractFileSystemPathFromId(requestRootFolderProxy.getId()));
484         NodeSet requestRootLinkProxies = requestContext.getRootLinks();
485         assertNotNull(requestRootLinkProxies);
486         assertEquals(2, requestRootLinkProxies.size());
487         assertNotNull(requestRootLinkProxies.get("link0.link"));
488         assertEquals("/_group/group/link0.link", extractFileSystemPathFromId(requestRootLinkProxies.get("link0.link").getId()));
489         assertNotNull(requestRootLinkProxies.get("link1.link"));
490         assertEquals("/link1.link", extractFileSystemPathFromId(requestRootLinkProxies.get("link1.link").getId()));
491     }
492 
493     /***
494      * testPortalSiteRequests - Test PortalSite request path logic
495      *
496      * @throws Exception
497      */
498     public void testPotalSiteRequests() throws Exception
499     {
500         assertNotNull(portalSite);
501         PortalSiteSessionContext sessionContext = portalSite.newSessionContext();
502         assertNotNull(sessionContext);
503         JetspeedProfileLocator locator = new JetspeedProfileLocator();
504         locator.init(null, "/");
505         locator.add("page", false, false, "default-page");
506         locator.add("user", true, false, "user");
507         Map locators = new HashMap();
508         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
509         PortalSiteRequestContext requestContext = sessionContext.newRequestContext(locators);
510         assertNotNull(requestContext);
511         Page requestPageProxy = requestContext.getPage();
512         assertNotNull(requestPageProxy);
513         assertEquals("page2.psml", requestPageProxy.getName());
514         assertEquals("/_user/user/page2.psml", extractFileSystemPathFromId(requestPageProxy.getId()));
515 
516         locator = new JetspeedProfileLocator();
517         locator.init(null, "/");
518         locator.add("page", false, false, null);
519         locator.add("user", true, false, "user");
520         locators = new HashMap();
521         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
522         requestContext = sessionContext.newRequestContext(locators);
523         assertNotNull(requestContext);
524         requestPageProxy = requestContext.getPage();
525         assertNotNull(requestPageProxy);
526         assertEquals("page2.psml", requestPageProxy.getName());
527         assertEquals("/_user/user/page2.psml", extractFileSystemPathFromId(requestPageProxy.getId()));
528 
529         locator = new JetspeedProfileLocator();
530         locator.init(null, "/");
531         locator.add("page", false, false, "page1");
532         locator.add("user", true, false, "user");
533         locators = new HashMap();
534         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
535         requestContext = sessionContext.newRequestContext(locators);
536         assertNotNull(requestContext);
537         requestPageProxy = requestContext.getPage();
538         assertNotNull(requestPageProxy);
539         assertEquals("page1.psml", requestPageProxy.getName());
540         assertEquals("/page1.psml", extractFileSystemPathFromId(requestPageProxy.getId()));
541 
542         locator = new JetspeedProfileLocator();
543         locator.init(null, "/");
544         locator.add("page", false, false, "folder1/");
545         locator.add("user", true, false, "user");
546         locators = new HashMap();
547         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
548         requestContext = sessionContext.newRequestContext(locators);
549         assertNotNull(requestContext);
550         requestPageProxy = requestContext.getPage();
551         assertNotNull(requestPageProxy);
552         assertEquals("page0.psml", requestPageProxy.getName());
553         assertEquals("/_user/user/folder1/page0.psml", extractFileSystemPathFromId(requestPageProxy.getId()));
554 
555         locator = new JetspeedProfileLocator();
556         locator.init(null, "/");
557         locator.add("page", false, false, "/folder0/");
558         locator.add("user", true, false, "user");
559         locators = new HashMap();
560         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
561         requestContext = sessionContext.newRequestContext(locators);
562         assertNotNull(requestContext);
563         requestPageProxy = requestContext.getPage();
564         assertNotNull(requestPageProxy);
565         assertEquals("page0.psml", requestPageProxy.getName());
566         assertEquals("/folder0/page0.psml", extractFileSystemPathFromId(requestPageProxy.getId()));
567 
568         locator = new JetspeedProfileLocator();
569         locator.init(null, "/");
570         locator.add("page", false, false, "/folder3/default-folder0/");
571         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
572         requestContext = sessionContext.newRequestContext(locators);
573         assertNotNull(requestContext);
574         requestPageProxy = requestContext.getPage();
575         assertNotNull(requestPageProxy);
576         assertEquals("page1.psml", requestPageProxy.getName());
577         assertEquals("/folder3/default-folder1/page1.psml", extractFileSystemPathFromId(requestPageProxy.getId()));
578     }
579 
580     /***
581      * testPortalSiteMenus - Test PortalSite menu generation
582      *
583      * @throws Exception
584      */
585     public void testPotalSiteMenus() throws Exception
586     {
587         assertNotNull(portalSite);
588         PortalSiteSessionContext sessionContext = portalSite.newSessionContext();
589         assertNotNull(sessionContext);
590 
591         // first request at /
592         JetspeedProfileLocator locator = new JetspeedProfileLocator();
593         locator.init(null, "/");
594         locator.add("user", true, false, "user");
595         locator.add("mediatype", true, false, "html");
596         Map locators = new HashMap();
597         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
598         locator = new JetspeedProfileLocator();
599         locator.init(null, "/");
600         locator.add("role", true, false, "role0");
601         locators.put("role", locator);
602         locator = new JetspeedProfileLocator();
603         locator.init(null, "/");
604         locator.add("group", true, false, "group");
605         locators.put("group", locator);
606         PortalSiteRequestContext requestContext = sessionContext.newRequestContext(locators);
607         assertNotNull(requestContext);
608         Set customMenuNames = requestContext.getCustomMenuNames();
609         assertNotNull(customMenuNames);
610         assertEquals(2, customMenuNames.size());
611         assertTrue(customMenuNames.contains("top"));
612         assertTrue(customMenuNames.contains("bread-crumbs"));
613         Menu topMenu = requestContext.getMenu("top");
614         assertNotNull(topMenu);
615         assertEquals(MenuElement.MENU_ELEMENT_TYPE, topMenu.getElementType());
616         assertNull(topMenu.getParentMenu());
617         assertEquals("user root", topMenu.getTitle());
618         assertEquals("user", topMenu.getShortTitle());
619         assertEquals("dhtml-pull-down", topMenu.getSkin());
620         assertEquals("top", topMenu.getName());
621         assertEquals("/", topMenu.getUrl());
622         assertFalse(topMenu.isEmpty());
623         List topMenuElements = topMenu.getElements();
624         assertNotNull(topMenuElements);
625         assertEquals(7, topMenuElements.size());
626         Iterator menuElementsIter = topMenuElements.iterator();
627         while (menuElementsIter.hasNext())
628         {
629             MenuElement element = (MenuElement)menuElementsIter.next();
630             if (element.getElementType().equals(MenuElement.MENU_ELEMENT_TYPE) && element.getTitle().equals("folder0"))
631             {
632                 assertTrue(element instanceof Menu);
633                 assertEquals("/folder0", ((Menu)element).getUrl());
634                 assertTrue(((Menu)element).getParentMenu() == topMenu);
635                 assertFalse(((Menu)element).isEmpty());
636                 List elements = ((Menu)element).getElements();
637                 assertNotNull(elements);
638                 assertEquals(1, elements.size());
639                 assertTrue(elements.get(0) instanceof MenuOption);
640                 assertEquals("/folder0/page0.psml", ((MenuOption)elements.get(0)).getUrl());
641                 assertEquals("dhtml-pull-down", element.getSkin());
642             }
643             else if (element.getElementType().equals(MenuElement.MENU_ELEMENT_TYPE) && element.getTitle().equals("group folder1"))
644             {
645                 assertTrue(element instanceof Menu);
646                 assertEquals("/folder1", ((Menu)element).getUrl());
647                 assertTrue(((Menu)element).getParentMenu() == topMenu);
648                 assertFalse(((Menu)element).isEmpty());
649                 List elements = ((Menu)element).getElements();
650                 assertNotNull(elements);
651                 assertEquals(2, elements.size());
652                 assertTrue(elements.get(0) instanceof MenuOption);
653                 assertEquals("/folder1/page0.psml", ((MenuOption)elements.get(0)).getTitle());
654                 assertTrue(elements.get(1) instanceof MenuOption);
655                 assertEquals("/folder1/page1.psml", ((MenuOption)elements.get(1)).getTitle());
656             }
657             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/page2.psml"))
658             {
659                 assertTrue(element instanceof MenuOption);
660                 assertEquals("/page2.psml", ((MenuOption)element).getUrl());
661                 assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)element).getType());
662             }
663             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/page1.psml"))
664             {
665                 assertTrue(element instanceof MenuOption);
666                 assertEquals("/page1.psml", ((MenuOption)element).getUrl());
667             }
668             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/page0.psml"))
669             {
670                 assertTrue(element instanceof MenuOption);
671                 assertEquals("/page0.psml", ((MenuOption)element).getUrl());
672             }
673             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/link1.link"))
674             {
675                 assertTrue(element instanceof MenuOption);
676                 assertEquals("http://link1", ((MenuOption)element).getUrl());
677                 assertEquals("top", ((MenuOption)element).getTarget());
678                 assertEquals(MenuOption.LINK_OPTION_TYPE, ((MenuOption)element).getType());
679             }
680             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/link0.link"))
681             {
682                 assertTrue(element instanceof MenuOption);
683                 assertEquals("http://link0", ((MenuOption)element).getUrl());
684                 assertNull(((MenuOption)element).getTarget());
685                 assertEquals("dhtml-pull-down", element.getSkin());
686             }
687             else
688             {
689                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
690             }
691         }
692         assertTrue(topMenu.isSelected(requestContext));
693         MenuElement selected = topMenu.getSelectedElement(requestContext);
694         assertNotNull(selected);
695         assertEquals(MenuElement.OPTION_ELEMENT_TYPE, selected.getElementType());
696         assertTrue(selected instanceof MenuOption);
697         assertEquals("/page2.psml", ((MenuOption)selected).getUrl());
698         assertEquals("/page2.psml", selected.getTitle());
699         assertEquals("dhtml-pull-down", selected.getSkin());
700         assertFalse(((MenuImpl)topMenu).isElementRelative());
701         Menu breadCrumbsMenu = requestContext.getMenu("bread-crumbs");
702         assertNotNull(breadCrumbsMenu);
703         assertEquals("bread-crumbs", breadCrumbsMenu.getName());
704         assertEquals("/", breadCrumbsMenu.getUrl());
705         assertFalse(breadCrumbsMenu.isEmpty());
706         List breadCrumbsElements = breadCrumbsMenu.getElements();
707         assertNotNull(breadCrumbsElements);
708         assertEquals(1, breadCrumbsElements.size());
709         assertTrue(breadCrumbsElements.get(0) instanceof MenuOption);
710         assertEquals("/", ((MenuOption)breadCrumbsElements.get(0)).getUrl());
711         assertEquals(MenuOption.FOLDER_OPTION_TYPE, ((MenuOption)breadCrumbsElements.get(0)).getType());
712         assertTrue(((MenuImpl)breadCrumbsMenu).isElementRelative());
713 
714         // second request at /folder0
715         locator = new JetspeedProfileLocator();
716         locator.init(null, "/folder0");
717         locator.add("user", true, false, "user");
718         locator.add("mediatype", true, false, "html");
719         locators = new HashMap();
720         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
721         locator = new JetspeedProfileLocator();
722         locator.init(null, "/folder0");
723         locator.add("role", true, false, "role0");
724         locators.put("role", locator);
725         locator = new JetspeedProfileLocator();
726         locator.init(null, "/folder0");
727         locator.add("group", true, false, "group");
728         locators.put("group", locator);
729         requestContext = sessionContext.newRequestContext(locators);
730         assertNotNull(requestContext);
731         Menu topMenu2 = requestContext.getMenu("top");
732         assertNotNull(topMenu2);
733         assertTrue(topMenu == topMenu2);
734         Menu breadCrumbsMenu2 = requestContext.getMenu("bread-crumbs");
735         assertNotNull(breadCrumbsMenu2);
736         assertTrue(breadCrumbsMenu != breadCrumbsMenu2);
737         assertEquals("bread-crumbs", breadCrumbsMenu2.getName());
738         assertEquals("/folder0", breadCrumbsMenu2.getUrl());
739         assertFalse(breadCrumbsMenu2.isEmpty());
740         breadCrumbsElements = breadCrumbsMenu2.getElements();
741         assertNotNull(breadCrumbsElements);
742         assertEquals(2, breadCrumbsElements.size());
743         assertTrue(breadCrumbsElements.get(0) instanceof MenuOption);
744         assertEquals("/", ((MenuOption)breadCrumbsElements.get(0)).getUrl());
745         assertEquals(MenuOption.FOLDER_OPTION_TYPE, ((MenuOption)breadCrumbsElements.get(0)).getType());
746         assertEquals("/folder0", ((MenuOption)breadCrumbsElements.get(1)).getUrl());
747         assertEquals(MenuOption.FOLDER_OPTION_TYPE, ((MenuOption)breadCrumbsElements.get(1)).getType());
748         assertTrue(((MenuImpl)breadCrumbsMenu2).isElementRelative());
749         Menu hiddenMenu = requestContext.getMenu("override-hidden");
750         assertNotNull(hiddenMenu);
751         assertTrue(hiddenMenu.isEmpty());
752         Menu navigationsMenu = requestContext.getMenu("navigations");
753         assertNotNull(navigationsMenu);
754         assertTrue(navigationsMenu.isEmpty());
755 
756         // third request at /page1.psml
757         locator = new JetspeedProfileLocator();
758         locator.init(null, "/page1.psml");
759         locator.add("user", true, false, "user");
760         locator.add("mediatype", true, false, "html");
761         locators = new HashMap();
762         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
763         locator = new JetspeedProfileLocator();
764         locator.init(null, "/page1.psml");
765         locator.add("role", true, false, "role0");
766         locators.put("role", locator);
767         locator = new JetspeedProfileLocator();
768         locator.init(null, "/page1.psml");
769         locator.add("group", true, false, "group");
770         locators.put("group", locator);
771         requestContext = sessionContext.newRequestContext(locators);
772         assertNotNull(requestContext);
773         assertNull(requestContext.getMenu("no-such-menu"));
774         Menu topMenu3 = requestContext.getMenu("top");
775         assertNotNull(topMenu3);
776         assertTrue(topMenu == topMenu3);
777         Menu backMenu = requestContext.getMenu("back");
778         assertNotNull(backMenu);
779         assertTrue(backMenu.isEmpty());
780         assertNull(backMenu.getElements());
781         assertTrue(((MenuImpl)backMenu).isElementRelative());
782         assertEquals("back", backMenu.getName());
783         assertEquals("Back to", backMenu.getTitle());
784         assertEquals("Back to", backMenu.getShortTitle());
785         assertEquals("\u00bb", backMenu.getTitle(Locale.JAPANESE));
786         assertEquals("\u00bb", backMenu.getShortTitle(Locale.JAPANESE));
787         assertEquals("Back to", backMenu.getTitle(new Locale("xx")));
788         assertEquals("Back to", backMenu.getShortTitle(new Locale("xx")));
789         Menu breadcrumbsMenu = requestContext.getMenu("breadcrumbs");
790         assertNotNull(breadcrumbsMenu);
791         assertFalse(breadcrumbsMenu.isEmpty());
792         assertEquals("You are here:", breadcrumbsMenu.getTitle());
793         assertEquals("\u73fe\u5728\u30d1\u30b9\uff1a", breadcrumbsMenu.getTitle(Locale.JAPANESE));
794         navigationsMenu = requestContext.getMenu("navigations");
795         assertNotNull(navigationsMenu);
796         assertFalse(navigationsMenu.isEmpty());
797         List navigationsElements = navigationsMenu.getElements();
798         assertNotNull(navigationsElements);
799         assertEquals(6, navigationsElements.size());
800         menuElementsIter = navigationsElements.iterator();
801         while (menuElementsIter.hasNext())
802         {
803             MenuElement element = (MenuElement)menuElementsIter.next();
804             if (element.getElementType().equals(MenuElement.SEPARATOR_ELEMENT_TYPE) &&
805                 (element instanceof MenuSeparator) &&
806                 ((MenuSeparator)element).getText().equals("Folders"))
807             {
808             }
809             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("folder0"))
810             {
811                 assertTrue(element instanceof MenuOption);
812                 assertEquals(MenuOption.FOLDER_OPTION_TYPE, ((MenuOption)element).getType());
813             }
814             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("group folder1"))
815             {
816                 assertTrue(element instanceof MenuOption);
817                 assertEquals(MenuOption.FOLDER_OPTION_TYPE, ((MenuOption)element).getType());
818             }
819             else if (element.getElementType().equals(MenuElement.SEPARATOR_ELEMENT_TYPE) &&
820                      (element instanceof MenuSeparator) &&
821                      ((MenuSeparator)element).getText().equals("Additional Links"))
822             {
823             }
824             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/link1.link"))
825             {
826                 assertTrue(element instanceof MenuOption);
827                 assertEquals(MenuOption.LINK_OPTION_TYPE, ((MenuOption)element).getType());
828             }
829             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/link0.link"))
830             {
831                 assertTrue(element instanceof MenuOption);
832                 assertEquals(MenuOption.LINK_OPTION_TYPE, ((MenuOption)element).getType());
833                 assertEquals("left-navigations", element.getSkin());
834             }
835             else
836             {
837                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
838             }
839         }
840         assertEquals("left-navigations", navigationsMenu.getSkin());
841         assertTrue(((MenuImpl)navigationsMenu).isElementRelative());
842         Menu pagesMenu = requestContext.getMenu("pages");
843         assertNotNull(pagesMenu);
844         assertFalse(pagesMenu.isEmpty());
845         List pagesElements = pagesMenu.getElements();
846         assertNotNull(pagesElements);
847         assertEquals(3, pagesElements.size());
848         menuElementsIter = pagesElements.iterator();
849         while (menuElementsIter.hasNext())
850         {
851             MenuElement element = (MenuElement)menuElementsIter.next();
852             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/page2.psml"))
853             {
854                 assertTrue(element instanceof MenuOption);
855                 assertEquals("/page2.psml", ((MenuOption)element).getUrl());
856                 assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)element).getType());
857             }
858             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/page1.psml"))
859             {
860                 assertTrue(element instanceof MenuOption);
861                 assertEquals("/page1.psml", ((MenuOption)element).getUrl());
862             }
863             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/page0.psml"))
864             {
865                 assertTrue(element instanceof MenuOption);
866                 assertEquals("/page0.psml", ((MenuOption)element).getUrl());
867                 assertEquals("tabs", element.getSkin());
868             }
869             else
870             {
871                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
872             }
873         }
874         assertEquals("tabs", pagesMenu.getSkin());
875         assertTrue(((MenuImpl)pagesMenu).isElementRelative());
876 
877         // new request at /folder1
878         locator = new JetspeedProfileLocator();
879         locator.init(null, "/folder1");
880         locator.add("user", true, false, "user");
881         locator.add("mediatype", true, false, "html");
882         locators = new HashMap();
883         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
884         locator = new JetspeedProfileLocator();
885         locator.init(null, "/folder1");
886         locator.add("group", true, false, "group");
887         locators.put("group", locator);
888         requestContext = sessionContext.newRequestContext(locators);
889         assertNotNull(requestContext);
890         Menu backMenu2 = requestContext.getMenu("back");
891         assertNotNull(backMenu2);
892         assertFalse(backMenu2.isEmpty());
893         Menu topMenu4 = requestContext.getMenu("top");
894         assertNotNull(topMenu4);
895         assertTrue(topMenu != topMenu4);
896         Menu customMenu = requestContext.getMenu("custom");
897         assertNotNull(customMenu);
898         assertFalse(customMenu.isEmpty());
899         List customElements = customMenu.getElements();
900         assertNotNull(customElements);
901         assertEquals(12, customElements.size());
902         assertEquals("custom", customMenu.getName());
903         assertEquals("Top Menu", customMenu.getTitle());
904         assertEquals("Haut", customMenu.getTitle(Locale.FRENCH));
905         menuElementsIter = customElements.iterator();        
906         for (int i = 0; ((i < 2) && menuElementsIter.hasNext()); i++)
907         {
908             MenuElement element = (MenuElement)menuElementsIter.next();
909             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/link0.link"))
910             {
911                 assertTrue(element instanceof MenuOption);
912                 assertEquals("http://link0", ((MenuOption)element).getUrl());
913                 assertEquals(MenuOption.LINK_OPTION_TYPE, ((MenuOption)element).getType());
914             }
915             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/folder1/page1.psml"))
916             {
917                 assertTrue(element instanceof MenuOption);
918                 assertEquals("/folder1/page1.psml", ((MenuOption)element).getUrl());
919                 assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)element).getType());
920             }
921             else
922             {
923                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
924             }            
925         }
926         if (menuElementsIter.hasNext())
927         {
928             MenuElement element = (MenuElement)menuElementsIter.next();
929             if (element.getElementType().equals(MenuElement.MENU_ELEMENT_TYPE) && element.getTitle().equals("user root"))
930             {
931                 assertFalse(((Menu)element).isEmpty());
932                 List nestedElements = ((Menu)element).getElements();
933                 assertEquals(6, nestedElements.size());
934                 Iterator nestedElementsIter = nestedElements.iterator();
935                 if (nestedElementsIter.hasNext())
936                 {
937                     MenuElement nestedElement = (MenuElement)nestedElementsIter.next();
938                     if (nestedElement.getElementType().equals(MenuElement.SEPARATOR_ELEMENT_TYPE) &&
939                         (nestedElement instanceof MenuSeparator) &&
940                         ((MenuSeparator)nestedElement).getText().equals("=== Current Page ==="))
941                     {
942                     }
943                     else
944                     {
945                         fail("Unexpected nested menu element type/title: "+nestedElement.getElementType()+"/"+nestedElement.getTitle());
946                     }            
947                 }
948                 if (nestedElementsIter.hasNext())
949                 {
950                     MenuElement nestedElement = (MenuElement)nestedElementsIter.next();
951                     if (nestedElement.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) &&
952                         nestedElement.getTitle().equals("/folder1/page1.psml"))
953                     {
954                         assertTrue(nestedElement instanceof MenuOption);
955                         assertEquals("/folder1/page1.psml", ((MenuOption)nestedElement).getUrl());
956                         assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)nestedElement).getType());
957                     }
958                     else
959                     {
960                         fail("Unexpected nested menu element type/title: "+nestedElement.getElementType()+"/"+nestedElement.getTitle());
961                     }            
962                 }
963                 if (nestedElementsIter.hasNext())
964                 {
965                     MenuElement nestedElement = (MenuElement)nestedElementsIter.next();
966                     if (nestedElement.getElementType().equals(MenuElement.SEPARATOR_ELEMENT_TYPE) &&
967                         (nestedElement instanceof MenuSeparator) &&
968                         ((MenuSeparator)nestedElement).getText().equals("=== Top Pages ==="))
969                     {
970                         assertEquals("Top Pages", nestedElement.getTitle());
971                     }
972                     else
973                     {
974                         fail("Unexpected nested menu element type/title: "+nestedElement.getElementType()+"/"+nestedElement.getTitle());
975                     }            
976                 }
977                 for (int i = 0; ((i < 3) && nestedElementsIter.hasNext()); i++)
978                 {
979                     MenuElement nestedElement = (MenuElement)nestedElementsIter.next();
980                     if (nestedElement.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) &&
981                         nestedElement.getTitle().equals("/page2.psml"))
982                     {
983                         assertTrue(nestedElement instanceof MenuOption);
984                         assertEquals("/page2.psml", ((MenuOption)nestedElement).getUrl());
985                         assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)nestedElement).getType());
986                     }
987                     else if (nestedElement.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) &&
988                              nestedElement.getTitle().equals("/page1.psml"))
989                     {
990                         assertTrue(nestedElement instanceof MenuOption);
991                         assertEquals("/page1.psml", ((MenuOption)nestedElement).getUrl());
992                         assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)nestedElement).getType());
993                     }
994                     else if (nestedElement.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) &&
995                              nestedElement.getTitle().equals("/page0.psml"))
996                     {
997                         assertTrue(nestedElement instanceof MenuOption);
998                         assertEquals("/page0.psml", ((MenuOption)nestedElement).getUrl());
999                         assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)nestedElement).getType());
1000                     }
1001                     else
1002                     {
1003                         fail("Unexpected nested menu element type/title: "+nestedElement.getElementType()+"/"+nestedElement.getTitle());
1004                     }            
1005                 }
1006             }
1007             else
1008             {
1009                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
1010             }            
1011         }
1012         if (menuElementsIter.hasNext())
1013         {
1014             MenuElement element = (MenuElement)menuElementsIter.next();
1015             if (element.getElementType().equals(MenuElement.SEPARATOR_ELEMENT_TYPE) &&
1016                 (element instanceof MenuSeparator) &&
1017                 ((MenuSeparator)element).getText().equals("=== More Options ==="))
1018             {
1019             }
1020             else
1021             {
1022                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
1023             }            
1024         }
1025         for (int i = 0; ((i < 4) && menuElementsIter.hasNext()); i++)
1026         {
1027             MenuElement element = (MenuElement)menuElementsIter.next();
1028             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/link1.link"))
1029             {
1030                 assertTrue(element instanceof MenuOption);
1031                 assertEquals("http://link1", ((MenuOption)element).getUrl());
1032                 assertEquals(MenuOption.LINK_OPTION_TYPE, ((MenuOption)element).getType());
1033             }
1034             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/page2.psml"))
1035             {
1036                 assertTrue(element instanceof MenuOption);
1037                 assertEquals("/page2.psml", ((MenuOption)element).getUrl());
1038                 assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)element).getType());
1039             }
1040             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/page1.psml"))
1041             {
1042                 assertTrue(element instanceof MenuOption);
1043                 assertEquals("/page1.psml", ((MenuOption)element).getUrl());
1044                 assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)element).getType());
1045             }
1046             else if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/folder1/page1.psml"))
1047             {
1048                 assertTrue(element instanceof MenuOption);
1049                 assertEquals("/folder1/page1.psml", ((MenuOption)element).getUrl());
1050                 assertEquals(MenuOption.PAGE_OPTION_TYPE, ((MenuOption)element).getType());
1051             }
1052             else
1053             {
1054                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
1055             }            
1056         }
1057         if (menuElementsIter.hasNext())
1058         {
1059             MenuElement element = (MenuElement)menuElementsIter.next();
1060             if (element.getElementType().equals(MenuElement.SEPARATOR_ELEMENT_TYPE) &&
1061                 (element instanceof MenuSeparator) &&
1062                 ((MenuSeparator)element).getText().equals("=== Standard Menus ==="))
1063             {
1064             }
1065             else
1066             {
1067                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
1068             }            
1069         }
1070         if (menuElementsIter.hasNext())
1071         {
1072             MenuElement element = (MenuElement)menuElementsIter.next();
1073             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("user root"))
1074             {
1075                 assertTrue(element instanceof MenuOption);
1076                 assertEquals("/", ((MenuOption)element).getUrl());
1077                 assertEquals(MenuOption.FOLDER_OPTION_TYPE, ((MenuOption)element).getType());
1078             }
1079             else
1080             {
1081                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
1082             }            
1083         }
1084         if (menuElementsIter.hasNext())
1085         {
1086             MenuElement element = (MenuElement)menuElementsIter.next();
1087             if (element.getElementType().equals(MenuElement.MENU_ELEMENT_TYPE) && element.getTitle().equals("navigations"))
1088             {
1089                 assertTrue(element instanceof Menu);
1090                 assertEquals("navigations", ((Menu)element).getName());
1091             }
1092             else
1093             {
1094                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
1095             }            
1096         }
1097         if (menuElementsIter.hasNext())
1098         {
1099             MenuElement element = (MenuElement)menuElementsIter.next();
1100             if (element.getElementType().equals(MenuElement.MENU_ELEMENT_TYPE) && element.getTitle().equals("pages"))
1101             {
1102                 assertTrue(element instanceof Menu);
1103                 assertEquals("pages", ((Menu)element).getName());
1104             }
1105             else
1106             {
1107                 fail("Unexpected menu element type/title: "+element.getElementType()+"/"+element.getTitle());
1108             }            
1109         }
1110     }
1111 
1112     /***
1113      * testPortalSiteHiddenPageMenus - Test PortalSite menu generation for hidden pages
1114      *
1115      * @throws Exception
1116      */
1117     public void testPotalSiteHiddenPageMenus() throws Exception
1118     {
1119         assertNotNull(portalSite);
1120         PortalSiteSessionContext sessionContext = portalSite.newSessionContext();
1121         assertNotNull(sessionContext);
1122 
1123         // first request at /: hidden page suppressed
1124         JetspeedProfileLocator locator = new JetspeedProfileLocator();
1125         locator.init(null, "/");
1126         locator.add("user", true, false, "user");
1127         Map locators = new HashMap();
1128         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
1129         PortalSiteRequestContext requestContext = sessionContext.newRequestContext(locators);
1130         assertNotNull(requestContext);
1131         Menu topMenu = requestContext.getMenu("top");
1132         assertNotNull(topMenu);
1133         assertFalse(topMenu.isEmpty());
1134         List topMenuElements = topMenu.getElements();
1135         assertNotNull(topMenuElements);
1136         Iterator menuElementsIter = topMenuElements.iterator();
1137         boolean hiddenElement = false;
1138         while (menuElementsIter.hasNext())
1139         {
1140             MenuElement element = (MenuElement)menuElementsIter.next();
1141             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/hidden.psml"))
1142             {
1143                 hiddenElement = true;
1144             }
1145         }
1146         assertFalse(hiddenElement);
1147         Menu pagesMenu = requestContext.getMenu("pages");
1148         assertNotNull(pagesMenu);
1149         assertFalse(pagesMenu.isEmpty());
1150         List pagesElements = pagesMenu.getElements();
1151         assertNotNull(pagesElements);
1152         menuElementsIter = pagesElements.iterator();
1153         hiddenElement = false;
1154         while (menuElementsIter.hasNext())
1155         {
1156             MenuElement element = (MenuElement)menuElementsIter.next();
1157             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/hidden.psml"))
1158             {
1159                 hiddenElement = true;
1160             }
1161         }
1162         assertFalse(hiddenElement);
1163 
1164         // second request at /hidden.psml: hidden page visible
1165         locator = new JetspeedProfileLocator();
1166         locator.init(null, "/hidden.psml");
1167         locator.add("user", true, false, "user");
1168         locators = new HashMap();
1169         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
1170         requestContext = sessionContext.newRequestContext(locators);
1171         assertNotNull(requestContext);
1172         topMenu = requestContext.getMenu("top");
1173         assertNotNull(topMenu);
1174         assertFalse(topMenu.isEmpty());
1175         topMenuElements = topMenu.getElements();
1176         assertNotNull(topMenuElements);
1177         menuElementsIter = topMenuElements.iterator();
1178         hiddenElement = false;
1179         while (menuElementsIter.hasNext())
1180         {
1181             MenuElement element = (MenuElement)menuElementsIter.next();
1182             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/hidden.psml"))
1183             {
1184                 hiddenElement = true;
1185             }
1186         }
1187         assertTrue(hiddenElement);
1188         pagesMenu = requestContext.getMenu("pages");
1189         assertNotNull(pagesMenu);
1190         assertFalse(pagesMenu.isEmpty());
1191         pagesElements = pagesMenu.getElements();
1192         assertNotNull(pagesElements);
1193         menuElementsIter = pagesElements.iterator();
1194         hiddenElement = false;
1195         while (menuElementsIter.hasNext())
1196         {
1197             MenuElement element = (MenuElement)menuElementsIter.next();
1198             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/hidden.psml"))
1199             {
1200                 hiddenElement = true;
1201             }
1202         }
1203         assertTrue(hiddenElement);
1204 
1205         // third request at /: hidden page suppressed
1206         locator = new JetspeedProfileLocator();
1207         locator.init(null, "/");
1208         locator.add("user", true, false, "user");
1209         locators = new HashMap();
1210         locators.put(ProfileLocator.PAGE_LOCATOR, locator);
1211         requestContext = sessionContext.newRequestContext(locators);
1212         assertNotNull(requestContext);
1213         topMenu = requestContext.getMenu("top");
1214         assertNotNull(topMenu);
1215         assertFalse(topMenu.isEmpty());
1216         topMenuElements = topMenu.getElements();
1217         assertNotNull(topMenuElements);
1218         menuElementsIter = topMenuElements.iterator();
1219         hiddenElement = false;
1220         while (menuElementsIter.hasNext())
1221         {
1222             MenuElement element = (MenuElement)menuElementsIter.next();
1223             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/hidden.psml"))
1224             {
1225                 hiddenElement = true;
1226             }
1227         }
1228         assertFalse(hiddenElement);
1229         pagesMenu = requestContext.getMenu("pages");
1230         assertNotNull(pagesMenu);
1231         assertFalse(pagesMenu.isEmpty());
1232         pagesElements = pagesMenu.getElements();
1233         assertNotNull(pagesElements);
1234         menuElementsIter = pagesElements.iterator();
1235         hiddenElement = false;
1236         while (menuElementsIter.hasNext())
1237         {
1238             MenuElement element = (MenuElement)menuElementsIter.next();
1239             if (element.getElementType().equals(MenuElement.OPTION_ELEMENT_TYPE) && element.getTitle().equals("/hidden.psml"))
1240             {
1241                 hiddenElement = true;
1242             }
1243         }
1244         assertFalse(hiddenElement);
1245     }
1246 
1247     /***
1248      * extractFileSystemPathFromId - utility to convert proxy ids to file system paths
1249      *
1250      * @param id proxy node id
1251      * @return files system path
1252      */
1253     private String extractFileSystemPathFromId(String id)
1254     {
1255         if ((id != null) && !id.equals(Folder.PATH_SEPARATOR) && id.endsWith(Folder.PATH_SEPARATOR))
1256         {
1257             return id.substring(0, id.length() - 1);
1258         }
1259         return id;
1260     }
1261 
1262     /***
1263      * extractLocatorNameFromProxy - utility to access profile locator name from proxy
1264      *
1265      * @param proxy site view node proxy
1266      * @return locator name
1267      */
1268     private String extractLocatorNameFromProxy(Object proxy) throws Exception
1269     {
1270         return ((NodeProxy)Proxy.getInvocationHandler(proxy)).getLocatorName();
1271     }
1272 }