/* * Copyright (C) 2008 the original author or authors. * * Licensed 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.codehaus.plexus.metadata.ann; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import java.util.Map; import org.objectweb.asm.Type; /** * @author Eugene Kuleshov */ public class AnnInvocationHandler implements InvocationHandler { private final Ann ann; private final ClassLoader cl; private final Class<?> c; public AnnInvocationHandler(Ann ann, ClassLoader cl, Class<?> c) { this.ann = ann; this.cl = cl; this.c = c; } public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { String name = m.getName(); if("toString".equals(name)) { StringBuffer sb = new StringBuffer(ann.getType()); sb.append("["); String sep = ""; for(Map.Entry<String, Object> e : ann.getParams().entrySet()) { // TODO conversion for class, array, enum, and annotation types sb.append(sep).append(e.getKey()+"="+e.getValue()); sep = "; "; } sb.append("]"); return sb.toString(); } Object value = ann.getParams().get(name); if(value!=null) { if(value instanceof Type) { String className = ((Type) value).getClassName(); try { return Class.forName(className, false, cl); } catch(ClassNotFoundException ex) { if(cl instanceof URLClassLoader) { URL[] urls = ((URLClassLoader) cl).getURLs(); throw new RuntimeException("Unable to load class " + className + " from " + Arrays.toString(urls), ex); } throw new RuntimeException("Unable to load class " + className + " from " + cl, ex); } } // TODO conversion for class, array, enum, and annotation types return value; } else { Method am = c.getDeclaredMethod(m.getName(), m.getParameterTypes()); return am.getDefaultValue(); } } }