427 lines
14 KiB
Java
427 lines
14 KiB
Java
/*
|
|
* Copyright (c) 1997, 2011, 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.codemodel.internal;
|
|
|
|
|
|
import java.lang.annotation.Annotation;
|
|
import java.util.Collections;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* Represents an annotation on a program element.
|
|
*
|
|
* TODO
|
|
* How to add enums to the annotations
|
|
* @author
|
|
* Bhakti Mehta (bhakti.mehta@sun.com)
|
|
*/
|
|
public final class JAnnotationUse extends JAnnotationValue {
|
|
|
|
/**
|
|
* The {@link Annotation} class
|
|
*/
|
|
private final JClass clazz;
|
|
|
|
/**
|
|
* Map of member values.
|
|
*/
|
|
private Map<String,JAnnotationValue> memberValues;
|
|
|
|
JAnnotationUse(JClass clazz){
|
|
this.clazz = clazz;
|
|
}
|
|
|
|
public JClass getAnnotationClass() {
|
|
return clazz;
|
|
}
|
|
|
|
public Map<String, JAnnotationValue> getAnnotationMembers() {
|
|
return Collections.unmodifiableMap(memberValues);
|
|
}
|
|
|
|
private JCodeModel owner() {
|
|
return clazz.owner();
|
|
}
|
|
|
|
private void addValue(String name, JAnnotationValue annotationValue) {
|
|
// Use ordered map to keep the code generation the same on any JVM.
|
|
// Lazily created.
|
|
if(memberValues==null)
|
|
memberValues = new LinkedHashMap<String, JAnnotationValue>();
|
|
memberValues.put(name,annotationValue);
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
*
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The boolean value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, boolean value){
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The byte member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, byte value){
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The char member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, char value){
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The double member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, double value){
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The float member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, float value){
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The long member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, long value){
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The short member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, short value){
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The int member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, int value){
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The String member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, String value){
|
|
//Escape string values with quotes so that they can
|
|
//be generated accordingly
|
|
addValue(name, new JAnnotationStringValue(JExpr.lit(value)));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* For adding class values as param
|
|
* @see #param(String, Class)
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The annotation class which is member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse annotationParam(String name, Class<? extends Annotation> value) {
|
|
JAnnotationUse annotationUse = new JAnnotationUse(owner().ref(value));
|
|
addValue(name, annotationUse);
|
|
return annotationUse;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The enum class which is member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, final Enum<?> value) {
|
|
addValue(name, new JAnnotationValue() {
|
|
public void generate(JFormatter f) {
|
|
f.t(owner().ref(value.getDeclaringClass())).p('.').p(value.name());
|
|
}
|
|
});
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The JEnumConstant which is member value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, JEnumConstant value){
|
|
addValue(name, new JAnnotationStringValue(value));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation
|
|
* This can be used for e.g to specify
|
|
* <pre>
|
|
* @XmlCollectionItem(type=Integer.class);
|
|
* <pre>
|
|
* For adding a value of Class<? extends Annotation>
|
|
* @link
|
|
* #annotationParam(java.lang.String, java.lang.Class<? extends java.lang.annotation.Annotation>)
|
|
* @param name
|
|
* The simple name for this annotation param
|
|
*
|
|
* @param value
|
|
* The class type of the param
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, final Class<?> value){
|
|
addValue(name, new JAnnotationStringValue(
|
|
new JExpressionImpl() {
|
|
public void generate(JFormatter f) {
|
|
f.p(value.getName().replace('$', '.'));
|
|
f.p(".class");
|
|
}
|
|
}));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation based on the
|
|
* type represented by the given JType
|
|
*
|
|
* @param name The simple name for this annotation param
|
|
* @param type the JType representing the actual type
|
|
* @return The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*/
|
|
public JAnnotationUse param(String name, JType type){
|
|
JClass c = type.boxify();
|
|
addValue(name, new JAnnotationStringValue ( c.dotclass() ));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair to this annotation.
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @param value
|
|
* The JExpression which provides the contant value for this annotation
|
|
* @return
|
|
* The JAnnotationUse. More member value pairs can
|
|
* be added to it using the same or the overloaded methods.
|
|
*
|
|
*/
|
|
public JAnnotationUse param(String name, JExpression value){
|
|
addValue(name, new JAnnotationStringValue(value));
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a member value pair which is of type array to this annotation
|
|
* @param name
|
|
* The simple name for this annotation
|
|
*
|
|
* @return
|
|
* The JAnnotationArrayMember. For adding array values
|
|
* @see JAnnotationArrayMember
|
|
*
|
|
*/
|
|
public JAnnotationArrayMember paramArray(String name){
|
|
JAnnotationArrayMember arrayMember = new JAnnotationArrayMember(owner());
|
|
addValue(name, arrayMember);
|
|
return arrayMember;
|
|
}
|
|
|
|
|
|
// /**
|
|
// * This can be used to add annotations inside annotations
|
|
// * for e.g @XmlCollection(values= @XmlCollectionItem(type=Foo.class))
|
|
// * @param className
|
|
// * The classname of the annotation to be included
|
|
// * @return
|
|
// * The JAnnotationUse that can be used as a member within this JAnnotationUse
|
|
// * @deprecated
|
|
// * use {@link JAnnotationArrayMember#annotate}
|
|
// */
|
|
// public JAnnotationUse annotate(String className) {
|
|
// JAnnotationUse annotationUse = new JAnnotationUse(owner().ref(className));
|
|
// return annotationUse;
|
|
// }
|
|
|
|
/**
|
|
* This can be used to add annotations inside annotations
|
|
* for e.g @XmlCollection(values= @XmlCollectionItem(type=Foo.class))
|
|
* @param clazz
|
|
* The annotation class to be included
|
|
* @return
|
|
* The JAnnotationUse that can be used as a member within this JAnnotationUse
|
|
* @deprecated
|
|
* use {@link JAnnotationArrayMember#annotate}
|
|
*/
|
|
public JAnnotationUse annotate(Class <? extends Annotation> clazz) {
|
|
JAnnotationUse annotationUse = new JAnnotationUse(owner().ref(clazz));
|
|
return annotationUse;
|
|
}
|
|
|
|
public void generate(JFormatter f) {
|
|
f.p('@').g(clazz);
|
|
if(memberValues!=null) {
|
|
f.p('(');
|
|
boolean first = true;
|
|
|
|
if(isOptimizable()) {
|
|
// short form
|
|
f.g(memberValues.get("value"));
|
|
} else {
|
|
for (Map.Entry<String, JAnnotationValue> mapEntry : memberValues.entrySet()) {
|
|
if (!first) f.p(',');
|
|
f.p(mapEntry.getKey()).p('=').g(mapEntry.getValue());
|
|
first = false;
|
|
}
|
|
}
|
|
f.p(')');
|
|
}
|
|
}
|
|
|
|
private boolean isOptimizable() {
|
|
return memberValues.size()==1 && memberValues.containsKey("value");
|
|
}
|
|
}
|