/*******************************************************************************
* Copyright (c) 2009 Stefan Kuhn <stefan.kuhn@ebi.ac.uk>
*
* 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
* www.eclipse.org—epl-v10.html <http://www.eclipse.org/legal/epl-v10.html>
*
* Contact: http://www.bioclipse.net/
******************************************************************************/
package net.bioclipse.spectrum.filecontentprovider;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import net.bioclipse.core.util.LogUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
/**
* A class implementing ITreeContentProvider and only returning child elements
* which are spectrum files. This can be used to build TreeViewers for browsing
* for spectra.
*/
public class SpectrumFileContentProvider implements ITreeContentProvider {
private static final Logger logger =
Logger
.getLogger( SpectrumFileContentProvider.class );
public final static List<String> SUPPORTED_CONTENT_TYPES =
new ArrayList<String>() {
{
add( "net.bioclipse.contenttypes.cml.singleSpectrum" );
add( "net.bioclipse.contenttypes.jcampdx" );
}
};
public SpectrumFileContentProvider() {
}
public void dispose() {
}
public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) {
}
public Object[] getElements( Object inputElement ) {
return getChildren( inputElement );
}
public Object[] getChildren( Object parentElement ) {
ArrayList<IResource> childElements = new ArrayList<IResource>();
if ( parentElement instanceof IContainer
&& ((IContainer) parentElement).isAccessible() ) {
IContainer container = (IContainer) parentElement;
try {
for ( int i = 0; i < container.members().length; i++ ) {
IResource resource = container.members()[i];
if ( resource instanceof IFile ) {
IContentTypeManager contentTypeManager =
Platform.getContentTypeManager();
InputStream stream =
((IFile) container.members()[i]).getContents();
IContentType contentType =
contentTypeManager
.findContentTypeFor(
stream,
((IFile) container
.members()[i])
.getName() );
stream.close();
if ( SUPPORTED_CONTENT_TYPES.contains( contentType
.getId() ) )
childElements.add( resource );
} else if ( resource instanceof IContainer
&& resource.isAccessible()
&& containsSpectra( (IContainer) resource ) ) {
childElements.add( resource );
}
}
} catch ( CoreException e ) {
LogUtils.handleException( e, logger );
} catch ( IOException e ) {
LogUtils.handleException( e, logger );
}
}
return childElements.toArray();
}
private boolean containsSpectra( IContainer container )
throws CoreException,
IOException {
// we first test all the files, that should be fast
for ( int i = 0; i < container.members().length; i++ ) {
if ( container.members()[i] instanceof IFile ) {
IContentTypeManager contentTypeManager =
Platform.getContentTypeManager();
InputStream stream =
((IFile) container.members()[i]).getContents();
IContentType contentType =
contentTypeManager
.findContentTypeFor( stream, ((IFile) container
.members()[i]).getName() );
stream.close();
if ( contentType != null
&& SUPPORTED_CONTENT_TYPES.contains( contentType.getId() ) )
return true;
}
}
// if none is a molecule, we need to recursively check child folders
for ( int i = 0; i < container.members().length; i++ ) {
if ( container.members()[i] instanceof IContainer ) {
if ( containsSpectra( (IContainer) container.members()[i] ) )
return true;
}
}
return false;
}
public Object getParent( Object element ) {
return ((IFolder) element).getParent();
}
public boolean hasChildren( Object element ) {
return getChildren( element ).length > 0;
}
}