blob: 481781c649c20824d73643465b9f91ea33402422 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
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.IPath;
import org.eclipse.core.runtime.Path;
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;
/**
* Internal model element to represent a user library and code to serialize / deserialize.
*/
public class UserLibrary {
private static final String CURRENT_VERSION= "1"; //$NON-NLS-1$
private static final String TAG_VERSION= "version"; //$NON-NLS-1$
private static final String TAG_USERLIBRARY= "userlibrary"; //$NON-NLS-1$
private static final String TAG_SOURCEATTACHMENT= "sourceattachment"; //$NON-NLS-1$
private static final String TAG_SOURCEATTACHMENTROOT= "sourceattachmentroot"; //$NON-NLS-1$
private static final String TAG_PATH= "path"; //$NON-NLS-1$
private static final String TAG_ARCHIVE= "archive"; //$NON-NLS-1$
private static final String TAG_SYSTEMLIBRARY= "systemlibrary"; //$NON-NLS-1$
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;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
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;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
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;
}
/* package */ String serialize() throws IOException {
ByteArrayOutputStream s = new ByteArrayOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(s, "UTF8"); //$NON-NLS-1$
XMLWriter xmlWriter = new XMLWriter(writer);
HashMap library = new HashMap();
library.put(TAG_VERSION, String.valueOf(CURRENT_VERSION));
library.put(TAG_SYSTEMLIBRARY, String.valueOf(this.isSystemLibrary));
xmlWriter.printTag(TAG_USERLIBRARY, library, true, true, false);
for (int i = 0; i < this.entries.length; ++i) {
IClasspathEntry curr= this.entries[i];
HashMap archive = new HashMap();
archive.put(TAG_PATH, curr.getPath().toString());
IPath sourceAttach= curr.getSourceAttachmentPath();
if (sourceAttach != null)
archive.put(TAG_SOURCEATTACHMENT, sourceAttach);
IPath sourceAttachRoot= curr.getSourceAttachmentRootPath();
if (sourceAttachRoot != null)
archive.put(TAG_SOURCEATTACHMENTROOT, sourceAttachRoot);
xmlWriter.printTag(TAG_ARCHIVE, archive, true, true, true);
}
xmlWriter.endTag(TAG_USERLIBRARY, true);
writer.flush();
writer.close();
return s.toString("UTF8");//$NON-NLS-1$
}
/* package */ 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)) { //$NON-NLS-1$
throw new IOException(Messages.file_badFormat);
}
// String version= cpElement.getAttribute(TAG_VERSION);
// in case we update the format: add code to read older versions
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;
res.add(JavaCore.newLibraryEntry(new Path(path), sourceAttach, sourceAttachRoot));
}
}
}
IClasspathEntry[] entries= (IClasspathEntry[]) res.toArray(new IClasspathEntry[res.size()]);
return new UserLibrary(entries, isSystem);
}
public String toString() {
if (this.entries == null)
return "null"; //$NON-NLS-1$
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();
}
}