/******************************************************************************* | |
* Copyright (c) 2009 by SAP AG, Walldorf. | |
* 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: | |
* SAP AG - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.jst.ws.jaxws.dom.runtime.util; | |
import org.eclipse.emf.ecore.EObject; | |
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.jface.text.BadLocationException; | |
import org.eclipse.jface.text.Document; | |
import org.eclipse.jface.text.IDocument; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.DomUtil; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomPackage; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebMethod; | |
import org.eclipse.jst.ws.jaxws.utils.annotations.ILocator; | |
/** | |
* Class that extracts {@link ILocator} out of DOM object | |
* | |
* @author Georgi Vachkov | |
*/ | |
public class LocatorExtractor | |
{ | |
private static LocatorExtractor instance; | |
private LocatorExtractor() { | |
// singleton instance | |
} | |
/** | |
* Extracts the {@link ILocator} | |
* @param eObject | |
* @return {@link ILocator} instance or <code>null</code> in case the {@link IJavaElement} | |
* cannot be found for this <code>eObject</code>. | |
* @throws JavaModelException | |
* @throws BadLocationException | |
* @throws IllegalArgumentException in case <code>eObject</code> is DOM object for which | |
* this method is not implemented | |
*/ | |
public ILocator find(final EObject eObject) throws JavaModelException, BadLocationException | |
{ | |
final IType seiType = findIType(eObject); | |
if (seiType == null) { | |
return null; | |
} | |
switch(eObject.eClass().getClassifierID()) | |
{ | |
case DomPackage.IWEB_METHOD: | |
return getLocatorForMethod(seiType, (IWebMethod)eObject); | |
case DomPackage.ISERVICE_ENDPOINT_INTERFACE: | |
return getPosition(seiType); | |
case DomPackage.IWEB_SERVICE: | |
return getPosition(seiType); | |
case DomPackage.IWEB_PARAM: | |
return getLocatorForMethod(seiType, (IWebMethod)eObject.eContainer()); | |
} | |
throw new IllegalArgumentException("Unknown object type");//$NON-NLS-1$ | |
} | |
private ILocator getLocatorForMethod(final IType seiType, final IWebMethod webMethod) throws JavaModelException, BadLocationException | |
{ | |
final IMethod method = DomUtil.INSTANCE.findMethod(seiType, webMethod); | |
if (method!=null) { | |
return getPosition(method); | |
} | |
return null; | |
} | |
private IType findIType(final EObject eObject) throws JavaModelException { | |
return Dom2ResourceMapper.INSTANCE.findType(eObject); | |
} | |
private ILocator getPosition(final IMember member) throws JavaModelException, BadLocationException | |
{ | |
final int offset = member.getNameRange().getOffset(); | |
final int length = member.getNameRange().getLength(); | |
final int lineNumber = getLineNumber(member); | |
return new ILocator() | |
{ | |
public int getStartPosition() { | |
return offset; | |
} | |
public int getLength() { | |
return length; | |
} | |
public int getLineNumber() { | |
return lineNumber; | |
} | |
}; | |
} | |
private int getLineNumber(final IMember member) throws JavaModelException, BadLocationException | |
{ | |
final IDocument doc = new Document(member.getCompilationUnit().getBuffer().getContents()); | |
return doc.getLineOfOffset(member.getNameRange().getOffset()) + 1; | |
} | |
/** | |
* @return the singleton instance | |
*/ | |
public static LocatorExtractor getInstance() | |
{ | |
if (instance==null) { | |
instance = new LocatorExtractor(); | |
} | |
return instance; | |
} | |
} |