/*****************************************************************************
* 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 the
* g-Eclipse project founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributors:
* Szymon Mueller - PSNC - Initial API and implementation
*****************************************************************************/
package eu.geclipse.servicejob.parsers;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import eu.geclipse.servicejob.model.submittable.job.SubmittableServiceJobResult;
/**
* GTDL writer for service jobs.
*/
public class GTDLJobWriter {
/**
* standard location
*/
public static final String SKELETON_LOCATION = "xml/GTDL_no_Output.xml"; //$NON-NLS-1$
/**
* Adds a service job results from a list to specified file. If there exists a
* service job with the same id, then a previous status entry of this job is
* overwritten with the new entry.
*
* @param file gtdl file
* @param newResults list of results to save
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
* @throws TransformerFactoryConfigurationError
* @throws TransformerException
*/
public static void addServiceJobResults( final File file,
final List<SubmittableServiceJobResult> newResults )
throws ParserConfigurationException, SAXException, IOException,
TransformerFactoryConfigurationError, TransformerException
{
DocumentBuilderFactory factoryDOM = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
builder = factoryDOM.newDocumentBuilder();
Document document = builder.parse( file );
for( SubmittableServiceJobResult result : newResults ) {
Node nodeToDelete = null;
NodeList resultsList = document.getElementsByTagName( "result"); //$NON-NLS-1$
for( int i = 0; i < resultsList.getLength(); i++ ) {
String rawDataString = ((Element)resultsList.item( i ))
.getElementsByTagName( GTDLParser.OUTPUT_RESULT_DATA ).item( 0 ).getTextContent();
DocumentBuilderFactory factoryDOM2 = DocumentBuilderFactory.newInstance();
DocumentBuilder builder2 = factoryDOM2.newDocumentBuilder();
Document rawDataDocument = builder2.parse( new ByteArrayInputStream( rawDataString.getBytes()) );
Node jobIDNode = rawDataDocument.getElementsByTagName( "Name" ).item( 0 ); //$NON-NLS-1$
if ( jobIDNode != null && jobIDNode.getTextContent().equals( result.getJobIDString() ) ) {
nodeToDelete = resultsList.item( i );
}
}
Element newElement = document.createElement( GTDLParser.OUTPUT_RESULT_ELEMENT );
Element resourceElement = document.createElement( GTDLParser.OUTPUT_RESULT_RESOURCE );
resourceElement.setTextContent( result.getResourceName() );
Element updateElement = document.createElement( GTDLParser.OUTPUT_RESULT_DATE );
updateElement.setTextContent( DateFormat.getDateTimeInstance()
.format( result.getRunDate() ) );
Element serviceJobNameElement = document.createElement( GTDLParser.OUTPUT_RESULT_SERVICE_JOB );
serviceJobNameElement.setTextContent( result.getSubServiceJobName() );
Element outputResultDataElement = document.createElement( GTDLParser.OUTPUT_RESULT_DATA );
outputResultDataElement.setTextContent( result.getResultRawData() );
Element statusEnumElement = document.createElement(GTDLParser.OUTPUT_RESULT_ENUM);
statusEnumElement.setTextContent( result.getResultEnum() );
Element summaryElement = document.createElement( GTDLParser.OUTPUT_RESULT_SUMMARY );
summaryElement.setTextContent( result.getResultSummary() );
Element typeElement = document.createElement( GTDLParser.OUTPUT_RESULT_TYPE );
typeElement.setTextContent( result.getResultType() );
newElement.appendChild( resourceElement );
newElement.appendChild( updateElement );
newElement.appendChild( serviceJobNameElement );
newElement.appendChild( outputResultDataElement );
newElement.appendChild( statusEnumElement );
newElement.appendChild( summaryElement );
newElement.appendChild( typeElement );
if ( nodeToDelete != null ) {
document.getFirstChild().replaceChild( newElement, nodeToDelete );
} else {
document.getFirstChild().appendChild( newElement );
}
Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
transformer.setOutputProperty( OutputKeys.INDENT, "yes" ); //$NON-NLS-1$
// TODO - set indentation amount!
Source source = new DOMSource( document );
Result result1 = new StreamResult( file );
transformer.transform( source, result1 );
}
}
}