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