blob: aefb96e39e9ac65f41cafc1b2e8d21a6cb1b7e20 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 Oracle. All rights reserved.
* This program and the accompanying materials are 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.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.core.internal.utility.jdt;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jpt.core.utility.jdt.DeclarationAnnotationAdapter;
import org.eclipse.jpt.core.utility.jdt.DeclarationAnnotationElementAdapter;
import org.eclipse.jpt.core.utility.jdt.ModifiedDeclaration;
/**
* Wrap a declaration annotation element adapter and simply
* add an import for the enum when necessary.
*/
public class EnumDeclarationAnnotationElementAdapter
implements DeclarationAnnotationElementAdapter<String>
{
/**
* The wrapped adapter that returns and takes name strings (enums).
*/
private final ConversionDeclarationAnnotationElementAdapter<String> adapter;
// ********** constructors **********
/**
* The default element name is "value"; the default behavior is to
* remove the annotation when the last element is removed.
*/
public EnumDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter) {
this(annotationAdapter, "value");
}
/**
* The default behavior is to remove the annotation when the last
* element is removed.
*/
public EnumDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName) {
this(annotationAdapter, elementName, true);
}
public EnumDeclarationAnnotationElementAdapter(DeclarationAnnotationAdapter annotationAdapter, String elementName, boolean removeAnnotationWhenEmpty) {
this(new ConversionDeclarationAnnotationElementAdapter<String>(annotationAdapter, elementName, removeAnnotationWhenEmpty, NameStringExpressionConverter.instance()));
}
protected EnumDeclarationAnnotationElementAdapter(ConversionDeclarationAnnotationElementAdapter<String> adapter) {
super();
this.adapter = adapter;
}
// ********** DeclarationAnnotationElementAdapter implementation **********
public String getValue(ModifiedDeclaration declaration) {
return this.resolve(this.adapter.getExpression(declaration));
}
public void setValue(String value, ModifiedDeclaration declaration) {
this.adapter.setValue(this.convertToShortName(value, declaration), declaration);
}
public Expression getExpression(ModifiedDeclaration declaration) {
return this.adapter.getExpression(declaration);
}
public ASTNode getAstNode(ModifiedDeclaration declaration) {
return this.adapter.getAstNode(declaration);
}
// ********** internal methods **********
/**
* resolve the enum
*/
protected String resolve(Expression expression) {
return JDTTools.resolveEnum(expression);
}
/**
* convert the fully-qualified enum to a static import and its short name
*/
protected String convertToShortName(String string, ModifiedDeclaration declaration) {
if (string == null) {
return null;
}
declaration.addStaticImport(string); // e.g. "javax.persistence.FetchType.EAGER"
return this.shortName(string); // e.g. "EAGER"
}
protected String shortTypeName(String name) {
return name.substring(0, name.lastIndexOf('.'));
}
protected String shortName(String name) {
return name.substring(name.lastIndexOf('.') + 1);
}
}