blob: 12c8ec84084af927455e2d93e077859f7bb60473 [file] [log] [blame]
package org.eclipse.bpel.validator.factory;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.xml.namespace.QName;
import org.eclipse.bpel.model.adapters.AdapterRegistry;
import org.eclipse.bpel.validator.Activator;
import org.eclipse.bpel.validator.IBPELMarker;
import org.eclipse.bpel.validator.helpers.DOMNodeAdapter;
import org.eclipse.bpel.validator.model.INode;
import org.eclipse.bpel.validator.model.IProblem;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.w3c.dom.Element;
/**
* An adapter factory.
*
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Sep 19, 2006
*
*/
@SuppressWarnings({"boxing","nls","restriction"})
public class AdapterFactory implements IAdapterFactory {
/** debug variance in behavior */
static public boolean DEBUG = false;
/** We adapt to these types ... */
Class<?> [] adapterList = {
IMarker.class ,
IResource.class ,
INode.class ,
IMessage.class };
/**
* Get the adapter for the requested adaptable object.
*
* @param adaptableObject adaptable object.
* @param adapterType the adapter type
* @return the adapter or null
*/
@SuppressWarnings("unchecked")
public Object getAdapter (Object adaptableObject, Class adapterType) {
if (adaptableObject instanceof EObject) {
Object adapter = AdapterRegistry.INSTANCE.adapt(adaptableObject, adapterType,false);
if (adapter != null) {
return adapter;
}
}
if (adapterType == IMarker.class) {
if (adaptableObject instanceof IProblem) {
return adapt_IProblem2IMarker ( (IProblem) adaptableObject );
}
} else if (adapterType == IResource.class) {
if (adaptableObject instanceof EObject) {
return adapt_EObject2IResource ( (EObject) adaptableObject );
}
if (adaptableObject instanceof Element) {
return adapt_Element2IResource( (Element) adaptableObject );
}
} else if (adapterType == INode.class ) {
if (adaptableObject instanceof Element) {
Element elm = (Element) adaptableObject;
Object adapter = elm.getUserData(DOMNodeAdapter.KEY);
if (adapter instanceof DOMNodeAdapter) {
return adapterType.cast(adapter);
}
adapter = new DOMNodeAdapter( elm );
elm.setUserData(DOMNodeAdapter.KEY, adapter, null );
return adapterType.cast(adapter);
}
} else if (adapterType == IMessage.class) {
if (adaptableObject instanceof IProblem) {
return adapt_IProblem2IMessage( (IProblem) adaptableObject );
}
}
return null;
}
/**
* Return an IResource adapter for the EObject.
*
* @param eObj
* @return the IResource to which we will be creating markers.
*/
IResource adapt_EObject2IResource (EObject eObj) {
if (eObj == null) {
return null;
}
Resource r = eObj.eResource();
if (r == null) {
return null;
}
// Bugzilla 323858 and JBIDE-6472
else if ( r.getURI()==null ) {
return null;
}
return getFileFromURI ( r.getURI() );
}
IResource adapt_Element2IResource ( Element elm ) {
Element top = elm.getOwnerDocument().getDocumentElement();
IResource result = null;
if (top != null) {
// Find the EObject reference to the emf model in the hierarchy of
// the
EObject eObj = (EObject) top.getUserData("emf.model");
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
// https://jira.jboss.org/browse/JBIDE-7116
if (eObj==null)
eObj = (EObject) elm.getUserData("emf.model");
result = adapt_EObject2IResource(eObj);
}
return result;
}
/**
* Return an IMarker which is derived from IProblem.
*
* @param problem the problem to adapt (convert to) IMarker
* @return an appropriate IMarker
*/
IMarker adapt_IProblem2IMarker (IProblem problem ) {
IResource resource = null;
INode node = (INode) problem.getAttribute( IProblem.NODE );
if (node!=null)
resource = (IResource) getAdapter(node.nodeValue(), IResource.class );
else
{
// https://jira.jboss.org/browse/JBIDE-6825
// added a new ERESOURCE attribute
Resource modelResource = (Resource) problem.getAttribute( IProblem.ERESOURCE );
resource = getFileFromURI(modelResource.getURI());
}
Map<String,Object> props = new HashMap<String,Object>();
//message && fix
String msg = problem.getAttribute(IProblem.MESSAGE);
String rule = problem.getAttribute(IProblem.RULE);
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
// https://jira.jboss.org/browse/JBIDE-7116
// fix ugliness in DEBUG mode (see "org.eclipse.bpel.validator.builder" buildCommand in .project)
if (rule!=null)
props.put("bpel.validation.rule", rule);
if (DEBUG) {
StringBuilder emsg = new StringBuilder( msg );
Throwable t = problem.getAttribute(IProblem.EXCEPTION);
if (rule!=null || t!=null) {
emsg.append( "(DEBUG: " );
if (rule!=null)
emsg.append( "rule=" + rule );
if (t != null) {
if (rule!=null)
emsg.append( "; " );
emsg.append( "stack=" );
int count = 0;
for(StackTraceElement e : t.getStackTrace()) {
emsg.append( "[" + count + "]" );
emsg.append( e.getClassName() + "." );
emsg.append( e.getMethodName() + "@" + e.getLineNumber());
count += 1;
if (count > 2) {
break;
}
emsg.append( "/" );
}
}
emsg.append( ")" );
}
props.put(IMarker.MESSAGE, emsg.toString());
} else {
props.put(IMarker.MESSAGE, msg );
}
// Path to object in the BPEL model.
// Location of the marker in the source
int lineNo = problem.getAttribute(IProblem.LINE_NUMBER,-1);
props.put(IMarker.LINE_NUMBER, lineNo );
props.put(IMarker.CHAR_END, problem.getAttribute(IProblem.CHAR_END, -1));
props.put(IMarker.CHAR_START, problem.getAttribute(IProblem.CHAR_START,-1));
// Location
if (lineNo < 0) {
props.put(IMarker.LOCATION, problem.getAttribute(IProblem.LOCATION));
}
// type of marker
switch (problem.getAttribute(IProblem.SEVERITY,IProblem.SEVERITY_ERROR )) {
case IProblem.SEVERITY_WARNING :
props.put(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
break;
case IProblem.SEVERITY_INFO :
props.put(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
break;
default :
props.put(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
break;
}
// the pointer in the model object space to the object on which this marker is produced.
props.put( IBPELMarker.ADDRESS_MODEL , problem.getAttribute( IProblem.ADDRESS_MODEL ));
// the pointer in the DOM object space to the object on which this marker is produced.
props.put( IBPELMarker.ADDRESS_XPATH, problem.getAttribute( IProblem.ADDRESS_XPATH ));
// href.context refers to the problem context, expressed
// in the model object space context.
Object context = problem.getAttribute(IProblem.CONTEXT );
if( context instanceof QName){
QName qname = (QName)context;
props.put( "href.context", qname.getLocalPart());
}
else{
props.put( "href.context", problem.getAttribute(IProblem.CONTEXT ));
}
// do not save this marker
// props.put( IMarker.TRANSIENT, true);
IMarker marker = null;
try {
marker = resource.createMarker( IBPELMarker.ID );
marker.setAttributes( props );
} catch (Exception ex) {
// can't create marker ... ?
Activator.log(ex);
return null;
}
// return the marker.
return marker;
}
/**
* Return an IMessage which is derived from IProblem.
*
* @param problem the problem to adapt (convert to) IMarker
* @return an appropriate IMarker
*/
IMessage adapt_IProblem2IMessage (IProblem problem ) {
// IResource resource = (IResource) getAdapter(node.nodeValue(), IResource.class );
return new Message ( problem );
}
static class Message implements IMessage {
static String GENERAL = "general";
IProblem fProblem;
protected String fMarkerId;
Message ( IProblem problem ) {
fProblem = problem;
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getAttribute(java.lang.String)
*/
public Object getAttribute(String attributeName) {
return fProblem.getAttribute(attributeName);
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getAttributes()
*/
public HashMap getAttributes() {
return (HashMap) fProblem.getAttributes();
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getBundleName()
*/
public String getBundleName() {
return fProblem.getAttribute(IProblem.BUNDLE_NAME);
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getGroupName()
*/
public String getGroupName() {
return GENERAL;
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getId()
*/
public String getId() {
return fProblem.getAttribute(IProblem.MESSAGE_ID);
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getLength()
*/
public int getLength() {
int offset = fProblem.getAttribute( IProblem.CHAR_START );
int offsetEnd = fProblem.getAttribute( IProblem.CHAR_END );
int length = offsetEnd - offset + 1;
if (length < 0) {
return IMessage.OFFSET_UNSET;
}
return length ;
}
/** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getLineNumber()
*/
public int getLineNumber() {
return fProblem.getAttribute(IProblem.LINE_NUMBER);
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getMarkerId()
*/
public String getMarkerId() {
return fMarkerId;
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getOffset()
*/
public int getOffset() {
int offset = fProblem.getAttribute( IProblem.CHAR_START );
if (offset < 0) {
return IMessage.OFFSET_UNSET;
}
return offset;
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getParams()
*/
public String[] getParams() {
return (String[]) fProblem.getAttribute(IProblem.MESSAGE_ARGS);
}
/**non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getSeverity()
*/
public int getSeverity() {
int severity = fProblem.getAttribute(IProblem.SEVERITY);
switch (severity) {
case IProblem.SEVERITY_ERROR :
return IMessage.HIGH_SEVERITY;
case IProblem.SEVERITY_WARNING :
case IProblem.SEVERITY_INFO :
return IMessage.LOW_SEVERITY;
}
return IMessage.LOW_SEVERITY;
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getTargetObject()
*/
public Object getTargetObject() {
INode node = fProblem.getAttribute(IProblem.NODE);
if (node == null) {
return null;
}
return node;
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getText()
*/
public String getText() {
return fProblem.getAttribute(IProblem.MESSAGE);
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getText(java.lang.ClassLoader)
*/
public String getText(ClassLoader classLoader) {
return fProblem.getAttribute(IProblem.MESSAGE);
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getText(java.util.Locale)
*/
public String getText(Locale locale) {
return fProblem.getAttribute(IProblem.MESSAGE);
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#getText(java.util.Locale, java.lang.ClassLoader)
*/
public String getText(Locale locale, ClassLoader classLoader) {
return fProblem.getAttribute(IProblem.MESSAGE);
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setAttribute(java.lang.String, java.lang.Object)
*/
public void setAttribute(String attributeName, Object value) {
// TODO Auto-generated method stub
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setBundleName(java.lang.String)
*/
public void setBundleName(String bundleName) {
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setGroupName(java.lang.String)
*/
public void setGroupName(String name) {
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setId(java.lang.String)
*/
public void setId(String newId) {
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setLength(int)
*/
public void setLength(int length) {
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setLineNo(int)
*/
public void setLineNo(int lineNumber) {
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setMarkerId(java.lang.String)
*/
public void setMarkerId(String markerId) {
fMarkerId = markerId;
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setOffset(int)
*/
public void setOffset(int offset) {
// TODO Auto-generated method stub
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setParams(java.lang.String[])
*/
public void setParams(String[] newParams) {
// TODO Auto-generated method stub
}
/*** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setSeverity(int)
*/
public void setSeverity(int newSeverity) {
// TODO Auto-generated method stub
}
/** (non-Javadoc)
* @see org.eclipse.wst.validation.internal.provisional.core.IMessage#setTargetObject(java.lang.Object)
*/
public void setTargetObject(Object obj) {
// TODO Auto-generated method stub
}
}
/**
* Return the adapter list. These are all the interfaces or classes to which
* we can adapt objects passed to this factory.
*
* @return a list of classes that we can adapt to.
*/
public Class<?>[] getAdapterList() {
return adapterList;
}
IFile getFileFromURI (URI uri) {
if (uri != null) {
if (uri.isFile()) {
return getFileFromDeviceURI(uri);
}
return getFileFromPlatformURI(uri);
}
return null;
}
IFile getFileFromDeviceURI(URI uri) {
String device = uri.device();
StringBuilder path = new StringBuilder();
for(String segment : uri.segments()) {
path.append("/").append(segment);
}
return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(device, path.toString()));
}
IFile getFileFromPlatformURI (URI uri) {
String [] segs = uri.segments();
IPath path = null;
// start at 1 to skip resource
for (int i = 1; i< segs.length; i++) {
if (path == null) {
path = new Path(segs[i]);
} else {
path = path.append(segs[i]);
}
}
return ResourcesPlugin.getWorkspace().getRoot().getFile(path);
}
}