All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.openejb.webadmin.clienttools.InvokeObjectBean Maven / Gradle / Ivy

The newest version!
/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.openejb.webadmin.clienttools;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.apache.openejb.webadmin.HttpRequest;
import org.apache.openejb.webadmin.HttpResponse;
import org.apache.openejb.webadmin.HttpSession;
import org.apache.openejb.webadmin.WebAdminBean;
import org.apache.openejb.webadmin.HttpHome;

import javax.ejb.Stateless;
import javax.ejb.RemoteHome;

/**
 * @author David Blevins
 */
@Stateless(name = "ClientTools/ViewJndi")
@RemoteHome(HttpHome.class)
public class InvokeObjectBean extends WebAdminBean implements Constants {

    private PrintWriter out;
    private static String invLock = "lock";
    private static int invCount;

    private HttpSession session;

    public void preProcess(HttpRequest request, HttpResponse response)
        throws IOException {
    }

    public void postProcess(HttpRequest request, HttpResponse response)
        throws IOException {
    }

    public void writeHtmlTitle(PrintWriter out) throws IOException {
        out.write("Client Tools -- Object Invoker");
    }

    public void writePageTitle(PrintWriter out) throws IOException {
        out.write("Object Invoker");
    }

    public void writeBody(PrintWriter out) throws IOException {
        this.out = out;
        try{
            synchronized (this) {
                main(request.getSession(), out);
            }
        } catch (Exception e){
            out.println("FAIL");
            //throw e;
            return;
        }
    }

    class Invocation {

        protected String id = "inv";
        protected String objID;
        protected Class clazz;
        protected Object target;
        protected Method method;
        protected Object[] args;
        protected Object result;

        protected Invocation(){
            synchronized (invLock){
                id += ++invCount;
            }
        }

        public Object invoke() throws Exception{
            if (target == null || method == null || args == null) {
                throw new Exception("This invocation contains null objects.");
            }
            return method.invoke(target,args);
        }
    }

    /**
     * The main method of this JSP
     */
    public void main(HttpSession session, PrintWriter out) throws Exception{
        this.session = session;
        this.out = out;

        printObjectSection();
    }

    /**
     * Print the list of objects with the focused object as
     * selected in the box.
     * If no object is selected, make an entry called "Pick an Object"
     */
    public void printObjectSection() throws Exception{
        String removeID = request.getQueryParameter("remove");
        if (removeID != null) {
            removeObject(removeID);
        }

        Invocation inv = null;
        String invID = request.getQueryParameter("inv");

        if (invID == null) {
            String objID = request.getQueryParameter("obj");
            if (objID != null) {
                inv = new Invocation();
                inv.target = getObject(objID);
                inv.objID = objID;
                setInvocation(inv.id,inv);
            }
        } else {
            inv = getInvocation(invID);
        }

        if (inv == null || inv.target == null) {
            // Pick from the list
            printObjectList();

        } else {
            out.print("Object:
"); out.print(tab+inv.objID+" [change]

"); // Show the selected item and continue printMethodSection(inv); } } /** * Prints the list of objects that can be invoked */ public void printObjectList() throws Exception{ HashMap objects = getObjectMap(); if (objects.size() == 0){ out.print("No object have been created
"); out.print(""); printRow(pepperImg,"Browse for an EJB"); out.print("
"); } else { out.print("Pick and object to invoke
"); //out.print("Objects:
"); Set keys = objects.keySet(); Iterator iterator = keys.iterator(); out.print(""); while (iterator.hasNext()) { String entry = (String)iterator.next(); printRow(tab+""+entry+"", "[remove]"); } out.print("
"); } } /** * Print the list of methods with the focused method as * selected in the box. * If no method is selected, make an entry called "Pick a Method" */ public void printMethodSection(Invocation inv) throws Exception{ String methodID = request.getQueryParameter("m"); if (methodID != null) { int method = Integer.parseInt(methodID); Method[] methods = inv.clazz.getMethods(); if (method > -1 && method < methods.length) { inv.method = methods[method]; } else { inv.method = null; inv.args = null; } } if (inv.method == null) { // Pick from the list printMethodList(inv); } else { out.print("Method:
"); out.print(tab+formatMethod(inv.method)+" [change]

"); // Show the selected item and continue printArgumentSection(inv); } } /** * Prints the list of methods that can be invoked */ public void printMethodList(Invocation inv) throws Exception{ out.print("Pick a method to invoke
"); //out.print("Methods:
"); Object obj = inv.target; Class clazz = inv.target.getClass(); if (obj instanceof javax.ejb.EJBHome) { clazz = obj.getClass().getInterfaces()[0]; } else if (obj instanceof javax.ejb.EJBObject) { clazz = obj.getClass().getInterfaces()[0]; } else { clazz = obj.getClass(); } inv.clazz = clazz; out.print(""); Method[] methods = clazz.getMethods(); for (int i=0; i < methods.length; i++){ Method m = methods[i]; if (Modifier.isPublic(m.getModifiers())){ out.print(""); } } out.print("
"); out.print(tab+""+formatMethod(m)+"
"); out.print("
"); } /** * Print the list of arguments. * If no arguments have been selected, * show the argument entry form. */ public void printArgumentSection(Invocation inv) throws Exception{ String args = request.getQueryParameter("args"); if (args != null) { parseArgs(inv); } if (inv.method.getParameterTypes().length == 0) { inv.args = new Object[]{}; } if (inv.args == null) { printArgumentList(inv); } else { out.print("Arguments:
"); if (inv.args.length == 0) { out.print(tab+"none
"); } for (int i=0; i < inv.args.length; i++){ String val = formatObject(inv.args[i]); out.print(tab+"arg"+i+"  "+val+"
"); } out.print("
"); printInvokeSection(inv); } } public void parseArgs(Invocation inv) throws Exception{ Class[] pTypes = inv.method.getParameterTypes(); inv.args = new Object[pTypes.length]; for (int i=0; i < pTypes.length; i++){ Class type = pTypes[i]; String unparsedArg = request.getQueryParameter("arg"+i); inv.args[i] = getConverter(type).convert(type, unparsedArg); } } public void printArgumentList(Invocation inv) throws Exception{ out.print("Fill in the arguments
"); Class[] pTypes = inv.method.getParameterTypes(); out.print("
"); out.print(""); out.print(""); for (int i=0; i < pTypes.length; i++){ Converter con = getConverter(pTypes[i]); out.print(""); out.print(""); out.print(""); out.print(""); } out.print("
"); out.print(tab+getShortClassRef(pTypes[i])); out.print(""); out.print("  arg"+i); out.print(""); out.print("  "+con.getInputControl(i,pTypes[i])); out.print("
"); out.print("

"); out.print(""); out.print("
"); } /** * Print the list of arguments. * If no arguments have been selected, * show the argument entry form. */ public void printInvokeSection(Invocation inv) throws Exception{ String doInvoke = request.getQueryParameter("invoke"); if (doInvoke != null) { invoke(inv); } else { out.print("
"); out.print(""); out.print(""); out.print("
"); } } String pepperImg = ""; public void invoke(Invocation inv) throws Exception{ try{ inv.result = inv.invoke(); out.print("Result:
"); if (inv.method.getReturnType() == java.lang.Void.TYPE) { out.print(tab+"Done"); } else if (inv.result == null) { out.print(tab+"null"); } else { String clazz = inv.result.getClass().getName(); String objID = getObjectID(inv.result); setObject(objID,inv.result); out.print(""); printRow("id",objID); printRow("class",""+clazz+""); printRow("toString",formatObject(inv.result)); out.print("
"); out.print("

Actions:
"); out.print(""); String invokerURL = "Invoke a method on the object"; printRow(pepperImg,invokerURL); String discardURL = "Discard the object"; printRow(pepperImg,discardURL); out.print("
"); } } catch (InvocationTargetException e){ out.print("Exception:

"); Throwable t = e.getTargetException(); out.print("Received a "+t.getClass().getName()); //out.print(inv.method+"

"); if (t instanceof java.rmi.RemoteException) { out.print(" [Tip]

"); java.rmi.RemoteException re = (java.rmi.RemoteException)t; out.print("RemoteException message:
"); out.print(t.getMessage()+"

"); out.print("Nested exception's stack trace:
"); while (t instanceof java.rmi.RemoteException) { t = ((java.rmi.RemoteException)t).detail; } out.print(formatThrowable(t)); } else { out.print("

"+formatThrowable(t)); } } catch (Throwable e){ out.print("Exception:

"); out.print(formatObject(e)); } } public String formatThrowable(Throwable err) throws Exception{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); err.printStackTrace(new PrintStream(baos)); byte[] bytes = baos.toByteArray(); StringBuffer sb = new StringBuffer(bytes.length); for (int i=0; i < bytes.length; i++){ char c = (char)bytes[i]; switch (c) { case ' ': sb.append(" "); break; case '\n': sb.append("
"); break; case '\r': break; default: sb.append(c); } } return sb.toString(); } public String formatObject(Object obj) throws Exception{ int max = 75; String val = obj.toString(); val = (val.length() > max)? val.substring(0,max-3)+"...":val; char[] chars = new char[val.length()]; val.getChars(0,chars.length,chars,0); StringBuffer sb = new StringBuffer(chars.length); for (int j=0; j < chars.length; j++){ char c = chars[j]; switch (c) { case '<': sb.append("<"); break; case '>': sb.append(">"); break; case '&': sb.append("&"); break; default: sb.append(c); } } return sb.toString(); } /*-----------------------------------------------------------*/ // Method name formatting /*-----------------------------------------------------------*/ public String formatMethod(Method m) throws Exception { StringBuffer sb = new StringBuffer(); sb.append(getShortClassName(m.getReturnType())+"  "); sb.append(m.getName()); Class[] params = m.getParameterTypes(); sb.append("("); for (int j=0; j < params.length; j++){ sb.append(getShortClassName(params[j])); if (j != params.length-1) { sb.append(", "); } } sb.append(")"); Class[] excp = m.getExceptionTypes(); if (excp.length > 0) { sb.append(" throws "); for (int j=0; j < excp.length; j++){ sb.append(getShortClassName(excp[j])); if (j != excp.length-1) { sb.append(", "); } } } return sb.toString(); } /*-----------------------------------------------------------*/ // Class name formatting /*-----------------------------------------------------------*/ public String getShortClassName(Class clazz) throws Exception { if (clazz.isPrimitive()) { return clazz.getName(); } else if (clazz.isArray() && clazz.getComponentType().isPrimitive()) { return clazz.getComponentType()+"[]"; } else if (clazz.isArray()) { String name = clazz.getComponentType().getName(); int dot = name.lastIndexOf(".")+1; String shortName = name.substring(dot,name.length()); return shortName+"[]"; } else { String name = clazz.getName(); int dot = name.lastIndexOf(".")+1; String shortName = name.substring(dot,name.length()); return shortName; } } public String getShortClassRef(Class clazz) throws Exception { if (clazz.isPrimitive()) { return ""+clazz.getName()+""; } else if (clazz.isArray() && clazz.getComponentType().isPrimitive()) { return ""+clazz.getComponentType()+"[]"; } else if (clazz.isArray()) { String name = clazz.getComponentType().getName(); int dot = name.lastIndexOf(".")+1; String shortName = name.substring(dot,name.length()); return ""+shortName+"[]"; } else { String name = clazz.getName(); int dot = name.lastIndexOf(".")+1; String shortName = name.substring(dot,name.length()); return ""+shortName+""; } } protected void printRow(String col1, String col2) throws Exception{ out.print("" ); out.print(col1); out.print(""); out.print(col2); out.print(""); } /*-----------------------------------------------------------*/ // Object list support /*-----------------------------------------------------------*/ public String getObjectID(Object obj){ Class clazz = obj.getClass(); if (obj instanceof javax.ejb.EJBHome) { clazz = obj.getClass().getInterfaces()[0]; } else if (obj instanceof javax.ejb.EJBObject) { clazz = obj.getClass().getInterfaces()[0]; } return clazz.getName()+"@"+obj.hashCode(); } public Object getObject(String objID){ return getObjectMap().get(objID); } public void setObject(String objID, Object obj){ getObjectMap().put(objID, obj); } public void removeObject(String objID){ getObjectMap().remove(objID); } public HashMap getObjectMap(){ HashMap objects = (HashMap)session.getAttribute("objects"); if (objects == null) { objects = new HashMap(); session.setAttribute("objects",objects); } return objects; } /*-----------------------------------------------------------*/ // Invocation list support /*-----------------------------------------------------------*/ public Invocation getInvocation(String invID) { return (Invocation)getInvocationMap().get(invID); } public void setInvocation(String invID, Invocation obj){ getInvocationMap().put(invID, obj); } public HashMap getInvocationMap(){ HttpSession session = request.getSession(); HashMap invocations = (HashMap)session.getAttribute("invocations"); if (invocations == null) { invocations = new HashMap(); session.setAttribute("invocations",invocations); } return invocations; } /*-----------------------------------------------------------*/ // String conversion support /*-----------------------------------------------------------*/ final HashMap converters = initConverters(); public Converter getConverter(Class type){ Converter con = (Converter) converters.get(type); if (con == null) { con = defaultConverter; } return con; } final Converter defaultConverter = new ObjectConverter(); private HashMap initConverters(){ HashMap map = new HashMap(); map.put(String.class, new StringConverter()); map.put(Character.class, new CharacterConverter()); map.put(Boolean.class, new BooleanConverter()); map.put(Byte.class, new ByteConverter()); map.put(Short.class, new ShortConverter()); map.put(Integer.class, new IntegerConverter()); map.put(Long.class, new LongConverter()); map.put(Float.class, new FloatConverter()); map.put(Double.class, new DoubleConverter()); map.put(Object.class, new ObjectConverter()); map.put(Character.TYPE, map.get(Character.class)); map.put(Boolean.TYPE, map.get(Boolean.class)); map.put(Byte.TYPE, map.get(Byte.class)); map.put(Short.TYPE, map.get(Short.class)); map.put(Integer.TYPE, map.get(Integer.class)); map.put(Long.TYPE, map.get(Long.class)); map.put(Float.TYPE, map.get(Float.class)); map.put(Double.TYPE, map.get(Double.class)); return map; } abstract class Converter { public abstract Object convert(Class type, String raw) throws Exception; public String getInputControl(int argNumber, Class type) throws Exception{ return ""; } } class StringConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return raw; } } class CharacterConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return new Character(raw.charAt(0)); } } class BooleanConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return new Boolean(raw); } } class ByteConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return new Byte(raw); } } class ShortConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return new Short(raw); } } class IntegerConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return new Integer(raw); } } class LongConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return new Long(raw); } } class FloatConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return new Float(raw); } } class DoubleConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return new Double(raw); } } class ObjectConverter extends Converter{ public Object convert(Class type, String raw) throws Exception { return raw; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy