/*******************************************************************************
* 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.xsd;
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.xsd.XSDAttributeDeclaration;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDFactory;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.XSDTypeDefinition;
import org.eclipse.wst.sse.sieditor.command.common.AbstractXSDNotificationOperation;
import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
import org.eclipse.wst.sse.sieditor.model.api.IXSDModelRoot;
import org.eclipse.wst.sse.sieditor.model.i18n.Messages;
import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
import org.eclipse.wst.sse.sieditor.model.xsd.api.ISimpleType;
import org.eclipse.wst.sse.sieditor.model.xsd.api.IStructureType;
import org.eclipse.wst.sse.sieditor.model.xsd.impl.Schema;
import org.eclipse.wst.sse.sieditor.model.xsd.impl.SimpleType;
import org.eclipse.wst.sse.sieditor.model.xsd.impl.StructureType;
public class SetAnonymousSimpleTypeCommand extends AbstractXSDNotificationOperation {
private final ISchema schema;
private ISimpleType type;
public SetAnonymousSimpleTypeCommand(final IXSDModelRoot root, final IStructureType element) {
this(root, element, ((StructureType) element).getSchema());
}
public SetAnonymousSimpleTypeCommand(final IXSDModelRoot root, final IModelObject element, final ISchema schema) {
super(root, element, Messages.SetAnonymousSimpleTypeCommand_0);
this.schema = schema;
}
@Override
public IStatus run(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
if (modelObject instanceof IStructureType) {
setGlobalElementAnonymous();
} else {
if (modelObject.getComponent() instanceof XSDAttributeDeclaration) {
setLocalAttributeAnonymous();
} else {
setLocalElementAnonymous();
}
}
return Status.OK_STATUS;
}
public ISimpleType getType() {
return type;
}
@Override
public boolean canExecute() {
if (modelObject == null || schema == null) {
return false;
}
return true;
}
private void setGlobalElementAnonymous() {
final XSDElementDeclaration xsdElementDeclaration = ((StructureType) modelObject).getElement();
final XSDTypeDefinition xsdTypeDefinition = xsdElementDeclaration.getTypeDefinition();
final XSDSimpleTypeDefinition anonymousTypeDefinition = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
if (xsdTypeDefinition instanceof XSDSimpleTypeDefinition) {
anonymousTypeDefinition.setBaseTypeDefinition((XSDSimpleTypeDefinition) xsdTypeDefinition);
} else {
anonymousTypeDefinition.setBaseTypeDefinition((XSDSimpleTypeDefinition) Schema.getDefaultSimpleType().getComponent());
}
xsdElementDeclaration.setResolvedElementDeclaration(xsdElementDeclaration);
xsdElementDeclaration.setAnonymousTypeDefinition(anonymousTypeDefinition);
xsdElementDeclaration.updateElement();
type = new SimpleType(getModelRoot(), schema, modelObject, anonymousTypeDefinition);
}
private void setLocalElementAnonymous() {
final XSDConcreteComponent _component = (XSDConcreteComponent) modelObject.getComponent();
final XSDElementDeclaration element = (XSDElementDeclaration) ((XSDParticle) _component).getContent();
final XSDSimpleTypeDefinition anonymousTypeDefinition = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
if (!element.isElementDeclarationReference()) {
// case 1 - not a reference, e.g. type="something"
final XSDSimpleTypeDefinition xsdTypeDefinition = (XSDSimpleTypeDefinition) element.getTypeDefinition();
anonymousTypeDefinition.setBaseTypeDefinition(xsdTypeDefinition);
element.setAnonymousTypeDefinition(anonymousTypeDefinition);
type = new SimpleType(getModelRoot(), schema, modelObject, anonymousTypeDefinition);
} else {
// case 2 - reference, e.g. ref="something"
final XSDElementDeclaration referedElementDeclaration = element.getResolvedElementDeclaration();
final XSDSimpleTypeDefinition xsdTypeDefinition = (XSDSimpleTypeDefinition) referedElementDeclaration
.getTypeDefinition();
anonymousTypeDefinition.setBaseTypeDefinition(xsdTypeDefinition);
element.setResolvedElementDeclaration(element);
element.setName(referedElementDeclaration.getName());
element.setAnonymousTypeDefinition(anonymousTypeDefinition);
element.updateElement();
}
type = new SimpleType(getModelRoot(), schema, modelObject, anonymousTypeDefinition);
}
private void setLocalAttributeAnonymous() {
final XSDAttributeDeclaration attribute = (XSDAttributeDeclaration) modelObject.getComponent();
final XSDSimpleTypeDefinition anonymousTypeDefinition = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
if (!attribute.isAttributeDeclarationReference()) {
// case 1 - not a reference, e.g. type="something"
final XSDSimpleTypeDefinition xsdTypeDefinition = attribute.getTypeDefinition();
anonymousTypeDefinition.setBaseTypeDefinition(xsdTypeDefinition);
attribute.setAnonymousTypeDefinition(anonymousTypeDefinition);
type = new SimpleType(getModelRoot(), schema, modelObject, anonymousTypeDefinition);
} else {
// case 2 - reference, e.g. ref="something"
final XSDAttributeDeclaration referedAttributeDeclaration = attribute.getResolvedAttributeDeclaration();
final XSDSimpleTypeDefinition xsdTypeDefinition = referedAttributeDeclaration.getTypeDefinition();
anonymousTypeDefinition.setBaseTypeDefinition(xsdTypeDefinition);
attribute.setResolvedAttributeDeclaration(attribute);
attribute.setName(referedAttributeDeclaration.getName());
attribute.setAnonymousTypeDefinition(anonymousTypeDefinition);
attribute.updateElement();
}
type = new SimpleType(getModelRoot(), schema, modelObject, anonymousTypeDefinition);
}
// =========================================================
// helpers
// =========================================================
public IModelObject getModelObject() {
return modelObject;
}
}