blob: df6ab8e59fd2de80cb4c08e1fe14d1a0faa00ee1 [file] [log] [blame]
/*******************************************************************************
* 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.
* Keshav Veerapaneni - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.model.xsd.impl;
import static org.eclipse.wst.sse.sieditor.model.utils.EmfXsdUtils.getXSDPackage;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.xsd.XSDEnumerationFacet;
import org.eclipse.xsd.XSDFacet;
import org.eclipse.xsd.XSDFractionDigitsFacet;
import org.eclipse.xsd.XSDLengthFacet;
import org.eclipse.xsd.XSDMaxExclusiveFacet;
import org.eclipse.xsd.XSDMaxInclusiveFacet;
import org.eclipse.xsd.XSDMaxLengthFacet;
import org.eclipse.xsd.XSDMinExclusiveFacet;
import org.eclipse.xsd.XSDMinInclusiveFacet;
import org.eclipse.xsd.XSDMinLengthFacet;
import org.eclipse.xsd.XSDPatternFacet;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.XSDTotalDigitsFacet;
import org.eclipse.xsd.XSDTypeDefinition;
import org.eclipse.xsd.XSDWhiteSpace;
import org.eclipse.xsd.XSDWhiteSpaceFacet;
import org.w3c.dom.Element;
import org.eclipse.wst.sse.sieditor.command.emf.xsd.AddFacetCommand;
import org.eclipse.wst.sse.sieditor.command.emf.xsd.DeleteFacetCommand;
import org.eclipse.wst.sse.sieditor.command.emf.xsd.RenameNamedComponent;
import org.eclipse.wst.sse.sieditor.command.emf.xsd.SetBaseTypeCommand;
import org.eclipse.wst.sse.sieditor.core.common.Nil;
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.generic.DuplicateException;
import org.eclipse.wst.sse.sieditor.model.generic.IllegalInputException;
import org.eclipse.wst.sse.sieditor.model.utils.EmfXsdUtils;
import org.eclipse.wst.sse.sieditor.model.xsd.api.IFacet;
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.IType;
/**
*/
public class SimpleType extends AbstractType implements ISimpleType,
org.eclipse.wst.sse.sieditor.model.write.xsd.api.ISimpleType {
private final XSDSimpleTypeDefinition _simpleType;
public SimpleType(final IXSDModelRoot modelRoot, final ISchema schema, final XSDSimpleTypeDefinition type) {
this(modelRoot, schema, schema, type);
}
public SimpleType(final IXSDModelRoot modelRoot, final ISchema schema, final IModelObject parent,
final XSDSimpleTypeDefinition type) {
super(modelRoot, type, schema, parent);
this._simpleType = type;
}
public String getDocumentation() {
final Element documentation = getFirstElement(_simpleType.getAnnotations());
return super.getDocumentation(documentation);
}
public IType getBaseType() {
final XSDTypeDefinition baseType = _simpleType.getBaseType();
if (null == baseType)
return null;
final Schema parentSchema = (Schema) getParent();
if (null == baseType.getName()) {
return UnresolvedType.instance();
}
return (IType) parentSchema.resolveComponent(baseType, true);
}
public void setBaseType(final IType baseType) throws ExecutionException {
if (!(baseType instanceof ISimpleType))
return;
final SetBaseTypeCommand command = new SetBaseTypeCommand(getModelRoot(), this, baseType);
getModelRoot().getEnv().execute(command);
}
public String getLength() {
return _simpleType.getLengthFacet() == null ? null : _simpleType.getLengthFacet().getLexicalValue();
}
public String getMaxExclusive() {
return _simpleType.getMaxExclusiveFacet() == null ? null : _simpleType.getMaxExclusiveFacet().getLexicalValue();
}
public String getMaxInclusive() {
return _simpleType.getMaxInclusiveFacet() == null ? null : _simpleType.getMaxInclusiveFacet().getLexicalValue();
}
public String getMaxLength() {
return _simpleType.getMaxLengthFacet() == null ? null : _simpleType.getMaxLengthFacet().getLexicalValue();
}
public String getMinExclusive() {
return _simpleType.getMinExclusiveFacet() == null ? null : _simpleType.getMinExclusiveFacet().getLexicalValue();
}
public String getMinInclusive() {
return _simpleType.getMinInclusiveFacet() == null ? null : _simpleType.getMinInclusiveFacet().getLexicalValue();
}
public String getMinLength() {
return _simpleType.getMinLengthFacet() == null ? null : _simpleType.getMinLengthFacet().getLexicalValue();
}
public IFacet[] getPatterns() {
final List<XSDPatternFacet> patterns = _simpleType.getPatternFacets();
final List<IFacet> enums = new ArrayList<IFacet>(1);
for (final XSDPatternFacet pattern : patterns) {
enums.add(new Facet(getModelRoot(), pattern, this, getXSDPackage().getXSDPatternFacet()));
}
return enums.toArray(new IFacet[enums.size()]);
}
public IFacet[] getEnumerations() {
final List<XSDEnumerationFacet> enumerations = _simpleType.getEnumerationFacets();
final List<IFacet> enums = new ArrayList<IFacet>(1);
for (final XSDEnumerationFacet enumFacet : enumerations) {
enums.add(new Facet(getModelRoot(), enumFacet, this, getXSDPackage().getXSDEnumerationFacet()));
}
return enums.toArray(new IFacet[enums.size()]);
}
public boolean getCollapseWhiteSpaces() {
return _simpleType.getWhiteSpaceFacet() == null ? false
: _simpleType.getWhiteSpaceFacet().getValue() == XSDWhiteSpace.COLLAPSE_LITERAL;
}
public void addEnumeration(final String value) throws ExecutionException {
Nil.checkNil(value, "value"); //$NON-NLS-1$
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDEnumerationFacet(), null,
value);
getModelRoot().getEnv().execute(command);
}
public void addPattern(final String pattern) throws ExecutionException {
Nil.checkNil(pattern, "value"); //$NON-NLS-1$
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDPatternFacet(), null,
pattern);
getModelRoot().getEnv().execute(command);
}
public void setLength(final int length) throws ExecutionException {
Nil.checkNil(length, "length"); //$NON-NLS-1$
final XSDLengthFacet facet = _simpleType.getLengthFacet();
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDLengthFacet(), facet,
length + ""); //$NON-NLS-1$
getModelRoot().getEnv().execute(command);
}
public void setMaxExclusive(final String value) throws ExecutionException {
Nil.checkNil(value, "length"); //$NON-NLS-1$
final XSDMaxExclusiveFacet facet = _simpleType.getMaxExclusiveFacet();
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDMaxExclusiveFacet(),
facet, value);
getModelRoot().getEnv().execute(command);
}
public void setMaxInclusive(final String value) throws ExecutionException {
Nil.checkNil(value, "length"); //$NON-NLS-1$
final XSDMaxInclusiveFacet facet = _simpleType.getMaxInclusiveFacet();
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDMaxInclusiveFacet(),
facet, value);
getModelRoot().getEnv().execute(command);
}
public void setMaxLength(final int length) throws ExecutionException {
Nil.checkNil(length, "length"); //$NON-NLS-1$
final XSDMaxLengthFacet facet = _simpleType.getMaxLengthFacet();
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDMaxLengthFacet(), facet,
length + ""); //$NON-NLS-1$
getModelRoot().getEnv().execute(command);
}
public void setMinExclusive(final String value) throws ExecutionException {
Nil.checkNil(value, "length"); //$NON-NLS-1$
final XSDMinExclusiveFacet facet = _simpleType.getMinExclusiveFacet();
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDMinExclusiveFacet(),
facet, value);
getModelRoot().getEnv().execute(command);
}
public void setMinInclusive(final String value) throws ExecutionException {
Nil.checkNil(value, "length"); //$NON-NLS-1$
final XSDMinInclusiveFacet facet = _simpleType.getMinInclusiveFacet();
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDMinInclusiveFacet(),
facet, value + ""); //$NON-NLS-1$
getModelRoot().getEnv().execute(command);
}
public void setMinLength(final int length) throws ExecutionException {
Nil.checkNil(length, "length"); //$NON-NLS-1$
final XSDMinLengthFacet facet = _simpleType.getMinLengthFacet();
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDMinLengthFacet(), facet,
length + ""); //$NON-NLS-1$
getModelRoot().getEnv().execute(command);
}
public void setCollapseWhiteSpaces(final boolean collapse) throws ExecutionException {
final XSDWhiteSpaceFacet facet = _simpleType.getWhiteSpaceFacet();
if (collapse) {
final AddFacetCommand command = new AddFacetCommand(getModelRoot(), this, getXSDPackage().getXSDWhiteSpaceFacet(),
facet, XSDWhiteSpace.COLLAPSE_LITERAL + ""); //$NON-NLS-1$
getModelRoot().getEnv().execute(command);
} else if (null != facet) {
final DeleteFacetCommand command = new DeleteFacetCommand(getModelRoot(), this, facet);
getModelRoot().getEnv().execute(command);
}
}
public void setName(final String name) throws IllegalInputException, DuplicateException, ExecutionException {
Nil.checkNil(name, "name"); //$NON-NLS-1$
if (!EmfXsdUtils.isValidNCName(name))
throw new IllegalInputException("Entered Type name '" + name + "' is not valid"); //$NON-NLS-1$ //$NON-NLS-2$
final XSDTypeDefinition resolvedTypeDefinition = getParent().getComponent().resolveTypeDefinition(name);
if (resolvedTypeDefinition.eContainer() != null) {
throw new DuplicateException("Type with name '" + name + "' already exists"); //$NON-NLS-1$ //$NON-NLS-2$
}
final RenameNamedComponent command = new RenameNamedComponent(getModelRoot(), this, name);
getModelRoot().getEnv().execute(command);
}
/*
* public Element setDocumentation(String description) throws
* ExecutionException { Nil.checkNil(description, "description");
* //$NON-NLS-1$ XSDAnnotation annotation = _simpleType.getAnnotation(); if
* (null == annotation) { AddAnotationCommand command = new
* AddAnotationCommand(_simpleType, getModelRoot(), this); if
* (getModelRoot().getEnv().execute(command).isOK()) annotation =
* command.getAnnotation(); } if (annotation != null) {
* super.setDocumentation(annotation, description); } // TODO inform user of
* failure and log??? return null; }
*/
public void setNamespace(final String namespace) {
// Do Nothing
}
public void removeEnumeration(final IFacet facet) throws ExecutionException {
Nil.checkNil(facet, "facet"); //$NON-NLS-1$
if (facet instanceof Facet && equals(((Facet) facet).getParent())) {
final XSDFacet enumeration = facet.getComponent();
if (enumeration instanceof XSDEnumerationFacet) {
final DeleteFacetCommand command = new DeleteFacetCommand(getModelRoot(), this, enumeration);
getModelRoot().getEnv().execute(command);
}
}
}
public void removePattern(final IFacet facet) throws ExecutionException {
Nil.checkNil(facet, "facet"); //$NON-NLS-1$
if (facet instanceof Facet && equals(((Facet) facet).getParent())) {
final XSDFacet pattern = facet.getComponent();
if (pattern instanceof XSDPatternFacet) {
final DeleteFacetCommand command = new DeleteFacetCommand(getModelRoot(), this, pattern);
getModelRoot().getEnv().execute(command);
}
}
}
public Whitespace getWhitespace() {
final XSDWhiteSpaceFacet whiteSpaceFacet = _simpleType.getWhiteSpaceFacet();
if (whiteSpaceFacet == null) {
return null;
}
final XSDWhiteSpace value = whiteSpaceFacet.getValue();
if (value == XSDWhiteSpace.COLLAPSE_LITERAL) {
return Whitespace.COLLAPSE;
} else if (value == XSDWhiteSpace.PRESERVE_LITERAL) {
return Whitespace.PRESERVE;
} else if (value == XSDWhiteSpace.REPLACE_LITERAL) {
return Whitespace.REPLACE;
}
return null;
}
public String getTotalDigits() {
final XSDTotalDigitsFacet totalDigitsFacet = _simpleType.getTotalDigitsFacet();
if (totalDigitsFacet == null) {
return null;
}
return totalDigitsFacet.getLexicalValue();
}
public String getFractionDigits() {
final XSDFractionDigitsFacet fractionDigitsFacet = _simpleType.getFractionDigitsFacet();
if (fractionDigitsFacet == null) {
return null;
}
return fractionDigitsFacet.getLexicalValue();
}
}