/*******************************************************************************
* 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.seam.internal.core;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaUI;
import org.jboss.tools.common.java.IJavaSourceReference;
import org.jboss.tools.common.meta.action.impl.SpecialWizardSupport;
import org.jboss.tools.common.model.ServiceDialog;
import org.jboss.tools.common.model.options.PreferenceModelUtilities;
import org.jboss.tools.common.model.project.ext.IValueInfo;
import org.jboss.tools.common.model.project.ext.event.Change;
import org.jboss.tools.common.text.ITextSourceReference;
import org.jboss.tools.common.xml.XMLUtilities;
import org.jboss.tools.jst.web.model.project.ext.store.XMLStoreHelper;
import org.jboss.tools.seam.core.ISeamElement;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.w3c.dom.Element;
public abstract class SeamJavaContextVariable extends AbstractContextVariable implements IJavaSourceReference {
protected IMember javaSource = null;
public SeamJavaContextVariable() {}
public IMember getSourceMember() {
return javaSource;
}
public IJavaElement getSourceElement() {
return getSourceMember();
}
public void setSourceMember(IMember javaSource) {
this.javaSource = javaSource;
}
@Override
public int getLength() {
if(javaSource == null) return 0;
try {
if(javaSource.getSourceRange() == null) return 0;
return javaSource.getSourceRange().getLength();
} catch (JavaModelException e) {
//ignore
return 0;
}
}
@Override
public IResource getResource() {
return javaSource == null || javaSource.getTypeRoot().getResource() == null ? super.getResource() : javaSource.getTypeRoot().getResource();
}
@Override
public int getStartPosition() {
if(javaSource == null) return 0;
try {
if(javaSource.getSourceRange() == null) return 0;
return javaSource.getSourceRange().getOffset();
} catch (JavaModelException e) {
//ignore
return 0;
}
}
@Override
public List<Change> merge(ISeamElement s) {
List<Change> changes = super.merge(s);
if(s instanceof SeamJavaContextVariable) {
SeamJavaContextVariable sf = (SeamJavaContextVariable)s;
javaSource = sf.javaSource;
resource = sf.resource;
}
return changes;
}
@Override
public SeamJavaContextVariable clone() throws CloneNotSupportedException {
SeamJavaContextVariable c = (SeamJavaContextVariable)super.clone();
return c;
}
@Override
public ITextSourceReference getLocationFor(String path) {
final IValueInfo valueInfo = attributes.get(path);
IJavaSourceReference reference = new IJavaSourceReference() {
public int getLength() {
return valueInfo != null ? valueInfo.getLength() : 0;
}
public int getStartPosition() {
return valueInfo != null ? valueInfo.getStartPosition() : 0;
}
public IResource getResource() {
return resource;
}
public IMember getSourceMember() {
return javaSource;
}
public IJavaElement getSourceElement() {
return javaSource;
}
};
return reference;
}
static String TAG_JAVA_SOURCE = "java-source";
@Override
public Element toXML(Element parent, Properties context) {
Element element = super.toXML(parent, context);
if(javaSource instanceof IField) {
XMLStoreHelper.saveField(element, (IField)javaSource, TAG_JAVA_SOURCE, context);
} else if(javaSource instanceof IMethod) {
XMLStoreHelper.saveMethod(element, (IMethod)javaSource, TAG_JAVA_SOURCE, context);
} else if(javaSource instanceof IType) {
Element ce = XMLUtilities.createElement(element, TAG_JAVA_SOURCE);
ce.setAttribute(SeamXMLConstants.ATTR_CLASS, SeamXMLConstants.CLS_TYPE);
XMLStoreHelper.saveType(ce, (IType)javaSource, context);
}
return element;
}
@Override
public void loadXML(Element element, Properties context) {
super.loadXML(element, context);
Element c = XMLUtilities.getUniqueChild(element, TAG_JAVA_SOURCE);
if(c != null) {
String cls = c.getAttribute(SeamXMLConstants.ATTR_CLASS);
if(SeamXMLConstants.CLS_FIELD.equals(cls)) {
javaSource = XMLStoreHelper.loadField(c, context);
} else if(SeamXMLConstants.CLS_METHOD.equals(cls)) {
javaSource = XMLStoreHelper.loadMethod(c, context);
} else if(SeamXMLConstants.CLS_TYPE.equals(cls)) {
javaSource = XMLStoreHelper.loadType(c, context);
}
}
}
@Override
public void open() {
if(javaSource == null) return;
if(!javaSource.exists()) {
ServiceDialog d = PreferenceModelUtilities.getPreferenceModel().getService();
d.showDialog("Warning", "Member " + javaSource.getElementName() + " does not exist.", new String[]{SpecialWizardSupport.OK}, null, ServiceDialog.WARNING);
return;
}
try {
JavaUI.openInEditor(javaSource);
} catch (CoreException e) {
SeamCorePlugin.getPluginLog().logError(e);
}
}
}