/******************************************************************************
* Copyright (c) 2008 g-Eclipse consortium
* 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
*
* Initial development of the original code was made for
* project g-Eclipse founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributor(s):
* Mariusz Wojtysiak - initial API and implementation
*
*****************************************************************************/
package eu.geclipse.jsdl.parametric.eclipse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
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.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubMonitor;
import eu.geclipse.core.model.GridModel;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.jsdl.JSDLJobDescription;
import eu.geclipse.jsdl.internal.Activator;
import eu.geclipse.jsdl.parametric.IGeneratedJsdl;
import eu.geclipse.jsdl.parametric.IParametricJsdlHandler;
import eu.geclipse.jsdl.parametric.ParametricJsdlException;
/**
* Handler, which stores generated JSDLs in the workspace. This class is placed
* in special package eu.geclipse.jsdl.parametric.eclipse, because it uses
* eclipse and g-eclipse libraries (e.g. ProblemException).<br>
* Please notice that package eu.geclipse.jsdl.parametric doesn't contain
* dependencies to eclipse in order to be used as standalone library!
*/
public class ParametricJsdlSaver implements IParametricJsdlHandler {
private JSDLJobDescription parametricJsdl;
private IFolder targetFolder;
private List<JSDLJobDescription> generatedJsdlList;
private SubMonitor monitor;
/**
* @param parametricJsdl
* @param targetFolder
* @param subMonitor
*/
public ParametricJsdlSaver( final JSDLJobDescription parametricJsdl, final IFolder targetFolder, final SubMonitor subMonitor ) {
super();
this.parametricJsdl = parametricJsdl;
this.targetFolder = targetFolder;
this.monitor = subMonitor;
}
/* (non-Javadoc)
* @see eu.geclipse.jsdl.parametric.IParametricJsdlHandler#newJsdlGenerated(org.w3c.dom.Document, java.util.List)
*/
public void newJsdlGenerated( final IGeneratedJsdl generatedJsdl ) throws ParametricJsdlException
{
try {
saveJsdl( generatedJsdl );
} catch( ProblemException exception ) {
throw new ParametricJsdlException( Messages.ParametricJsdlSaver_errUnableToSaveGeneratedJsdl, exception );
}
this.monitor.worked( 1 );
}
private void saveJsdl( final IGeneratedJsdl generatedJsdl ) throws ProblemException
{
try {
IFile file = this.targetFolder.getFile( getFileName( generatedJsdl ) );
DOMSource source = new DOMSource( generatedJsdl.getDocument() );
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform( source, new StreamResult( outputStream ) );
outputStream.close();
file.create( new ByteArrayInputStream( outputStream.toByteArray() ),
IResource.REPLACE,
null );
IGridElement gridElement = GridModel.getRoot().findElement( file );
Assert.isNotNull( gridElement );
if ( gridElement != null ) {
this.generatedJsdlList.add( (JSDLJobDescription)gridElement );
}
} catch ( TransformerException exception ) {
throw new ProblemException( "eu.geclipse.jsdl.problem.saveGeneratedJsdlFailed", exception, Activator.PLUGIN_ID ); //$NON-NLS-1$
}
catch ( FileNotFoundException exception ) {
throw new ProblemException( "eu.geclipse.jsdl.problem.saveGeneratedJsdlFailed", exception, Activator.PLUGIN_ID ); //$NON-NLS-1$
} catch ( IOException exception ) {
throw new ProblemException( "eu.geclipse.jsdl.problem.saveGeneratedJsdlFailed", exception, Activator.PLUGIN_ID ); //$NON-NLS-1$
} catch ( CoreException exception ) {
throw new ProblemException( "eu.geclipse.jsdl.problem.saveGeneratedJsdlFailed", exception, Activator.PLUGIN_ID ); //$NON-NLS-1$
}
}
private String getFileName( final IGeneratedJsdl generatedJsdl ) {
return String.format( "%s%s.jsdl", new Path( this.parametricJsdl.getName() ).lastSegment(), generatedJsdl.getIterationName() ); //$NON-NLS-1$
}
public void generationFinished() throws ParametricJsdlException {
this.monitor.done();
}
public void generationStarted( final int generatedJsdl, final List<String> paramNames ) throws ParametricJsdlException {
try {
this.monitor.subTask( Messages.ParametricJsdlSaver_taskGeneratingJsdl );
this.generatedJsdlList = new ArrayList<JSDLJobDescription>();
this.monitor.setWorkRemaining( generatedJsdl );
deleteTargetFolder();
createTargetFolder();
} catch( ProblemException exception ) {
throw new ParametricJsdlException( Messages.ParametricJsdlSaver_errUnableToPrepareFolder, exception );
}
}
private void deleteTargetFolder() throws ProblemException {
if ( this.targetFolder.exists() ) {
try {
this.targetFolder.delete( true, null );
} catch ( CoreException exception ) {
String msg = String.format( Messages.ParametricJsdlSaver_errCannotDeleteFolder, this.targetFolder.getLocation().toString() );
throw new ProblemException( "eu.geclipse.jsdl.problem.deleteExistingFolderFailed", msg, exception, Activator.PLUGIN_ID ); //$NON-NLS-1$
}
}
}
private void createTargetFolder() throws ProblemException {
List<IFolder> parentList = new ArrayList<IFolder>();
IContainer container = this.targetFolder;
while ( container instanceof IFolder ) {
parentList.add( (IFolder)container );
container = container.getParent();
}
ListIterator<IFolder> iterator = parentList.listIterator( parentList.size() );
while ( iterator.hasPrevious() ) {
IFolder folder = iterator.previous();
if ( !folder.exists() ) {
try {
folder.create( true, true, null );
} catch ( CoreException exception ) {
String msg = String.format( Messages.ParametricJsdlSaver_errCannotCreateFolder, folder.getLocation().toString() );
throw new ProblemException( "eu.geclipse.jsdl.problem.createFolderFailed", msg, exception, Activator.PLUGIN_ID ); //$NON-NLS-1$
}
}
}
}
/**
* @return list of generated {@link JSDLJobDescription} objects
*/
public List<JSDLJobDescription> getGeneratedJsdl() {
return this.generatedJsdlList;
}
public boolean isCanceled() {
return this.monitor.isCanceled();
}
}