/*
* (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 ResourceNode
wrappers an IResources
so that it can be used
* as input for the differencing engine (interfaces IStructureComparator
and ITypedElement
)
* and the ReplaceWithEditionDialog
(interfaces ITypedElement
and IModificationDate
).
*
* Clients may instantiate this class; it is not intended to be subclassed. *
* * @see EditionSelectionDialog */ public class ResourceNode extends BufferedContent implements IStructureComparator, ITypedElement, IEditableContent, IModificationDate { private IResource fResource; private ArrayList fChildren; /** * Creates aResourceNode
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 true
if the other object is of type ITypedElement
* 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 getChildren
once for every
* member of a container resource. This implementation
* creates a new ResourceNode
for the given child resource.
* Clients may override this method to create a different type of
* IStructureComparator
or to filter children by returning null
.
*
* @param child the child resource for which a IStructureComparator
must be returned
* @return a ResourceNode
for the given child or null
*/
protected IStructureComparator createChild(IResource child) {
return new ResourceNode(child);
}
/**
* Returns an open stream if the corresponding resource implements the
* IStorage
interface. Otherwise the value null
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;
}
}