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.page.Link;
025: import org.apache.jetspeed.page.document.proxy.NodeProxy;
026: import org.apache.jetspeed.portalsite.view.SiteView;
027:
028: /**
029: * This class proxies PSML Link instances to create a logical view
030: * of site content using the Dynamic Proxy pattern.
031: *
032: * @author <a href="mailto:rwatler@apache.org">Randy Watler</a>
033: * @version $Id: LinkProxy.java 517121 2007-03-12 07:45:49Z ate $
034: */
035: public class LinkProxy extends NodeProxy implements InvocationHandler {
036: /**
037: * link - proxy delegate link instance
038: */
039: private Link link;
040:
041: /**
042: * newInstance - creates a new proxy instance that implements the Link interface
043: *
044: * @param view site view owner of this proxy
045: * @param locatorName name of profile locator associated
046: * with the proxy delegate
047: * @param parentFolder view parent proxy folder
048: * @param link proxy delegate
049: */
050: public static Link newInstance(SiteView view, String locatorName,
051: Folder parentFolder, Link link) {
052: return (Link) Proxy.newProxyInstance(link.getClass()
053: .getClassLoader(), new Class[] { Link.class },
054: new LinkProxy(view, locatorName, parentFolder, link));
055: }
056:
057: /**
058: * LinkProxy - private constructor used by newInstance()
059: *
060: * @param view site view owner of this proxy
061: * @param locatorName name of profile locator associated
062: * with the proxy delegate
063: * @param parentFolder view parent proxy folder
064: * @param link proxy delegate
065: */
066: private LinkProxy(SiteView view, String locatorName,
067: Folder parentFolder, Link link) {
068: super (view, locatorName, parentFolder, link.getName(), link
069: .isHidden());
070: this .link = link;
071: }
072:
073: /**
074: * invoke - method invocation dispatch for this proxy, (defaults to
075: * invocation of delegate unless method is implemented in this
076: * proxy handler or should be hidden/stubbed)
077: *
078: * @param proxy instance invoked against
079: * @param method Link interface method invoked
080: * @param args method arguments
081: * @throws Throwable
082: */
083: public Object invoke(Object proxy, Method m, Object[] args)
084: throws Throwable {
085: // proxy implementation method dispatch
086: if (m.equals(GET_PARENT_METHOD)) {
087: return getParent();
088: } else if (m.equals(GET_PATH_METHOD)) {
089: return getPath();
090: } else if (m.equals(EQUALS_METHOD)) {
091: return new Boolean(equals(args[0]));
092: } else if (m.equals(HASH_CODE_METHOD)) {
093: return new Integer(hashCode());
094: } else if (m.equals(IS_HIDDEN_METHOD)) {
095: return new Boolean(isHidden());
096: } else if (m.equals(TO_STRING_METHOD)) {
097: return toString();
098: }
099:
100: // proxy suppression of not implemented or mutable methods
101: if (m.getName().startsWith("set")) {
102: throw new RuntimeException(
103: "Link instance is immutable from proxy.");
104: }
105:
106: // attempt to invoke method on delegate Link instance
107: return m.invoke(link, args);
108: }
109:
110: /**
111: * getLink - get proxy delegate link instance
112: *
113: * @return delegate link
114: */
115: public Link getLink() {
116: return link;
117: }
118: }
|