/*******************************************************************************
* Copyright (c) 2007-2008 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.vpe.jsf.template;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.NodeList;
/**
* @author Sergey Dzmitrovich
*
*/
public class JsfTemplateInvocationHandler implements InvocationHandler {
private static String KEY_WORD = "Offset"; //$NON-NLS-1$
private int offset;
private Object nodeItem;
public static NodeList createNodeListProxy(Object nodeList, int offset) {
Class<?>[] classes = { NodeList.class };
return (NodeList) Proxy.newProxyInstance(nodeList.getClass()
.getClassLoader(), classes, new JsfTemplateInvocationHandler(
nodeList, offset));
}
public static Object createNodeItemProxy(Object nodeItem, int offset) {
Class<?>[] classes = new Class<?>[1];
if (nodeItem instanceof IDOMElement)
classes[0] = IDOMElement.class;
else if (nodeItem instanceof IDOMAttr)
classes[0] = IDOMAttr.class;
else if (nodeItem instanceof IDOMNode)
classes[0] = IDOMNode.class;
else if (nodeItem instanceof NamedNodeMap)
classes[0] = NamedNodeMap.class;
else
return null;
return Proxy.newProxyInstance(nodeItem.getClass().getClassLoader(),
classes, new JsfTemplateInvocationHandler(nodeItem, offset));
}
private JsfTemplateInvocationHandler(Object nodeItem, int offset) {
this.offset = offset;
this.nodeItem = nodeItem;
}
/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(nodeItem, args);
if (method.getReturnType() == NodeList.class)
return JsfTemplateInvocationHandler.createNodeListProxy(result,
offset);
if ((result instanceof IDOMNode) || (result instanceof NamedNodeMap))
return JsfTemplateInvocationHandler.createNodeItemProxy(result,
offset);
if ((result instanceof Integer)
&& (method.getName().contains(KEY_WORD))) {
return Integer.valueOf(((Integer) result).intValue() + offset);
}
return result;
}
}