/*******************************************************************************
* 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.
* Stanislav Nichev - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.model.reconcile.commands;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.EList;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Import;
import org.eclipse.wst.wsdl.Part;
import org.eclipse.wst.wsdl.XSDSchemaExtensibilityElement;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.wst.sse.sieditor.command.common.AbstractNotificationOperation;
import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
import org.eclipse.wst.sse.sieditor.model.api.IModelRoot;
import org.eclipse.wst.sse.sieditor.model.i18n.Messages;
import org.eclipse.wst.sse.sieditor.model.reconcile.utils.IWsdlReconcileUtils;
import org.eclipse.wst.sse.sieditor.model.reconcile.utils.IXsdReconcileUtils;
import org.eclipse.wst.sse.sieditor.model.reconcile.utils.ObjectsForResolveContainer;
import org.eclipse.wst.sse.sieditor.model.reconcile.utils.ObjectsForResolveUtils;
import org.eclipse.wst.sse.sieditor.model.reconcile.utils.WsdlReconcileUtils;
import org.eclipse.wst.sse.sieditor.model.reconcile.utils.XsdReconcileUtils;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IDescription;
/**
* The WSDL model reconcile command subclass of
* {@link AbstractModelReconcileCommand}
*
*/
public class WSDLModelReconcileCommand extends AbstractNotificationOperation {
private final List<XSDSchema> allSchemas;
private final IDescription description;
@SuppressWarnings("unchecked")
public WSDLModelReconcileCommand(final IModelRoot modelRoot, final IModelObject modelObject, final IDescription description) {
super(modelRoot, modelObject, Messages.WSDLModelReconcileCommand_wsdl_model_reconcile_operation_label);
allSchemas = new LinkedList<XSDSchema>();
if (description.getComponent().getETypes() != null) {
allSchemas.addAll(description.getComponent().getETypes().getSchemas());
}
this.description = description;
}
@Override
@SuppressWarnings("unchecked")
public IStatus run(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
final Definition definition = description.getComponent();
final ObjectsForResolveContainer container = objectsForResolveUtils().findObjectsForResolve(definition, allSchemas);
reconcileSchemasContents(container);
reconcileMessageParts(container.getMessagePartsForResolve());
wsdlReconcileUtils().reconcileMessages(container.getMessagesForResolve(), definition);
wsdlReconcileUtils().reconcileBindingsQNames(definition);
final List<Definition> definitionsForResolve = getDefinitionsForResolve();
for (final Definition definitionForResolve : definitionsForResolve) {
// this.reconcileUtils().reconcileBindingsQNames(definition.getEBindings(),
// definition.getTargetNamespace(),
// definitionForResolve.getEPortTypes());
wsdlReconcileUtils().reconcileOperationsMessagesReferences(container.getOperationsForResolve(), definition,
definitionForResolve.getEMessages(), null);
// this.reconcileUtils().reconcileBindingsPortTypes(definition,
// definitionForResolve.getEPortTypes());
wsdlReconcileUtils().reconcileServicePortBindings(definition, definitionForResolve.getEBindings());
}
return Status.OK_STATUS;
}
private void reconcileSchemasContents(final ObjectsForResolveContainer container) {
// we need to resolve the references for all the elements referring to
// the changed schemas
for (final XSDSchema schema : allSchemas) {
if (schema.eContainer() == null || schema.eContainer() instanceof XSDSchemaExtensibilityElement
&& schema.eContainer().eContainer() == null) {
continue;
}
xsdReconcileUtils().reconcileSchemaContents(schema, container);
}
}
private void reconcileMessageParts(final List<Part> messageParts) {
// we need to fix the WSDL message parts for all the schemas
for (final XSDSchema schema : allSchemas) {
wsdlReconcileUtils().reconcileMessagePartsReferences(schema, messageParts, description.getComponent());
}
}
@SuppressWarnings("unchecked")
private List<Definition> getDefinitionsForResolve() {
final List<Definition> definitionsForResolve = new LinkedList<Definition>();
definitionsForResolve.add(description.getComponent());
final EList<Import> eImports = description.getComponent().getEImports();
for (final Import definitionImport : eImports) {
if (definitionImport.getEDefinition() != null) {
definitionsForResolve.add(definitionImport.getEDefinition());
}
}
return definitionsForResolve;
}
// =========================================================
// helpers
// =========================================================
protected IXsdReconcileUtils xsdReconcileUtils() {
return XsdReconcileUtils.instance();
}
protected IWsdlReconcileUtils wsdlReconcileUtils() {
return WsdlReconcileUtils.instance();
}
protected ObjectsForResolveUtils objectsForResolveUtils() {
return ObjectsForResolveUtils.instance();
}
}