001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.jetspeed.om.page.proxy;
018:
019: import java.lang.reflect.InvocationHandler;
020: import java.lang.reflect.Method;
021: import java.lang.reflect.Proxy;
022:
023: import org.apache.jetspeed.om.folder.Folder;
024: import org.apache.jetspeed.om.folder.proxy.FolderProxy;
025: import org.apache.jetspeed.om.page.Page;
026: import org.apache.jetspeed.page.document.proxy.NodeProxy;
027: import org.apache.jetspeed.portalsite.view.SiteView;
028:
029: /**
030: * This class proxies PSML Page instances to create a logical view
031: * of site content using the Dynamic Proxy pattern.
032: *
033: * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
034: * @version $Id: PageProxy.java 517121 2007-03-12 07:45:49Z ate $
035: */
036: public class PageProxy extends NodeProxy implements InvocationHandler {
037: /**
038: * *_METHOD - Page method constants
039: */
040: protected static final Method GET_MENU_DEFINITIONS_METHOD = reflectMethod(
041: Page.class, "getMenuDefinitions", null);
042:
043: /**
044: * page - proxy delegate page instance
045: */
046: private Page page;
047:
048: /**
049: * newInstance - creates a new proxy instance that implements the Page interface
050: *
051: * @param view site view owner of this proxy
052: * @param locatorName name of profile locator associated
053: * with the proxy delegate
054: * @param parentFolder view parent proxy folder
055: * @param page proxy delegate
056: */
057: public static Page newInstance(SiteView view, String locatorName,
058: Folder parentFolder, Page page) {
059: return (Page) Proxy.newProxyInstance(page.getClass()
060: .getClassLoader(), new Class[] { Page.class },
061: new PageProxy(view, locatorName, parentFolder, page));
062: }
063:
064: /**
065: * PageProxy - private constructor used by newInstance()
066: *
067: * @param view site view owner of this proxy
068: * @param locatorName name of profile locator associated
069: * with the proxy delegate
070: * @param parentFolder view parent proxy folder
071: * @param page proxy delegate
072: */
073: private PageProxy(SiteView view, String locatorName,
074: Folder parentFolder, Page page) {
075: super (view, locatorName, parentFolder, page.getName(), page
076: .isHidden());
077: this .page = page;
078: }
079:
080: /**
081: * invoke - method invocation dispatch for this proxy, (defaults to
082: * invocation of delegate unless method is implemented in this
083: * proxy handler or should be hidden/stubbed)
084: *
085: * @param proxy instance invoked against
086: * @param method Page interface method invoked
087: * @param args method arguments
088: * @throws Throwable
089: */
090: public Object invoke(Object proxy, Method m, Object[] args)
091: throws Throwable {
092: // proxy implementation method dispatch
093: if (m.equals(GET_MENU_DEFINITIONS_METHOD)) {
094: return getMenuDefinitions();
095: } else if (m.equals(GET_PARENT_METHOD)) {
096: return getParent();
097: } else if (m.equals(GET_PATH_METHOD)) {
098: return getPath();
099: } else if (m.equals(GET_URL_METHOD)) {
100: return getUrl();
101: } else if (m.equals(EQUALS_METHOD)) {
102: return new Boolean(equals(args[0]));
103: } else if (m.equals(HASH_CODE_METHOD)) {
104: return new Integer(hashCode());
105: } else if (m.equals(IS_HIDDEN_METHOD)) {
106: return new Boolean(isHidden());
107: } else if (m.equals(TO_STRING_METHOD)) {
108: return toString();
109: }
110:
111: // proxy suppression of not implemented or mutable methods
112: if (m.getName().startsWith("set")) {
113: throw new RuntimeException(
114: "Page instance is immutable from proxy.");
115: }
116:
117: // attempt to invoke method on delegate Page instance
118: return m.invoke(page, args);
119: }
120:
121: /**
122: * getPage - get proxy delegate page instance
123: *
124: * @return delegate page
125: */
126: public Page getPage() {
127: return page;
128: }
129:
130: /**
131: * aggregateMenuDefinitionLocators - aggregate all menu definition locators
132: * in site view for this folder or page
133: */
134: protected void aggregateMenuDefinitionLocators() {
135: // merge page and parent folder menu definition locators
136: // by name, (most specific page definitions are merged first
137: // since they override any folder definitions); note parent
138: // folder menu definitions include standard menu definition
139: // locator defaults
140: mergeMenuDefinitionLocators(page.getMenuDefinitions(), page);
141: FolderProxy parentFolderProxy = (FolderProxy) Proxy
142: .getInvocationHandler(getParent());
143: mergeMenuDefinitionLocators(parentFolderProxy
144: .getMenuDefinitionLocators());
145: }
146: }
|