/* *****************************************************************************
* Copyright (c) 2009 Ola Spjuth.
* 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:
* Ola Spjuth - initial API and implementation
******************************************************************************/
package net.bioclipse.balloon.handlers;
import java.util.ArrayList;
import java.util.List;
import net.bioclipse.balloon.business.Activator;
import net.bioclipse.balloon.business.IBalloonManager;
import net.bioclipse.cdk.business.ICDKManager;
import net.bioclipse.cdk.domain.ICDKMolecule;
import net.bioclipse.core.business.BioclipseException;
import net.bioclipse.core.util.LogUtils;
import net.bioclipse.jobs.BioclipseUIJob;
import org.apache.log4j.Logger;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.handlers.HandlerUtil;
/**
* Our sample handler extends AbstractHandler, an IHandler base class.
* @see org.eclipse.core.commands.IHandler
* @see org.eclipse.core.commands.AbstractHandler
*/
public class BalloonGen3DHandler extends AbstractHandler {
private static final Logger logger = Logger.getLogger(BalloonGen3DHandler.class);
/**
* The constructor.
*/
public BalloonGen3DHandler() {
}
/**
* the command has been executed, so extract extract the needed information
* from the application context.
*/
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection sel = HandlerUtil.getCurrentSelection( event );
if (sel==null) return null;
if (!( sel instanceof StructuredSelection )) return null;
IStructuredSelection ssel = (IStructuredSelection)sel;
//We operate on files and IMolecules
List<IFile> inputFiles = new ArrayList<IFile>();
List<IResource> foldersToRefresh=new ArrayList<IResource>();
//Collect files
for (Object obj : ssel.toList()){
if ( obj instanceof IFile ) {
IFile file = (IFile) obj;
// filenames.add( file.getRawLocation().toOSString() );
inputFiles.add( file );
foldersToRefresh.add( file.getParent() );
}
}
logger.debug( "Balloon selection contained: " + inputFiles.size()
+ " files." );
if ( inputFiles.size() <= 0 )
return null;
final List<String> final_fnames = null;
final List<IResource> final_foldersToRefresh = foldersToRefresh;
IContentType cmlType = Platform
.getContentTypeManager()
.getContentType( "net.bioclipse.contenttypes.cml.singleMolecule2d" );
IBalloonManager balloon = Activator.getDefault().getJavaBalloonManager();
for ( IFile input : inputFiles ) {
try {
IContentDescription contentDescirpton = input
.getContentDescription();
if ( contentDescirpton != null && contentDescirpton
.getContentType().isKindOf( cmlType ) ) {
String output =balloon.generate3Dcoordinates( input.getRawLocation()
.toOSString() );
Display.getDefault().syncExec( new Runnable(){
public void run() {
for (IResource res : final_foldersToRefresh){
try {
res.refreshLocal( IResource.DEPTH_ONE, new NullProgressMonitor() );
} catch ( CoreException e ) {
logger.error( "Could not refresh resource: " + res + " - " + e.getMessage() );
}
}
}
});
ICDKManager cdk = net.bioclipse.cdk.business.Activator
.getDefault().getJavaCDKManager();
List<ICDKMolecule> molecules = cdk.loadMolecules(output);
cdk.saveMolecule(molecules.get(0),output,true);
return null;
}
} catch ( Exception e ) {
LogUtils.handleException( e, logger,
"net.bioclipse.balloon.business" );
return null;
}
balloon.generate3Dcoordinates( input, new BioclipseUIJob<IFile>() {
@Override
public void runInUI() {
try {
IFile result = this.getReturnValue();
result.getParent()
.refreshLocal( IResource.DEPTH_ONE,
new NullProgressMonitor() );
} catch ( CoreException e ) {
LogUtils.handleException( e, logger,
"net.bioclipse.balloon.business" );
}
}
} );
}
//Set up a job
Job job = new Job("Ballon 3D conformer generation") {
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask( "Running Balloon 3D conformer generation", 2 );
monitor.worked( 1 );
//Run balloon on the files
IBalloonManager balloon = Activator.getDefault().getJavaBalloonManager();
List<String> ret=null;
try {
ret = balloon.generate3Dcoordinates( final_fnames);
} catch ( BioclipseException e ) {
logger.error("Balloon failed: " + e.getMessage());
return new Status(IStatus.ERROR,Activator.PLUGIN_ID,"Balloon failed: " + e.getMessage());
}
if (ret==null){
logger.error( "Balloon failed: " + ret );
return new Status(IStatus.ERROR,Activator.PLUGIN_ID,"Balloon failed.");
}
for (String r : ret){
logger.debug( "Balloon wrote output file: " + r );
}
//Refresh folders in UI thread
Display.getDefault().syncExec( new Runnable(){
public void run() {
for (IResource res : final_foldersToRefresh){
try {
res.refreshLocal( IResource.DEPTH_ONE, new NullProgressMonitor() );
} catch ( CoreException e ) {
logger.error( "Could not refresh resource: " + res + " - " + e.getMessage() );
}
}
}
});
monitor.done();
return Status.OK_STATUS;
}
};
// job.setPriority(Job.LONG);
// job.setUser( true );
// job.schedule(); // start as soon as possible
//Bring forth the ProgressView
/*
//Collect and serialize smiles to temp file,
String smilesfile="";
String linesep=System.getProperty("line.separator");
if (linesep==null) linesep="\n";
for (Object obj : ssel.toList()){
if ( obj instanceof IMolecule ) {
IMolecule mol = (IMolecule) obj;
String smilestext;
try {
smilestext = mol.getSMILES();
smilesfile=smilesfile+smilestext+ linesep;
} catch ( BioclipseException e ) {
logger.debug("Could not get smiles from Imol: " + mol
+ ". Skipped in balloon: " + e.getMessage());
}
}
}
try {
File tfile = File.createTempFile( "balloontemp", "smi" );
FileWriter writer= new FileWriter(tfile);
writer.write( smilesfile );
writer.close();
//Run balloon on this file
} catch ( IOException e ) {
e.printStackTrace();
}
*/
return null;
}
}