/******************************************************************************* * Copyright (c) 2007 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.common.model.project.ext.impl; import java.util.List; import java.util.Properties; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IAnnotation; import org.eclipse.jdt.core.IMemberValuePair; import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.MemberValuePair; import org.eclipse.jdt.core.dom.NormalAnnotation; import org.eclipse.jdt.core.dom.QualifiedName; import org.eclipse.jdt.core.dom.SingleMemberAnnotation; import org.eclipse.jdt.core.dom.StringLiteral; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.model.project.ext.IValueInfo; import org.jboss.tools.common.model.project.ext.store.XMLStoreConstants; import org.jboss.tools.common.xml.XMLUtilities; import org.w3c.dom.Element; public class ValueInfo implements IValueInfo { IFile resource; String value; public int valueStartPosition; public int valueLength; /** * Factory method. * @param node * @param name * @return */ public static ValueInfo getValueInfo(Annotation node, String name) { if(name == null) name = "value"; //$NON-NLS-1$ if(node instanceof SingleMemberAnnotation) { if(name == null || "value".equals(name)) { //$NON-NLS-1$ SingleMemberAnnotation m = (SingleMemberAnnotation)node; ValueInfo result = new ValueInfo(); Expression exp = m.getValue(); result.valueLength = exp.getLength(); result.valueStartPosition = exp.getStartPosition(); result.value = checkExpression(exp); return result; } return null; } else if(node instanceof NormalAnnotation) { NormalAnnotation n = (NormalAnnotation)node; List<?> vs = n.values(); if(vs != null) for (int i = 0; i < vs.size(); i++) { MemberValuePair p = (MemberValuePair)vs.get(i); String pname = p.getName().getIdentifier(); if(!name.equals(pname)) continue; ValueInfo result = new ValueInfo(); Expression exp = p.getValue(); result.valueLength = exp.getLength(); result.valueStartPosition = exp.getStartPosition(); result.value = checkExpression(exp); return result; } return null; } return null; } public static ValueInfo getValueInfo(IAnnotation annotation, String name) { if(name == null) name = "value"; //$NON-NLS-1$ ValueInfo result = new ValueInfo(); if(annotation.getResource() instanceof IFile) { result.setResource((IFile)annotation.getResource()); } ISourceRange r = null; IMemberValuePair[] ps = null; try { r = annotation.getSourceRange(); ps = annotation.getMemberValuePairs(); } catch (CoreException e) { ModelPlugin.getDefault().logError(e); } if(r != null) { result.valueStartPosition = r.getOffset(); result.valueLength = r.getLength(); } if(ps != null) for (IMemberValuePair p: ps) { if(name.equals(p.getMemberName())) { Object v = p.getValue(); if(v != null) result.value = v.toString(); break; } } return result; } public ValueInfo() { } public String getValue() { return value; } public int getStartPosition() { return valueStartPosition; } public int getLength() { return valueLength; } static String checkExpression(Expression exp) { if(exp == null) return null; if(exp instanceof StringLiteral) { return ((StringLiteral)exp).getLiteralValue(); } else if(exp instanceof QualifiedName) { Object o = exp.resolveConstantExpressionValue(); if(o != null) return o.toString(); return exp.toString(); } Object o = exp.resolveConstantExpressionValue(); if(o != null) return o.toString(); return exp.toString(); } public void setValue(String value) { this.value = value; } public Element toXML(Element parent, Properties context) { Element element = XMLUtilities.createElement(parent, XMLStoreConstants.TAG_VALUE_INFO); if(value != null) element.setAttribute(XMLStoreConstants.ATTR_VALUE, value); if(valueStartPosition != 0) element.setAttribute(ATTR_START, "" + valueStartPosition); //$NON-NLS-1$ if(valueLength != 0) element.setAttribute(ATTR_LENGTH, "" + valueLength); //$NON-NLS-1$ return element; } static String ATTR_START = "start"; //$NON-NLS-1$ static String ATTR_LENGTH = "length"; //$NON-NLS-1$ public void loadXML(Element element, Properties context) { value = element.getAttribute(XMLStoreConstants.ATTR_VALUE); String start = element.getAttribute(ATTR_START); if(start != null && start.length() > 0) { try { valueStartPosition = Integer.parseInt(start); } catch (NumberFormatException e) { //ignore } } String length = element.getAttribute(ATTR_LENGTH); if(length != null && length.length() > 0) { try { valueLength = Integer.parseInt(length); } catch (NumberFormatException e) { //ignore } } } public void setResource(IFile resource) { this.resource = resource; } public IFile getResource() { return resource; } }