Skip to main content
summaryrefslogtreecommitdiffstats
blob: 4fe7f9c115fc9df3a7dfae42fdf28bd2aa045063 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*******************************************************************************
 * 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(convertToSourceCodeName(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 constant to a static import and the constant's short name, e.g.
	 *     static import javax.persistence.FetchType.EAGER;
	 *     return "EAGER"
	 * if that doesn't work, convert to a normal import and the constant's partially-qualified name, e.g.
	 *     import javax.persistence.FetchType;
	 *     return "FetchType.EAGER"
	 * if that doesn't work, simply return the constant's fully-qualified name, e.g.
	 *     return "javax.persistence.FetchType.EAGER"
	 * NB: an import may be added as a side-effect :-(
	 */
	protected static String convertToSourceCodeName(String enumConstantName, ModifiedDeclaration declaration) {
		return (enumConstantName == null) ? null : convertToSourceCodeName_(enumConstantName, declaration);
	}

	/**
	 * pre-condition: enum constant name is non-null;
	 * convert it to its short version if we can add a static import etc.
	 */
	protected static String convertToSourceCodeName_(String enumConstantName, ModifiedDeclaration declaration) {
		if (declaration.addStaticImport(enumConstantName)) {
			return convertToShortName(enumConstantName);
		}
		if (declaration.addImport(convertToTypeName(enumConstantName))) {
			return convertToPartiallyQualifiedName(enumConstantName);
		}
		return enumConstantName;
	}

	protected static String convertToShortName(String name) {
		return name.substring(name.lastIndexOf('.') + 1);
	}

	protected static String convertToTypeName(String name) {
		return name.substring(0, name.lastIndexOf('.'));
	}

	protected static String convertToPartiallyQualifiedName(String name) {
		return name.substring(name.lastIndexOf('.', name.lastIndexOf('.') - 1) + 1);
	}

}

Back to the top