/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* 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:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.command.emf.wsdl.extract;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.wst.sse.sieditor.command.emf.wsdl.extract.dependencies.SchemaDependenciesUtils;
import org.eclipse.wst.sse.sieditor.command.emf.wsdl.extract.dependencies.SchemaNode;
import org.eclipse.wst.sse.sieditor.command.emf.wsdl.extract.utils.IXmlSchemaExtractor;
import org.eclipse.wst.sse.sieditor.command.emf.wsdl.extract.utils.SchemaLocationUtils;
import org.eclipse.wst.sse.sieditor.command.emf.wsdl.extract.utils.XmlSchemaExtractor;
import org.eclipse.wst.sse.sieditor.core.common.Logger;
import org.eclipse.wst.sse.sieditor.model.Activator;
import org.eclipse.wst.sse.sieditor.model.api.IWsdlModelRoot;
import org.eclipse.wst.sse.sieditor.model.i18n.Messages;
import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
public class ExtractNamespaceRunnable implements IRunnableWithProgress {
private IStatus status;
private final SchemaNode schemaNode;
private final Set<SchemaNode> dependenciesSet;
private final Map<String, String> filenamesMap;
protected final boolean keepInlinedNamespaces;
private final IPath wsdlLocationPath;
private final String wsdlEncoding;
public ExtractNamespaceRunnable(final SchemaNode schemaNode, final Set<SchemaNode> dependenciesSet,
final boolean keepInlinedNamespaces, final IPath wsdlLocationPath) {
this.schemaNode = schemaNode;
this.dependenciesSet = dependenciesSet;
this.filenamesMap = SchemaDependenciesUtils.instance().createFilenamesMap(schemaNode, dependenciesSet);
this.keepInlinedNamespaces = keepInlinedNamespaces;
String charset = null;
try {
charset = ResourcesPlugin.getWorkspace().getRoot().getFile(
SchemaLocationUtils.instance().getLocationRelativeToWorkspace(wsdlLocationPath)).getCharset();
} catch (final CoreException e) {
charset = "UTF-8"; //$NON-NLS-1$
}
this.wsdlEncoding = charset;
this.wsdlLocationPath = wsdlLocationPath;
}
@Override
public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
final Set<SchemaNode> schemasToExtract = new HashSet<SchemaNode>();
schemasToExtract.add(schemaNode);
schemasToExtract.addAll(dependenciesSet);
try {
status = extractSchemas(monitor, schemasToExtract, wsdlLocationPath, wsdlEncoding);
if (status.getSeverity() == IStatus.CANCEL) {
rollbackExtraction(schemasToExtract, monitor);
return;
}
status = importExtractedSchemas(monitor, schemasToExtract);
if (status.getSeverity() == IStatus.CANCEL) {
rollbackExtraction(schemasToExtract, monitor);
return;
}
} catch (final Exception e) {
status = new Status(Status.ERROR, Activator.PLUGIN_ID, Status.ERROR, MessageFormat.format(
Messages.ExtractNamespaceRunnable_extract_xml_schema_error_status_msg, schemaNode.getNamespace(), e
.getLocalizedMessage()), e);
rollbackExtraction(schemasToExtract, monitor);
throw new InvocationTargetException(e);
}
monitor.done();
}
protected IStatus extractSchemas(final IProgressMonitor monitor, final Set<SchemaNode> schemasToExtract,
final IPath wsdlLocationPath, final String wsdlEncoding) throws IOException, CoreException {
monitor.beginTask(Messages.ExtractNamespaceRunnable_extracting_xml_schema_subtask, dependenciesSet.size() + 1);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
for (final SchemaNode node : schemasToExtract) {
schemaExtractor().extractSchema(node.getIFile(), node.getSchema(), filenamesMap, wsdlLocationPath, wsdlEncoding);
monitor.worked(1);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
}
return Status.OK_STATUS;
}
protected IStatus importExtractedSchemas(final IProgressMonitor monitor, final Set<SchemaNode> schemasToExtract)
throws ExecutionException {
if (keepInlinedNamespaces) {
return Status.OK_STATUS;
}
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
monitor.beginTask(Messages.ExtractNamespaceRunnable_importing_extracted_schemas_subtask, dependenciesSet.size() + 2);
final ISchema schema = schemaNode.getSchema();
final IWsdlModelRoot wsdlModelRoot = (IWsdlModelRoot) schema.getModelRoot().getRoot();
return wsdlModelRoot.getEnv().execute(
new ExtractXmlSchemaCompositeCommand(wsdlModelRoot, schema, schemasToExtract, monitor));
}
private void rollbackExtraction(final Set<SchemaNode> schemasToExtract, final IProgressMonitor monitor) {
monitor.beginTask(Messages.ExtractNamespaceRunnable_rolling_back_extraction_subtask, schemasToExtract.size());
for (final SchemaNode node : schemasToExtract) {
try {
node.getIFile().delete(true, new NullProgressMonitor());
} catch (final CoreException ce) {
Logger.logError("Exception during rollback of extract schema: " + ce.getMessage(), ce); //$NON-NLS-1$
}
monitor.worked(1);
}
monitor.done();
}
public IStatus getStatus() {
return status;
}
// =========================================================
// helpers
// =========================================================
protected IXmlSchemaExtractor schemaExtractor() {
return XmlSchemaExtractor.instance();
}
}