/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.webservice;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.teiid.designer.compare.ModelProducer;
import org.teiid.designer.compare.selector.ModelSelector;
import org.teiid.designer.compare.selector.TransientModelSelector;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelType;
import org.teiid.designer.metamodels.webservice.Interface;
import org.teiid.designer.metamodels.xml.XmlDocumentPackage;
/**
* @since 8.0
*/
public class XmlDocumentModelProducer implements ModelProducer {
public static final int WARNING_NO_WEBSERVICE_OBJECTS = 32301;
private final IWebServiceModelBuilder builder;
private final WebServiceModelProducer wsProducer;
private final TransientModelSelector output;
private final boolean shouldBuild;
/**
* @param matcherFactories
* @since 4.2
*/
public XmlDocumentModelProducer(final IWebServiceModelBuilder builder, WebServiceModelProducer wsProducer ) {
this.builder = builder;
this.wsProducer = wsProducer;
if ( this.builder.getXmlModel() != null ) {
shouldBuild = true;
// Create a temporary model selector with the same URI as the actual relational model
// (the temporary will be placed in a separate "temporary" resource set, so same URI can be used)
this.output = new TransientModelSelector(builder.getXmlModel().toString());
} else {
shouldBuild = false;
this.output = new TransientModelSelector("WebServiceModelBuilder-XmlDocumentModel-Temporary"); //$NON-NLS-1$
}
}
/**
* @see org.teiid.designer.compare.ModelProducer#execute(org.eclipse.core.runtime.IProgressMonitor, java.util.List)
* @since 4.2
*/
@Override
public void execute(IProgressMonitor monitor, List problems) throws Exception {
if ( !shouldBuild ) {
return;
}
// Create the ModelAnnotation ...
final ModelAnnotation modelAnnotation = this.output.getModelAnnotation();
modelAnnotation.setPrimaryMetamodelUri(XmlDocumentPackage.eNS_URI);
modelAnnotation.setModelType(ModelType.VIRTUAL_LITERAL);
// Create the generator ...
final IWebServiceXmlDocumentGenerator generator = WebServicePlugin.createXmlDocumentGenerator();
generator.setXmlDocumentResource(this.output.getResource());
// Go through the Web Service model and obtain all root-level components objects ...
final ModelSelector wsModelSelector = this.wsProducer.getOutputSelector();
generator.setWebServiceModelSelector(wsModelSelector);
final Iterator iter = wsModelSelector.getRootObjects().iterator();
while (iter.hasNext()) {
final EObject root = (EObject)iter.next();
if ( root instanceof Interface ) {
generator.addWebServiceComponent((Interface)root);
}
}
if ( generator.getWebServiceComponents().isEmpty() ) {
// No objects were found ...
final String msg = WebServicePlugin.Util.getString("XmlDocumentModelProducer.NoWebServiceComponentsFound"); //$NON-NLS-1$
problems.add( new Status(IStatus.WARNING,WebServicePlugin.PLUGIN_ID,WARNING_NO_WEBSERVICE_OBJECTS,msg,null));
} else {
// At least some objects were found ...
generator.generate(monitor, problems);
}
}
/**
* @see org.teiid.designer.compare.ModelProducer#getOutputSelector()
* @since 4.2
*/
@Override
public ModelSelector getOutputSelector() {
return this.output;
}
}