/* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.xml.internal.ws.model; import java.lang.reflect.*; /** * Creates vm signature string from Type * * TypeSignature: Z | C | B | S | I | F | J | D | FieldTypeSignature * FieldTypeSignature: ClassTypeSignature | [ TypeSignature | TypeVar * ClassTypeSignature: L Id ( / Id )* TypeArgs? ( . Id TypeArgs? )* ; * TypeArgs: < TypeArg+ > * TypeArg: * | ( + | - )? FieldTypeSignature * TypeVar: T Id ; * * @author Jitendra Kotamraju */ final class FieldSignature { static String vms(Type t) { if (t instanceof Class && ((Class)t).isPrimitive()) { Class c = (Class)t; if (c == Integer.TYPE) { return "I"; } else if (c == Void.TYPE) { return "V"; } else if (c == Boolean.TYPE) { return "Z"; } else if (c == Byte.TYPE) { return "B"; } else if (c == Character.TYPE) { return "C"; } else if (c == Short.TYPE) { return "S"; } else if (c == Double.TYPE) { return "D"; } else if (c == Float.TYPE) { return "F"; } else if (c == Long.TYPE) { return "J"; } } else if (t instanceof Class && ((Class)t).isArray()) { return "["+vms(((Class)t).getComponentType()); } else if (t instanceof Class || t instanceof ParameterizedType) { return "L"+fqcn(t)+";"; } else if (t instanceof GenericArrayType) { return "["+vms(((GenericArrayType)t).getGenericComponentType()); } else if (t instanceof TypeVariable) { // While creating wrapper bean fields, it doesn't create with TypeVariables // Otherwise, the type variable need to be declared in the wrapper bean class // return "T"+((TypeVariable)t).getName()+";"; return "Ljava/lang/Object;"; } else if (t instanceof WildcardType) { WildcardType w = (WildcardType)t; if (w.getLowerBounds().length > 0) { return "-"+vms(w.getLowerBounds()[0]); } else if (w.getUpperBounds().length > 0) { Type wt = w.getUpperBounds()[0]; if (wt.equals(Object.class)) { return "*"; } else { return "+"+vms(wt); } } } throw new IllegalArgumentException("Illegal vms arg " + t); } private static String fqcn(Type t) { if (t instanceof Class) { Class c = (Class)t; if (c.getDeclaringClass() == null) { return c.getName().replace('.', '/'); } else { return fqcn(c.getDeclaringClass())+"$"+c.getSimpleName(); } } else if (t instanceof ParameterizedType) { ParameterizedType p = (ParameterizedType)t; if (p.getOwnerType() == null) { return fqcn(p.getRawType())+args(p); } else { assert p.getRawType() instanceof Class; return fqcn(p.getOwnerType())+"."+ ((Class)p.getRawType()).getSimpleName()+args(p); } } throw new IllegalArgumentException("Illegal fqcn arg = "+t); } private static String args(ParameterizedType p) { StringBuilder sig = new StringBuilder("<"); for(Type t : p.getActualTypeArguments()) { sig.append(vms(t)); } return sig.append(">").toString(); } }