<s> package org . eclipse . jdt . internal . core ; import java . io . BufferedInputStream ; import java . io . FileNotFoundException ; import java . io . IOException ; import java . io . InputStream ; import java . net . JarURLConnection ; import java . net . MalformedURLException ; import java . net . ProtocolException ; import java . net . SocketException ; import java . net . URL ; import java . net . URLConnection ; import java . net . UnknownHostException ; import java . util . ArrayList ; import java . util . HashMap ; import org . eclipse . core . resources . IResource ; import org . eclipse . core . runtime . * ; import org . eclipse . core . runtime . jobs . ISchedulingRule ; import org . eclipse . jdt . core . * ; import org . eclipse . jdt . core . dom . ASTNode ; import org . eclipse . jdt . core . dom . CompilationUnit ; import org . eclipse . jdt . internal . compiler . lookup . Binding ; import org . eclipse . jdt . internal . core . util . MementoTokenizer ; import org . eclipse . jdt . internal . core . util . Util ; public abstract class JavaElement extends PlatformObject implements IJavaElement { private static final byte [ ] CLOSING_DOUBLE_QUOTE = new byte [ ] { 34 } ; private static final byte [ ] CHARSET = new byte [ ] { 99 , 104 , 97 , 114 , 115 , 101 , 116 , 61 } ; private static final byte [ ] CONTENT_TYPE = new byte [ ] { 34 , 67 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 84 , 121 , 112 , 101 , 34 } ; private static final byte [ ] CONTENT = new byte [ ] { 99 , 111 , 110 , 116 , 101 , 110 , 116 , 61 , 34 } ; public static final char JEM_ESCAPE = '\\' ; public static final char JEM_JAVAPROJECT = '=' ; public static final char JEM_PACKAGEFRAGMENTROOT = '/' ; public static final char JEM_PACKAGEFRAGMENT = '<' ; public static final char JEM_FIELD = '^' ; public static final char JEM_METHOD = '~' ; public static final char JEM_INITIALIZER = '|' ; public static final char JEM_COMPILATIONUNIT = '{' ; public static final char JEM_CLASSFILE = '(' ; public static final char JEM_TYPE = '[' ; public static final char JEM_PACKAGEDECLARATION = '%' ; public static final char JEM_IMPORTDECLARATION = '#' ; public static final char JEM_COUNT = '!' ; public static final char JEM_LOCALVARIABLE = '@' ; public static final char JEM_TYPE_PARAMETER = ']' ; public static final char JEM_ANNOTATION = '}' ; protected JavaElement parent ; protected static final JavaElement [ ] NO_ELEMENTS = new JavaElement [ 0 ] ; protected static final Object NO_INFO = new Object ( ) ; protected JavaElement ( JavaElement parent ) throws IllegalArgumentException { this . parent = parent ; } public void close ( ) throws JavaModelException { JavaModelManager . getJavaModelManager ( ) . removeInfoAndChildren ( this ) ; } protected abstract void closing ( Object info ) throws JavaModelException ; protected abstract Object createElementInfo ( ) ; public boolean equals ( Object o ) { if ( this == o ) return true ; if ( this . parent == null ) return super . equals ( o ) ; JavaElement other = ( JavaElement ) o ; return getElementName ( ) . equals ( other . getElementName ( ) ) && this . parent . equals ( other . parent ) ; } protected void escapeMementoName ( StringBuffer buffer , String mementoName ) { for ( int i = 0 , length = mementoName . length ( ) ; i < length ; i ++ ) { char character = mementoName . charAt ( i ) ; switch ( character ) { case JEM_ESCAPE : case JEM_COUNT : case JEM_JAVAPROJECT : case JEM_PACKAGEFRAGMENTROOT : case JEM_PACKAGEFRAGMENT : case JEM_FIELD : case JEM_METHOD : case JEM_INITIALIZER : case JEM_COMPILATIONUNIT : case JEM_CLASSFILE : case JEM_TYPE : case JEM_PACKAGEDECLARATION : case JEM_IMPORTDECLARATION : case JEM_LOCALVARIABLE : case JEM_TYPE_PARAMETER : case JEM_ANNOTATION : buffer . append ( JEM_ESCAPE ) ; } buffer . append ( character ) ; } } public boolean exists ( ) { try { getElementInfo ( ) ; return true ; } catch ( JavaModelException e ) { } return false ; } public ASTNode findNode ( CompilationUnit ast ) { return null ; } protected abstract void generateInfos ( Object info , HashMap newElements , IProgressMonitor pm ) throws JavaModelException ; public IJavaElement getAncestor ( int ancestorType ) { IJavaElement element = this ; while ( element != null ) { if ( element . getElementType ( ) == ancestorType ) return element ; element = element . getParent ( ) ; } return null ; } public IJavaElement [ ] getChildren ( ) throws JavaModelException { Object elementInfo = getElementInfo ( ) ; if ( elementInfo instanceof JavaElementInfo ) { return ( ( JavaElementInfo ) elementInfo ) . getChildren ( ) ; } else { return NO_ELEMENTS ; } } public ArrayList getChildrenOfType ( int type ) throws JavaModelException { IJavaElement [ ] children = getChildren ( ) ; int size = children . length ; ArrayList list = new ArrayList ( size ) ; for ( int i = 0 ; i < size ; ++ i ) { JavaElement elt = ( JavaElement ) children [ i ] ; if ( elt . getElementType ( ) == type ) { list . add ( elt ) ; } } return list ; } public IClassFile getClassFile ( ) { return null ; } public ICompilationUnit getCompilationUnit ( ) { return null ; } public Object getElementInfo ( ) throws JavaModelException { return getElementInfo ( null ) ; } public Object getElementInfo ( IProgressMonitor monitor ) throws JavaModelException { JavaModelManager manager = JavaModelManager . getJavaModelManager ( ) ; Object info = manager . getInfo ( this ) ; if ( info != null ) return info ; return openWhenClosed ( createElementInfo ( ) , monitor ) ; } public String getElementName ( ) { return "" ; } public abstract IJavaElement getHandleFromMemento ( String token , MementoTokenizer memento , WorkingCopyOwner owner ) ; public IJavaElement getHandleFromMemento ( MementoTokenizer memento , WorkingCopyOwner owner ) { if ( ! memento . hasMoreTokens ( ) ) return this ; String token = memento . nextToken ( ) ; return getHandleFromMemento ( token , memento , owner ) ; } public String getHandleIdentifier ( ) { return getHandleMemento ( ) ; } public String getHandleMemento ( ) { StringBuffer buff = new StringBuffer ( ) ; getHandleMemento ( buff ) ; return buff . toString ( ) ; } protected void getHandleMemento ( StringBuffer buff ) { ( ( JavaElement ) getParent ( ) ) . getHandleMemento ( buff ) ; buff . append ( getHandleMementoDelimiter ( ) ) ; escapeMementoName ( buff , getElementName ( ) ) ; } protected abstract char getHandleMementoDelimiter ( ) ; public IJavaModel getJavaModel ( ) { IJavaElement current = this ; do { if ( current instanceof IJavaModel ) return ( IJavaModel ) current ; } while ( ( current = current . getParent ( ) ) != null ) ; return null ; } public IJavaProject getJavaProject ( ) { IJavaElement current = this ; do { if ( current instanceof IJavaProject ) return ( IJavaProject ) current ; } while ( ( current = current . getParent ( ) ) != null ) ; return null ; } public IOpenable getOpenable ( ) { return getOpenableParent ( ) ; } public IOpenable getOpenableParent ( ) { return ( IOpenable ) this . parent ; } public IJavaElement getParent ( ) { return this . parent ; } public IJavaElement getPrimaryElement ( ) { return getPrimaryElement ( true ) ; } public IJavaElement getPrimaryElement ( boolean checkOwner ) { return this ; } public IResource getResource ( ) { return resource ( ) ; } public abstract IResource resource ( ) ; protected IJavaElement getSourceElementAt ( int position ) throws JavaModelException { if ( this instanceof ISourceReference ) { IJavaElement [ ] children = getChildren ( ) ; for ( int i = children . length - 1 ; i >= 0 ; i -- ) { IJavaElement aChild = children [ i ] ; if ( aChild instanceof SourceRefElement ) { SourceRefElement child = ( SourceRefElement ) children [ i ] ; ISourceRange range = child . getSourceRange ( ) ; int start = range . getOffset ( ) ; int end = start + range . getLength ( ) ; if ( start <= position && position <= end ) { if ( child instanceof IField ) { int declarationStart = start ; SourceRefElement candidate = null ; do { range = ( ( IField ) child ) . getNameRange ( ) ; if ( position <= range . getOffset ( ) + range . getLength ( ) ) { candidate = child ; } else { return candidate == null ? child . getSourceElementAt ( position ) : candidate . getSourceElementAt ( position ) ; } child = -- i >= 0 ? ( SourceRefElement ) children [ i ] : null ; } while ( child != null && child . getSourceRange ( ) . getOffset ( ) == declarationStart ) ; return candidate . getSourceElementAt ( position ) ; } else if ( child instanceof IParent ) { return child . getSourceElementAt ( position ) ; } else { return child ; } } } } } else { Assert . isTrue ( false ) ; } return this ; } public SourceMapper getSourceMapper ( ) { return ( ( JavaElement ) getParent ( ) ) . getSourceMapper ( ) ; } public ISchedulingRule getSchedulingRule ( ) { IResource resource = resource ( ) ; if ( resource == null ) { class NoResourceSchedulingRule implements ISchedulingRule { public IPath path ; public NoResourceSchedulingRule ( IPath path ) { this . path = path ; } public boolean contains ( ISchedulingRule rule ) { if ( rule instanceof NoResourceSchedulingRule ) { return this . path . isPrefixOf ( ( ( NoResourceSchedulingRule ) rule ) . path ) ; } else { return false ; } } public boolean isConflicting ( ISchedulingRule rule ) { if ( rule instanceof NoResourceSchedulingRule ) { IPath otherPath = ( ( NoResourceSchedulingRule ) rule ) . path ; return this . path . isPrefixOf ( otherPath ) || otherPath . isPrefixOf ( this . path ) ; } else { return false ; } } } return new NoResourceSchedulingRule ( getPath ( ) ) ; } else { return resource ; } } public boolean hasChildren ( ) throws JavaModelException { Object elementInfo = JavaModelManager . getJavaModelManager ( ) . getInfo ( this ) ; if ( elementInfo instanceof JavaElementInfo ) { return ( ( JavaElementInfo ) elementInfo ) . getChildren ( ) . length > 0 ; } else { return true ; } } public int hashCode ( ) { if ( this . parent == null ) return super . hashCode ( ) ; return Util . combineHashCodes ( getElementName ( ) . hashCode ( ) , this . parent . hashCode ( ) ) ; } public boolean isAncestorOf ( IJavaElement e ) { IJavaElement parentElement = e . getParent ( ) ; while ( parentElement != null && ! parentElement . equals ( this ) ) { parentElement = parentElement . getParent ( ) ; } return parentElement != null ; } public boolean isReadOnly ( ) { return false ; } public JavaModelException newNotPresentException ( ) { return new JavaModelException ( newDoesNotExistStatus ( ) ) ; } protected JavaModelStatus newDoesNotExistStatus ( ) { return new JavaModelStatus ( IJavaModelStatusConstants . ELEMENT_DOES_NOT_EXIST , this ) ; } public JavaModelException newJavaModelException ( IStatus status ) { if ( status instanceof IJavaModelStatus ) return new JavaModelException ( ( IJavaModelStatus ) status ) ; else return new JavaModelException ( new JavaModelStatus ( status . getSeverity ( ) , status . getCode ( ) , status . getMessage ( ) ) ) ; } protected Object openWhenClosed ( Object info , boolean b , IProgressMonitor monitor ) throws JavaModelException { return openWhenClosed ( info , monitor ) ; } protected Object openWhenClosed ( Object info , IProgressMonitor monitor ) throws JavaModelException { JavaModelManager manager = JavaModelManager . getJavaModelManager ( ) ; boolean hadTemporaryCache = manager . hasTemporaryCache ( ) ; try { HashMap newElements = manager . getTemporaryCache ( ) ; generateInfos ( info , newElements , monitor ) ; if ( info == null ) { info = newElements . get ( this ) ; } if ( info == null ) { Openable openable = ( Openable ) getOpenable ( ) ; if ( newElements . containsKey ( openable ) ) { openable . closeBuffer ( ) ; } throw newNotPresentException ( ) ; } if ( ! hadTemporaryCache ) { manager . putInfos ( this , newElements ) ; } } finally { if ( ! hadTemporaryCache ) { manager . resetTemporaryCache ( ) ; } } return info ; } public String readableName ( ) { return getElementName ( ) ; } public JavaElement resolved ( Binding binding ) { return this ; } public JavaElement unresolved ( ) { return this ; } protected String tabString ( int tab ) { StringBuffer buffer = new StringBuffer ( ) ; for ( int i = tab ; i > 0 ; i -- ) buffer . append ( " " ) ; return buffer . toString ( ) ; } public String toDebugString ( ) { StringBuffer buffer = new StringBuffer ( ) ; this . toStringInfo ( 0 , buffer , NO_INFO , true ) ; return buffer . toString ( ) ; } public String toString ( ) { StringBuffer buffer = new StringBuffer ( ) ; toString ( 0 , buffer ) ; return buffer . toString ( ) ; } protected void toString ( int tab , StringBuffer buffer ) { Object info = this . toStringInfo ( tab , buffer ) ; if ( tab == 0 ) { toStringAncestors ( buffer ) ; } toStringChildren ( tab , buffer , info ) ; } public String toStringWithAncestors ( ) { return toStringWithAncestors ( true ) ; } public String toStringWithAncestors ( boolean showResolvedInfo ) { StringBuffer buffer = new StringBuffer ( ) ; this . toStringInfo ( 0 , buffer , NO_INFO , showResolvedInfo ) ; toStringAncestors ( buffer ) ; return buffer . toString ( ) ; } protected void toStringAncestors ( StringBuffer buffer ) { JavaElement parentElement = ( JavaElement ) getParent ( ) ; if ( parentElement != null && parentElement . getParent ( ) != null ) { buffer . append ( " [in " ) ; parentElement . toStringInfo ( 0 , buffer , NO_INFO , false ) ; parentElement . toStringAncestors ( buffer ) ; buffer . append ( "]" ) ; } } protected void toStringChildren ( int tab , StringBuffer buffer , Object info ) { if ( info == null || ! ( info instanceof JavaElementInfo ) ) return ; IJavaElement [ ] children = ( ( JavaElementInfo ) info ) . getChildren ( ) ; for ( int i = 0 ; i < children . length ; i ++ ) { buffer . append ( "n" ) ; ( ( JavaElement ) children [ i ] ) . toString ( tab + 1 , buffer ) ; } } public Object toStringInfo ( int tab , StringBuffer buffer ) { Object info = JavaModelManager . getJavaModelManager ( ) . peekAtInfo ( this ) ; this . toStringInfo ( tab , buffer , info , true ) ; return info ; } protected void toStringInfo ( int tab , StringBuffer buffer , Object info , boolean showResolvedInfo ) { buffer . append ( tabString ( tab ) ) ; toStringName ( buffer ) ; if ( info == null ) { buffer . append ( " (not open)" ) ; } } protected void toStringName ( StringBuffer buffer ) { buffer . append ( getElementName ( ) ) ; } protected URL getJavadocBaseLocation ( ) throws JavaModelException { IPackageFragmentRoot root = ( IPackageFragmentRoot ) getAncestor ( IJavaElement . PACKAGE_FRAGMENT_ROOT ) ; if ( root == null ) { return null ; } if ( root . getKind ( ) == IPackageFragmentRoot . K_BINARY ) { IClasspathEntry entry = null ; try { entry = root . getResolvedClasspathEntry ( ) ; URL url = getLibraryJavadocLocation ( entry ) ; if ( url != null ) { return url ; } } catch ( JavaModelException jme ) { } entry = root . getRawClasspathEntry ( ) ; switch ( entry . getEntryKind ( ) ) { case IClasspathEntry . CPE_LIBRARY : case IClasspathEntry . CPE_VARIABLE : return getLibraryJavadocLocation ( entry ) ; default : return null ; } } return null ; } protected static URL getLibraryJavadocLocation ( IClasspathEntry entry ) throws JavaModelException { switch ( entry . getEntryKind ( ) ) { case IClasspathEntry . CPE_LIBRARY : case IClasspathEntry . CPE_VARIABLE : break ; default : throw new IllegalArgumentException ( "" ) ; } IClasspathAttribute [ ] extraAttributes = entry . getExtraAttributes ( ) ; for ( int i = 0 ; i < extraAttributes . length ; i ++ ) { IClasspathAttribute attrib = extraAttributes [ i ] ; if ( IClasspathAttribute . JAVADOC_LOCATION_ATTRIBUTE_NAME . equals ( attrib . getName ( ) ) ) { String value = attrib . getValue ( ) ; try { return new URL ( value ) ; } catch ( MalformedURLException e ) { throw new JavaModelException ( new JavaModelStatus ( IJavaModelStatusConstants . CANNOT_RETRIEVE_ATTACHED_JAVADOC , value ) ) ; } } } return null ; } public String getAttachedJavadoc ( IProgressMonitor monitor ) throws JavaModelException { return null ; } int getIndexOf ( byte [ ] array , byte [ ] toBeFound , int start ) { if ( array == null || toBeFound == null ) return - 1 ; final int toBeFoundLength = toBeFound . length ; final int arrayLength = array . length ; if ( arrayLength < toBeFoundLength ) return - 1 ; loop : for ( int i = start , max = arrayLength - toBeFoundLength + 1 ; i < max ; i ++ ) { if ( array [ i ] == toBeFound [ 0 ] ) { for ( int j = 1 ; j < toBeFoundLength ; j ++ ) { if ( array [ i + j ] != toBeFound [ j ] ) continue loop ; } return i ; } } return - 1 ; } protected String getURLContents ( String docUrlValue ) throws JavaModelException { InputStream stream = null ; JarURLConnection connection2 = null ; try { URL docUrl = new URL ( docUrlValue ) ; URLConnection connection = docUrl . openConnection ( ) ; if ( connection instanceof JarURLConnection ) { connection2 = ( JarURLConnection ) connection ; connection . setUseCaches ( false ) ; } try { stream = new BufferedInputStream ( connection . getInputStream ( ) ) ; } catch ( IllegalArgumentException e ) { return null ; } catch ( NullPointerException e ) { return null ; } String encoding = connection . getContentEncoding ( ) ; byte [ ] contents = org . eclipse . jdt . internal . compiler . util . Util . getInputStreamAsByteArray ( stream , connection . getContentLength ( ) ) ; if ( encoding == null ) { int index = getIndexOf ( contents , CONTENT_TYPE , 0 ) ; if ( index != - 1 ) { index = getIndexOf ( contents , CONTENT , index ) ; if ( index != - 1 ) { int offset = index + CONTENT . length ; int index2 = getIndexOf ( contents , CLOSING_DOUBLE_QUOTE , offset ) ; if ( index2 != - 1 ) { final int charsetIndex = getIndexOf ( contents , CHARSET , offset ) ; if ( charsetIndex != - 1 ) { int start = charsetIndex + CHARSET . length ; encoding = new String ( contents , start , index2 - start , org . eclipse . jdt . internal . compiler . util . Util . UTF_8 ) ; } } } } } try { if ( encoding == null ) { encoding = getJavaProject ( ) . getProject ( ) . getDefaultCharset ( ) ; } } catch ( CoreException e ) { } if ( contents != null ) { if ( encoding != null ) { return new String ( contents , encoding ) ; } else { return new String ( contents ) ; } } } catch ( MalformedURLException e ) { throw new JavaModelException ( new JavaModelStatus ( IJavaModelStatusConstants . CANNOT_RETRIEVE_ATTACHED_JAVADOC , this ) ) ; } catch ( FileNotFoundException e ) { } catch ( SocketException e ) { } catch ( UnknownHostException e ) { } catch ( ProtocolException e ) { } catch ( IOException e ) { throw new JavaModelException ( e , IJavaModelStatusConstants . IO_EXCEPTION ) ; } finally { if ( stream != null ) { try { stream . close ( ) ; } catch ( IOException e ) { } } if ( connection2 != null ) { try { connection2 . getJarFile ( ) . close ( ) ; } catch ( IOException e ) { } catch ( IllegalStateException e ) { } } } return null ; } } </s>