blob: 79376ba5a2a650ea053fd67a0488be8da61dcba3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 The University of York.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Dimitrios Kolovos - initial API and implementation
******************************************************************************/
package org.eclipse.epsilon.emc.emf.xml;
import java.util.Collection;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.xmi.impl.GenericXMLResourceFactoryImpl;
import org.eclipse.epsilon.common.util.CollectionUtil;
import org.eclipse.epsilon.common.util.StringProperties;
import org.eclipse.epsilon.common.util.StringUtil;
import org.eclipse.epsilon.emc.emf.CachedResourceSet;
import org.eclipse.epsilon.emc.emf.EmfModel;
import org.eclipse.epsilon.eol.exceptions.models.EolModelLoadingException;
import org.eclipse.epsilon.eol.execute.operations.contributors.IOperationContributorProvider;
import org.eclipse.epsilon.eol.execute.operations.contributors.OperationContributor;
import org.eclipse.epsilon.eol.models.IRelativePathResolver;
import org.eclipse.xsd.ecore.XSDEcoreBuilder;
public class XmlModel extends EmfModel implements IOperationContributorProvider {
public static final String PROPERTY_XSD_FILE = "xsdFile";
protected MixedElementOperationContributor mixedElementOperationContributor = new MixedElementOperationContributor();
protected String xsdFile = "";
@Override
public void load(StringProperties properties, IRelativePathResolver resolver) throws EolModelLoadingException {
this.xsdFile = resolver.resolve(properties.getProperty(PROPERTY_XSD_FILE));
super.load(properties, resolver);
}
@Override
protected void determinePackagesFrom(ResourceSet resourceSet) throws EolModelLoadingException {
super.determinePackagesFrom(resourceSet);
if (xsdFile != null && xsdFile.endsWith("xsd")) {
XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder();
Collection<?> ePackages = xsdEcoreBuilder.generate(URI.createFileURI(xsdFile));
CollectionUtil.addCapacityIfArrayList(packages, ePackages.size());
for (Object eObj : ePackages) {
EPackage ePackage = (EPackage) eObj;
if (StringUtil.isEmpty(ePackage.getNsURI())) {
ePackage.setNsURI(ePackage.getName());
}
packages.add(ePackage);
}
}
}
@Override
protected ResourceSet createResourceSet() {
return new CachedResourceSet() {
@Override
public Resource createNewResource(URI uri, String contentType) {
return new GenericXMLResourceFactoryImpl().createResource(uri);
}
};
}
@Override
public XmlPropertySetter getPropertySetter() {
return new XmlPropertySetter();
}
@Override
public OperationContributor getOperationContributor() {
return mixedElementOperationContributor;
}
}