blob: 9583787695b4255504289efaa13381098306b5d1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 Oracle Corporation.
* 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:
* Ian Trimble - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
import org.eclipse.jst.jsf.core.internal.Messages;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryPackage;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
import org.eclipse.osgi.util.NLS;
import org.osgi.framework.Bundle;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Archive File</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#isRelativeToWorkspace <em>Relative To Workspace</em>}</li>
* <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getSourceLocation <em>Source Location</em>}</li>
* <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getRelativeDestLocation <em>Relative Dest Location</em>}</li>
* <li>{@link org.eclipse.jst.jsf.core.internal.jsflibraryregistry.impl.ArchiveFileImpl#getJSFLibrary <em>JSF Library</em>}</li>
* </ul>
* </p>
*
* @generated
* @deprecated
*/
public class ArchiveFileImpl extends EObjectImpl implements ArchiveFile {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static final String copyright = "Copyright (c) 2005 Oracle Corporation"; //$NON-NLS-1$
/**
* The default value of the '{@link #isRelativeToWorkspace() <em>Relative To Workspace</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isRelativeToWorkspace()
* @generated
* @ordered
*/
protected static final boolean RELATIVE_TO_WORKSPACE_EDEFAULT = true;
/**
* The cached value of the '{@link #isRelativeToWorkspace() <em>Relative To Workspace</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isRelativeToWorkspace()
* @generated
* @ordered
*/
protected boolean relativeToWorkspace = RELATIVE_TO_WORKSPACE_EDEFAULT;
/**
* The default value of the '{@link #getSourceLocation() <em>Source Location</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSourceLocation()
* @generated
* @ordered
*/
protected static final String SOURCE_LOCATION_EDEFAULT = null;
/**
* The cached value of the '{@link #getSourceLocation() <em>Source Location</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getSourceLocation()
* @generated
* @ordered
*/
protected String sourceLocation = SOURCE_LOCATION_EDEFAULT;
/**
* The default value of the '{@link #getRelativeDestLocation() <em>Relative Dest Location</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getRelativeDestLocation()
* @generated
* @ordered
*/
protected static final String RELATIVE_DEST_LOCATION_EDEFAULT = null;
/**
* The cached value of the '{@link #getRelativeDestLocation() <em>Relative Dest Location</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getRelativeDestLocation()
* @generated
* @ordered
*/
protected String relativeDestLocation = RELATIVE_DEST_LOCATION_EDEFAULT;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected ArchiveFileImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* @return the static eClass
* <!-- end-user-doc -->
* @generated
*/
protected EClass eStaticClass() {
return JSFLibraryRegistryPackage.Literals.ARCHIVE_FILE;
}
/**
* <!-- begin-user-doc -->
* @return the source location
* <!-- end-user-doc -->
* @generated
*/
public String getSourceLocation() {
return sourceLocation;
}
/**
* <!-- begin-user-doc -->
* Enhanced to not only set the location but also to attempt to determine
* if the location passed is relative to the current workspace. If so, only
* the relative location is stored. If not, the full location as passed is
* stored and the relativeToWorkspace property is set to false. To override
* this behaviour and set the absolute location as passed regardless, call
* setRelativeToWorkspace(false) BEFORE calling this method.
*
* @param newSourceLocation
*
* <!-- end-user-doc -->
* @generated NOT
*/
public void setSourceLocation(String newSourceLocation) {
String oldSourceLocation = sourceLocation;
if (relativeToWorkspace) {
IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
if (workspaceRoot != null) {
IPath wsRootPath = workspaceRoot.getLocation();
IPath srcPath = new Path(newSourceLocation);
if (workspaceRoot.findMember(srcPath) != null) {
sourceLocation = newSourceLocation;
} else if (wsRootPath.isPrefixOf(srcPath)) {
int segmentsMatched = wsRootPath.matchingFirstSegments(srcPath);
srcPath = srcPath.removeFirstSegments(segmentsMatched).setDevice(null);
sourceLocation = srcPath.toOSString();
} else {
sourceLocation = newSourceLocation;
relativeToWorkspace = false;
}
}
} else {
sourceLocation = newSourceLocation;
}
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION, oldSourceLocation, sourceLocation));
}
/**
* <!-- begin-user-doc -->
* @return true if file is relative to workspace
* <!-- end-user-doc -->
* @generated
*/
public boolean isRelativeToWorkspace() {
return relativeToWorkspace;
}
/**
* <!-- begin-user-doc -->
* To override workspace-relative recognition behaviour, be sure to call
* this method with a false value BEFORE calling setLocation(String).
* @param newRelativeToWorkspace
* <!-- end-user-doc -->
* @generated
*/
public void setRelativeToWorkspace(boolean newRelativeToWorkspace) {
boolean oldRelativeToWorkspace = relativeToWorkspace;
relativeToWorkspace = newRelativeToWorkspace;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE, oldRelativeToWorkspace, relativeToWorkspace));
}
/**
* <!-- begin-user-doc -->
* @return the relative destination location
* <!-- end-user-doc -->
* @generated
*/
public String getRelativeDestLocation() {
return relativeDestLocation;
}
/**
* <!-- begin-user-doc -->
* @param newRelativeDestLocation
* <!-- end-user-doc -->
* @generated
*/
public void setRelativeDestLocation(String newRelativeDestLocation) {
String oldRelativeDestLocation = relativeDestLocation;
relativeDestLocation = newRelativeDestLocation;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION, oldRelativeDestLocation, relativeDestLocation));
}
/**
* <!-- begin-user-doc -->
* @return the jsf library instance
* <!-- end-user-doc -->
* @generated
*/
public JSFLibrary getJSFLibrary() {
if (eContainerFeatureID != JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY) return null;
return (JSFLibrary)eContainer();
}
/**
* <!-- begin-user-doc -->
* @param newJSFLibrary
* @param msgs
* @return NotificationChain
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetJSFLibrary(JSFLibrary newJSFLibrary, NotificationChain msgs) {
msgs = eBasicSetContainer((InternalEObject)newJSFLibrary, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, msgs);
return msgs;
}
/**
* <!-- begin-user-doc -->
* @param newJSFLibrary
* <!-- end-user-doc -->
* @generated
*/
public void setJSFLibrary(JSFLibrary newJSFLibrary) {
if (newJSFLibrary != eInternalContainer() || (eContainerFeatureID != JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY && newJSFLibrary != null)) {
if (EcoreUtil.isAncestor(this, newJSFLibrary))
throw new IllegalArgumentException("Recursive containment not allowed for " + toString()); //$NON-NLS-1$
NotificationChain msgs = null;
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
if (newJSFLibrary != null)
msgs = ((InternalEObject)newJSFLibrary).eInverseAdd(this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibrary.class, msgs);
msgs = basicSetJSFLibrary(newJSFLibrary, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY, newJSFLibrary, newJSFLibrary));
}
/**
* <!-- begin-user-doc -->
* @return the path
* <!-- end-user-doc -->
* @generated NOT
*/
public String getPath() {
String path = null;
String resolvedSourceLocation = getResolvedSourceLocation();
if (resolvedSourceLocation != null) {
int iPos = resolvedSourceLocation.lastIndexOf('/');
if (iPos < 0) {
iPos = resolvedSourceLocation.lastIndexOf('\\');
}
if (iPos < 1) {
path = ""; //$NON-NLS-1$
} else {
path = resolvedSourceLocation.substring(0, iPos);
}
}
return path;
}
/**
* <!-- begin-user-doc -->
* @return the name
* <!-- end-user-doc -->
* @generated NOT
*/
public String getName() {
String name = null;
String resolvedSourceLocation = getResolvedSourceLocation();
if (resolvedSourceLocation != null) {
int iPos = resolvedSourceLocation.lastIndexOf('/');
if (iPos < 0) {
iPos = resolvedSourceLocation.lastIndexOf('\\');
}
if (iPos < 0 || iPos == resolvedSourceLocation.length() - 1) {
name = resolvedSourceLocation;
} else {
name = resolvedSourceLocation.substring(iPos + 1);
}
}
return name;
}
/**
* <!-- begin-user-doc -->
* @return true if the archive file exists in the bundle
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean exists() {
boolean exists = false;
if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
Bundle bundle = getBundle();
if (bundle != null) {
exists = bundle.getEntry(sourceLocation) != null;
}
} else {
String resolvedSourceLocation = getResolvedSourceLocation();
if (resolvedSourceLocation != null) {
exists = new File(resolvedSourceLocation).exists();
}
}
return exists;
}
/**
* <!-- begin-user-doc -->
* @param object
* @return true if equal
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean equals(Object object) {
boolean equal = false;
if (object instanceof ArchiveFile) {
String resolvedSourceLocation = getResolvedSourceLocation();
String objResolvedSourceLocation = ((ArchiveFile)object).getResolvedSourceLocation();
if (resolvedSourceLocation == null && objResolvedSourceLocation == null) {
equal = true;
} else if (resolvedSourceLocation != null) {
equal = resolvedSourceLocation.equals(objResolvedSourceLocation);
}
}
return equal;
}
/**
* <!-- begin-user-doc -->
* @return a the resolved source location hash or 0 if it is null
* <!-- end-user-doc -->
* @generated NOT
*/
public int hashCode() {
return getResolvedSourceLocation() != null ? getResolvedSourceLocation().hashCode() : 0;
}
/**
* <!-- begin-user-doc -->
* @param baseDestLocation
* @return true if the copy is successful
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean copyTo(String baseDestLocation) {
boolean copied = false;
InputStream in = null;
OutputStream out = null;
IPath outPath = new Path(baseDestLocation);
if (relativeDestLocation != null) {
outPath = outPath.append(relativeDestLocation);
}
outPath = outPath.append(getName());
try {
if (!outPath.toFile().exists()) {
out = new FileOutputStream(outPath.toOSString());
} else {
return copied;
}
if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
Bundle bundle = getBundle();
URL inURL = bundle.getEntry(sourceLocation);
if (inURL != null) {
in = inURL.openStream();
} else {
JSFCorePlugin.log(
IStatus.ERROR,
NLS.bind(Messages.ArchiveFileImpl_CannotLocatePluginRelativeFile,
sourceLocation));
return copied;
}
} else {
in = new FileInputStream(getResolvedSourceLocation());
}
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
copied = true;
} catch(FileNotFoundException fnfe) {
JSFCorePlugin.log(IStatus.ERROR, Messages.ArchiveFileImpl_CannotCopyFile, fnfe);
} catch(IOException ioe) {
JSFCorePlugin.log(IStatus.ERROR, Messages.ArchiveFileImpl_CannotCopyFile, ioe);
} finally {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch(IOException ioe) {
JSFCorePlugin.log(IStatus.WARNING, Messages.ArchiveFileImpl_CannotCloseFile, ioe);
}
}
return copied;
}
/**
* <!-- begin-user-doc -->
* @return the resolved source location
* <!-- end-user-doc -->
* @generated NOT
*/
public String getResolvedSourceLocation() {
String resolvedSourceLocation = null;
/**
* The implementation to support PluginProvidedJSFLibrary assume the following.
* 1. Plugin provided JSF library needs to be distributed as an expanded folder.
* 2. JARs for plugin provided JSF library need to reside inside the folder mentioned in item 1 above.
* 3. Each JAR needs to specify a relative path for the folder mentioned in item 1 above.
*
* Fix for bug 144954.
*/
if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
Bundle bundle = getBundle();
if (bundle != null) {
//resolvedSourceLocation = appendSeparator(bundleLocation) + sourceLocation;
try {
Path srcPath = new Path(sourceLocation);
URL fileURL = FileLocator.find(bundle, srcPath, null);
if (fileURL != null){
URL url = FileLocator.resolve(fileURL);
resolvedSourceLocation = url.getPath();
}
else
resolvedSourceLocation = sourceLocation;
} catch (IOException e) {
resolvedSourceLocation = sourceLocation;
}
} else {
resolvedSourceLocation = sourceLocation;
}
} else {
if (isRelativeToWorkspace()) {
IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
if (workspaceRoot != null) {
String workspaceLocation = workspaceRoot.getLocation().toOSString();
if (workspaceLocation != null) {
resolvedSourceLocation = appendSeparator(workspaceLocation) + sourceLocation;
} else {
resolvedSourceLocation = sourceLocation;
}
} else {
resolvedSourceLocation = sourceLocation;
}
} else {
resolvedSourceLocation = sourceLocation;
}
}
return resolvedSourceLocation;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
return basicSetJSFLibrary((JSFLibrary)otherEnd, msgs);
}
return super.eInverseAdd(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
return basicSetJSFLibrary(null, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc -->
* @param msgs
* @return NotificationChain
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
switch (eContainerFeatureID) {
case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
return eInternalContainer().eInverseRemove(this, JSFLibraryRegistryPackage.JSF_LIBRARY__ARCHIVE_FILES, JSFLibrary.class, msgs);
}
return super.eBasicRemoveFromContainerFeature(msgs);
}
/**
* <!-- begin-user-doc -->
* @param featureID
* @param resolve
* @param coreType
* @return
* <!-- end-user-doc -->
* @generated
*/
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
return isRelativeToWorkspace() ? Boolean.TRUE : Boolean.FALSE;
case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
return getSourceLocation();
case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
return getRelativeDestLocation();
case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
return getJSFLibrary();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* @param featureID
* @param newValue
* <!-- end-user-doc -->
* @generated
*/
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
setRelativeToWorkspace(((Boolean)newValue).booleanValue());
return;
case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
setSourceLocation((String)newValue);
return;
case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
setRelativeDestLocation((String)newValue);
return;
case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
setJSFLibrary((JSFLibrary)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void eUnset(int featureID) {
switch (featureID) {
case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
setRelativeToWorkspace(RELATIVE_TO_WORKSPACE_EDEFAULT);
return;
case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
setSourceLocation(SOURCE_LOCATION_EDEFAULT);
return;
case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
setRelativeDestLocation(RELATIVE_DEST_LOCATION_EDEFAULT);
return;
case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
setJSFLibrary((JSFLibrary)null);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean eIsSet(int featureID) {
switch (featureID) {
case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_TO_WORKSPACE:
return relativeToWorkspace != RELATIVE_TO_WORKSPACE_EDEFAULT;
case JSFLibraryRegistryPackage.ARCHIVE_FILE__SOURCE_LOCATION:
return SOURCE_LOCATION_EDEFAULT == null ? sourceLocation != null : !SOURCE_LOCATION_EDEFAULT.equals(sourceLocation);
case JSFLibraryRegistryPackage.ARCHIVE_FILE__RELATIVE_DEST_LOCATION:
return RELATIVE_DEST_LOCATION_EDEFAULT == null ? relativeDestLocation != null : !RELATIVE_DEST_LOCATION_EDEFAULT.equals(relativeDestLocation);
case JSFLibraryRegistryPackage.ARCHIVE_FILE__JSF_LIBRARY:
return getJSFLibrary() != null;
}
return super.eIsSet(featureID);
}
/**
* Gets the Bundle instance by parent PluginProvidedJSFLibrary instance's
* pluginID property, if and only if the parent JSFLibrary instance IS a
* PluginProvidedJSFLibrary, else returns null.
* @return Bundle instance, or null if not located or applicable
*/
protected Bundle getBundle() {
Bundle bundle = null;
if (getJSFLibrary() instanceof PluginProvidedJSFLibrary) {
String pluginID = ((PluginProvidedJSFLibrary)getJSFLibrary()).getPluginID();
if (pluginID != null) {
bundle = Platform.getBundle(pluginID);
}
}
return bundle;
}
/**
* Gets the IWorkspaceRoot instance.
* @return IWorkspaceRoot instance
*/
protected IWorkspaceRoot getWorkspaceRoot() {
IWorkspaceRoot workspaceRoot = null;
IWorkspace workspace = ResourcesPlugin.getWorkspace();
if (workspace != null) {
workspaceRoot = workspace.getRoot();
}
return workspaceRoot;
}
/**
* @param path
* @return the the path string with invalid path separators correctly fixed
*/
protected String appendSeparator(String path) {
String newPath = null;
if (!path.endsWith("\\") && !path.endsWith("/")) { //$NON-NLS-1$ //$NON-NLS-2$
newPath = path + System.getProperty("file.separator"); //$NON-NLS-1$
} else {
newPath = path;
}
return newPath;
}
/**
* <!-- begin-user-doc -->
* @return the string representation of this archive file
* <!-- end-user-doc -->
* @generated
*/
public String toString() {
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append(" (RelativeToWorkspace: "); //$NON-NLS-1$
result.append(relativeToWorkspace);
result.append(", SourceLocation: "); //$NON-NLS-1$
result.append(sourceLocation);
result.append(", RelativeDestLocation: "); //$NON-NLS-1$
result.append(relativeDestLocation);
result.append(')');
return result.toString();
}
} //ArchiveFileImpl