<s> package org . eclipse . jdt . internal . core ; import java . io . ByteArrayOutputStream ; import java . io . IOException ; import java . io . OutputStreamWriter ; import java . io . Reader ; import java . util . ArrayList ; import java . util . HashMap ; import javax . xml . parsers . DocumentBuilder ; import javax . xml . parsers . DocumentBuilderFactory ; import javax . xml . parsers . ParserConfigurationException ; import org . eclipse . core . runtime . Assert ; import org . eclipse . core . runtime . IPath ; import org . eclipse . core . runtime . Path ; import org . eclipse . jdt . core . IAccessRule ; import org . eclipse . jdt . core . IClasspathAttribute ; import org . eclipse . jdt . core . IClasspathEntry ; import org . eclipse . jdt . core . JavaCore ; import org . eclipse . jdt . internal . core . util . Messages ; import org . w3c . dom . Element ; import org . w3c . dom . Node ; import org . w3c . dom . NodeList ; import org . xml . sax . InputSource ; import org . xml . sax . SAXException ; public class UserLibrary { private static final String CURRENT_VERSION = "1" ; private static final String TAG_VERSION = "version" ; private static final String TAG_USERLIBRARY = "userlibrary" ; private static final String TAG_SOURCEATTACHMENT = "" ; private static final String TAG_SOURCEATTACHMENTROOT = "" ; private static final String TAG_PATH = "path" ; private static final String TAG_ARCHIVE = "archive" ; private static final String TAG_SYSTEMLIBRARY = "" ; private boolean isSystemLibrary ; private IClasspathEntry [ ] entries ; public UserLibrary ( IClasspathEntry [ ] entries , boolean isSystemLibrary ) { Assert . isNotNull ( entries ) ; this . entries = entries ; this . isSystemLibrary = isSystemLibrary ; } public IClasspathEntry [ ] getEntries ( ) { return this . entries ; } public boolean isSystemLibrary ( ) { return this . isSystemLibrary ; } public boolean equals ( Object obj ) { if ( obj != null && obj . getClass ( ) == getClass ( ) ) { UserLibrary other = ( UserLibrary ) obj ; if ( this . entries . length == other . entries . length && this . isSystemLibrary == other . isSystemLibrary ) { for ( int i = 0 ; i < this . entries . length ; i ++ ) { if ( ! this . entries [ i ] . equals ( other . entries [ i ] ) ) { return false ; } } return true ; } } return false ; } public int hashCode ( ) { int hashCode = 0 ; if ( this . isSystemLibrary ) { hashCode ++ ; } for ( int i = 0 ; i < this . entries . length ; i ++ ) { hashCode = hashCode * 17 + this . entries . hashCode ( ) ; } return hashCode ; } public static String serialize ( IClasspathEntry [ ] entries , boolean isSystemLibrary ) throws IOException { ByteArrayOutputStream s = new ByteArrayOutputStream ( ) ; OutputStreamWriter writer = new OutputStreamWriter ( s , "UTF8" ) ; XMLWriter xmlWriter = new XMLWriter ( writer , null , true ) ; HashMap library = new HashMap ( ) ; library . put ( TAG_VERSION , String . valueOf ( CURRENT_VERSION ) ) ; library . put ( TAG_SYSTEMLIBRARY , String . valueOf ( isSystemLibrary ) ) ; xmlWriter . printTag ( TAG_USERLIBRARY , library , true , true , false ) ; for ( int i = 0 , length = entries . length ; i < length ; ++ i ) { ClasspathEntry cpEntry = ( ClasspathEntry ) entries [ i ] ; HashMap archive = new HashMap ( ) ; archive . put ( TAG_PATH , cpEntry . getPath ( ) . toString ( ) ) ; IPath sourceAttach = cpEntry . getSourceAttachmentPath ( ) ; if ( sourceAttach != null ) archive . put ( TAG_SOURCEATTACHMENT , sourceAttach ) ; IPath sourceAttachRoot = cpEntry . getSourceAttachmentRootPath ( ) ; if ( sourceAttachRoot != null ) archive . put ( TAG_SOURCEATTACHMENTROOT , sourceAttachRoot ) ; boolean hasExtraAttributes = cpEntry . extraAttributes != null && cpEntry . extraAttributes . length != 0 ; boolean hasRestrictions = cpEntry . getAccessRuleSet ( ) != null ; xmlWriter . printTag ( TAG_ARCHIVE , archive , true , true , ! ( hasExtraAttributes || hasRestrictions ) ) ; if ( hasExtraAttributes ) { cpEntry . encodeExtraAttributes ( xmlWriter , true , true ) ; } if ( hasRestrictions ) { cpEntry . encodeAccessRules ( xmlWriter , true , true ) ; } if ( hasExtraAttributes || hasRestrictions ) { xmlWriter . endTag ( TAG_ARCHIVE , true , true ) ; } } xmlWriter . endTag ( TAG_USERLIBRARY , true , true ) ; writer . flush ( ) ; writer . close ( ) ; return s . toString ( "UTF8" ) ; } public static UserLibrary createFromString ( Reader reader ) throws IOException { Element cpElement ; try { DocumentBuilder parser = DocumentBuilderFactory . newInstance ( ) . newDocumentBuilder ( ) ; cpElement = parser . parse ( new InputSource ( reader ) ) . getDocumentElement ( ) ; } catch ( SAXException e ) { throw new IOException ( Messages . file_badFormat ) ; } catch ( ParserConfigurationException e ) { throw new IOException ( Messages . file_badFormat ) ; } finally { reader . close ( ) ; } if ( ! cpElement . getNodeName ( ) . equalsIgnoreCase ( TAG_USERLIBRARY ) ) { throw new IOException ( Messages . file_badFormat ) ; } boolean isSystem = Boolean . valueOf ( cpElement . getAttribute ( TAG_SYSTEMLIBRARY ) ) . booleanValue ( ) ; NodeList list = cpElement . getChildNodes ( ) ; int length = list . getLength ( ) ; ArrayList res = new ArrayList ( length ) ; for ( int i = 0 ; i < length ; ++ i ) { Node node = list . item ( i ) ; if ( node . getNodeType ( ) == Node . ELEMENT_NODE ) { Element element = ( Element ) node ; if ( element . getNodeName ( ) . equals ( TAG_ARCHIVE ) ) { String path = element . getAttribute ( TAG_PATH ) ; IPath sourceAttach = element . hasAttribute ( TAG_SOURCEATTACHMENT ) ? new Path ( element . getAttribute ( TAG_SOURCEATTACHMENT ) ) : null ; IPath sourceAttachRoot = element . hasAttribute ( TAG_SOURCEATTACHMENTROOT ) ? new Path ( element . getAttribute ( TAG_SOURCEATTACHMENTROOT ) ) : null ; NodeList children = element . getElementsByTagName ( "*" ) ; boolean [ ] foundChildren = new boolean [ children . getLength ( ) ] ; NodeList attributeList = ClasspathEntry . getChildAttributes ( ClasspathEntry . TAG_ATTRIBUTES , children , foundChildren ) ; IClasspathAttribute [ ] extraAttributes = ClasspathEntry . decodeExtraAttributes ( attributeList ) ; attributeList = ClasspathEntry . getChildAttributes ( ClasspathEntry . TAG_ACCESS_RULES , children , foundChildren ) ; IAccessRule [ ] accessRules = ClasspathEntry . decodeAccessRules ( attributeList ) ; IClasspathEntry entry = JavaCore . newLibraryEntry ( new Path ( path ) , sourceAttach , sourceAttachRoot , accessRules , extraAttributes , false ) ; res . add ( entry ) ; } } } IClasspathEntry [ ] entries = ( IClasspathEntry [ ] ) res . toArray ( new IClasspathEntry [ res . size ( ) ] ) ; return new UserLibrary ( entries , isSystem ) ; } public String toString ( ) { if ( this . entries == null ) return "null" ; StringBuffer buffer = new StringBuffer ( ) ; int length = this . entries . length ; for ( int i = 0 ; i < length ; i ++ ) { buffer . append ( this . entries [ i ] . toString ( ) + '\n' ) ; } return buffer . toString ( ) ; } } </s>