blob: 6c488a15977ce4482f0119d224c3932e769ff046 [file] [log] [blame]
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
package org.eclipse.compare;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.jface.util.Assert;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.compare.internal.Utilities;
import org.eclipse.compare.structuremergeviewer.IStructureComparator;
/**
* A <code>ResourceNode</code> wrappers an <code>IResources</code> so that it can be used
* as input for the differencing engine (interfaces <code>IStructureComparator</code> and <code>ITypedElement</code>)
* and the <code>ReplaceWithEditionDialog</code> (interfaces <code>ITypedElement</code> and <code>IModificationDate</code>).
* <p>
* Clients may instantiate this class; it is not intended to be subclassed.
* </p>
*
* @see EditionSelectionDialog
*/
public class ResourceNode extends BufferedContent
implements IStructureComparator, ITypedElement, IEditableContent, IModificationDate {
private IResource fResource;
private ArrayList fChildren;
/**
* Creates a <code>ResourceNode</code> for the given resource.
*
* @param resource the resource
*/
public ResourceNode(IResource resource) {
fResource= resource;
Assert.isNotNull(resource);
}
/**
* Returns the corresponding resource for this object.
*
* @return the corresponding resource
*/
public IResource getResource() {
return fResource;
}
/* (non Javadoc)
* see IStreamContentAccessor.getContents
*/
public InputStream getContents() throws CoreException {
if (fResource instanceof IStorage)
return super.getContents();
return null;
}
/* (non Javadoc)
* see IModificationDate.getModificationDate
*/
public long getModificationDate() {
IPath path= fResource.getLocation();
File file= path.toFile();
return file.lastModified();
}
/* (non Javadoc)
* see ITypedElement.getName
*/
public String getName() {
if (fResource != null)
return fResource.getName();
return null;
}
/* (non Javadoc)
* see ITypedElement.getType
*/
public String getType() {
if (fResource instanceof IContainer)
return ITypedElement.FOLDER_TYPE;
if (fResource != null) {
String s= fResource.getFileExtension();
if (s != null)
return s;
}
return ITypedElement.UNKNOWN_TYPE;
}
/* (non Javadoc)
* see ITypedElement.getImage
*/
public Image getImage() {
return CompareUI.getImage(fResource);
}
/**
* Returns <code>true</code> if the other object is of type <code>ITypedElement</code>
* and their names are identical. The content is not considered.
*/
/* (non Javadoc)
* see IStructureComparator.equals
*/
public boolean equals(Object other) {
if (other instanceof ITypedElement) {
String otherName= ((ITypedElement)other).getName();
return getName().equals(otherName);
}
return super.equals(other);
}
/**
* Returns the hash code of the name.
*/
/* (non Javadoc)
* see IStructureComparator.hashCode
*/
public int hashCode() {
return getName().hashCode();
}
/* (non Javadoc)
* see IStructureComparator.getChildren
*/
public Object[] getChildren() {
if (fChildren == null) {
fChildren= new ArrayList();
if (fResource instanceof IContainer) {
try {
IResource members[]= ((IContainer)fResource).members();
for (int i= 0; i < members.length; i++) {
IStructureComparator child= createChild(members[i]);
if (child != null)
fChildren.add(child);
}
} catch (CoreException ex) {
}
}
}
return fChildren.toArray();
}
/**
* This hook method is called from <code>getChildren</code> once for every
* member of a container resource. This implementation
* creates a new <code>ResourceNode</code> for the given child resource.
* Clients may override this method to create a different type of
* <code>IStructureComparator</code> or to filter children by returning <code>null</code>.
*
* @param child the child resource for which a <code>IStructureComparator</code> must be returned
* @return a <code>ResourceNode</code> for the given child or <code>null</code>
*/
protected IStructureComparator createChild(IResource child) {
return new ResourceNode(child);
}
/**
* Returns an open stream if the corresponding resource implements the
* <code>IStorage</code> interface. Otherwise the value <code>null</code> is returned.
*
* @return a buffered input stream containing the contents of this storage
* @exception CoreException if the contents of this storage could not be accessed
*/
protected InputStream createStream() throws CoreException {
if (fResource instanceof IStorage)
return new BufferedInputStream(((IStorage)fResource).getContents());
return null;
}
/* (non Javadoc)
* see IEditableContent.isEditable
*/
public boolean isEditable() {
return true;
}
/* (non Javadoc)
* see IEditableContent.replace
*/
public ITypedElement replace(ITypedElement child, ITypedElement other) {
return child;
}
}