/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.cdi.internal.core.refactoring;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jdt.core.IMemberValuePair;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.jboss.tools.cdi.core.IQualifier;
import org.jboss.tools.cdi.core.IQualifierDeclaration;
public class ValuedQualifier{
private IQualifier qualifier;
private List<Pair> pairs = new ArrayList<Pair>();
public ValuedQualifier(IQualifier qualifier, IQualifierDeclaration declaration){
this.qualifier = qualifier;
if(declaration != null){
// copy pairs from qualifier declaration
for(IMemberValuePair mvp : declaration.getMemberValuePairs()){
Pair pair = new Pair();
pair.name = mvp.getMemberName();
pair.value = mvp.getValue();
if(mvp.getValueKind() == IMemberValuePair.K_STRING){
pair.type = "String";
}else if(mvp.getValueKind() == IMemberValuePair.K_CHAR){
pair.type = "char";
}else if(mvp.getValueKind() == IMemberValuePair.K_CLASS){
pair.type = "Class";
}else if(mvp.getValueKind() == IMemberValuePair.K_BOOLEAN){
pair.type = "boolean";
}else if(mvp.getValueKind() == IMemberValuePair.K_BYTE){
pair.type = "byte";
}else if(mvp.getValueKind() == IMemberValuePair.K_DOUBLE){
pair.type = "double";
}else if(mvp.getValueKind() == IMemberValuePair.K_FLOAT){
pair.type = "float";
}else if(mvp.getValueKind() == IMemberValuePair.K_INT){
pair.type = "int";
}else if(mvp.getValueKind() == IMemberValuePair.K_LONG){
pair.type = "long";
}else if(mvp.getValueKind() == IMemberValuePair.K_QUALIFIED_NAME){
pair.type = "name";
}else if(mvp.getValueKind() == IMemberValuePair.K_SHORT){
pair.type = "short";
}else if(mvp.getValueKind() == IMemberValuePair.K_SIMPLE_NAME){
pair.type = "name";
}
pairs.add(pair);
}
}else{
IType type = qualifier.getSourceType();
try {
if(type.isAnnotation()){
for(IMethod method : type.getMethods()){
IMemberValuePair mvp = method.getDefaultValue();
Pair pair = new Pair();
pair.type = Signature.getSignatureSimpleName(method.getReturnType());
pair.name = method.getElementName();
if(mvp != null && mvp.getValue() != null){
pair.value = mvp.getValue();
pair.required = false;
}else{
pair.required = true;
if(pair.type.equals("boolean")){
pair.value = "false";
}else if(pair.type.equals("int") || pair.type.equals("short") || pair.type.equals("long")){
pair.value = "0";
}else if(pair.type.equals("float")){
pair.value = "0";
}else if(pair.type.equals("double")){
pair.value = "0.0";
}else if(pair.type.equals("char")){
pair.value = ' ';
}else if(pair.type.equals("byte")){
pair.value = "0";
}else if(pair.type.equals("String")){
pair.value = "default";
}else{
pair.value = "String";
}
}
pairs.add(pair);
}
}
} catch (JavaModelException e) {
}
}
}
public ValuedQualifier(IQualifier qualifier){
this(qualifier, null);
}
public boolean isEditable(){
for(Pair pair : pairs){
if(pair.name.equals("value") && pair.type.equals("String")){
return true;
}
}
return false;
}
public List<Pair> getValuePairs(){
return pairs;
}
public IQualifier getQualifier(){
return qualifier;
}
public String getValue(){
return generateValue();
}
public Object getValue(String name){
for(Pair pair : pairs){
if(pair.name.equals(name)){
return pair.value;
}
}
return null;
}
public String getStringValue(){
for(Pair pair : pairs){
if(pair.name.equals("value") && pair.type.equals("String")){
return (String)pair.value;
}
}
return "";
}
private String generateValue(){
String text = "";
boolean first = true;
for(Pair pair : pairs){
if(!pair.required)
continue;
if(!first){
text += ", ";
}
if(!"value".equals(pair.name) || pairs.size() > 1){
text += pair.name+" = ";
}
if("char".equals(pair.type)){
text += "\'"+pair.value+"\'";
}else if("String".equals(pair.type)){
text += "\""+pair.value+"\"";
}else{
text += pair.value;
if(!CDIMarkerResolutionUtils.primitives.contains(pair.type)){
text += ".class";
}
}
first = false;
}
return text;
}
public void setValue(String name, String value){
for(Pair pair : pairs){
if(pair.name.equals(name)){
pair.value = value;
pair.required = true;
}
}
}
@Override
public boolean equals(Object obj) {
if(obj instanceof ValuedQualifier && getQualifier().getSourceType().getFullyQualifiedName().equals(((ValuedQualifier)obj).getQualifier().getSourceType().getFullyQualifiedName())){
return true;
}
return false;
}
public boolean fullyEquals(Object obj) {
if(obj instanceof ValuedQualifier && getQualifier().getSourceType().getFullyQualifiedName().equals(((ValuedQualifier)obj).getQualifier().getSourceType().getFullyQualifiedName())){
for(Pair pair : ((ValuedQualifier)obj).getValuePairs()){
if(!pair.value.equals(getValue(pair.name)) || pair.value == null){
return false;
}
}
return true;
}
return false;
}
private static class Pair{
public boolean required = true;
public String type="";
public String name="";
public Object value;
}
}