| /******************************************************************************* |
| * Copyright (c) 2006 Oracle Corporation and others. |
| * 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: |
| * Oracle Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.bpel.validator; |
| |
| import java.io.File; |
| import java.net.URL; |
| import java.util.Iterator; |
| |
| import org.eclipse.bpel.fnmeta.ClasspathFunctionRegistryLoader; |
| import org.eclipse.bpel.fnmeta.FunctionLibrary; |
| import org.eclipse.bpel.fnmeta.model.util.FMResourceFactoryImpl; |
| import org.eclipse.bpel.model.BPELPackage; |
| import org.eclipse.bpel.model.Process; |
| import org.eclipse.bpel.model.adapters.AdapterRegistry; |
| import org.eclipse.bpel.model.adapters.BasicBPELAdapterFactory; |
| import org.eclipse.bpel.model.resource.BPELResourceFactoryImpl; |
| import org.eclipse.bpel.model.resource.BPELResourceSetImpl; |
| import org.eclipse.bpel.validator.helpers.CmdValidator; |
| import org.eclipse.bpel.validator.helpers.GetOpt; |
| import org.eclipse.bpel.validator.helpers.ModelQueryImpl; |
| import org.eclipse.bpel.validator.model.INode; |
| import org.eclipse.bpel.validator.model.IProblem; |
| import org.eclipse.bpel.validator.model.Runner; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.wst.wsdl.WSDLElement; |
| import org.eclipse.wst.wsdl.internal.util.WSDLResourceFactoryImpl; |
| import org.eclipse.xsd.util.XSDResourceFactoryImpl; |
| import org.w3c.dom.Element; |
| |
| /** |
| * @author Michal Chmielewski (michal.chmielewski@oracle.com) |
| * @date Jan 2, 2007 |
| * |
| */ |
| |
| @SuppressWarnings("nls") |
| |
| public class Main extends CmdValidator { |
| |
| ResourceSet fResourceSet; |
| |
| /** |
| * Create a brand new |
| */ |
| @SuppressWarnings("unchecked") |
| public Main () { |
| |
| super(); |
| |
| // Create the Quasi-Eclipse environment ... |
| AdapterRegistry.INSTANCE.registerAdapterFactory( new org.eclipse.bpel.validator.factory.AdapterFactory() ); |
| AdapterRegistry.INSTANCE.registerAdapterFactory( BPELPackage.eINSTANCE, BasicBPELAdapterFactory.INSTANCE ); |
| |
| // Create a resource set. |
| fResourceSet = new BPELResourceSetImpl(); |
| |
| // Register the resource factories for .bpel, .wsdl, and .xsd resources. |
| // - bpel reads BPEL resources (our model) |
| |
| fResourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( |
| "bpel", new BPELResourceFactoryImpl() |
| ); |
| |
| fResourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( |
| "wsdl", new WSDLResourceFactoryImpl() |
| ); |
| // - wsdl reads WSDL resources (from wst project) |
| |
| // WSDL also needs to know about the extensions to WSDl that we provide, namely |
| // partner links, variable properties, etc. |
| // We need to register them someplace here ... |
| |
| fResourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( |
| "xsd", new XSDResourceFactoryImpl() |
| ); |
| // - xsd reads WSDL resources (from wst project) |
| |
| |
| fResourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( |
| "fnmeta", new FMResourceFactoryImpl () |
| ); |
| |
| // Register the real model query interface, that knows about EMF world as well. |
| ModelQueryImpl.register( new ModelQuery() ); |
| |
| // The function library is late bound. When eclipse is running, this information |
| // is registered via the plugin's descriptor. On its own, we have to do it another way. |
| |
| FunctionLibrary.INSTANCE.registerLoader( new ClasspathFunctionRegistryLoader (fResourceSet) ); |
| } |
| |
| |
| /** |
| * Validate the given file. |
| * @param file |
| * @return the list of validation errors. |
| */ |
| |
| @Override |
| public IProblem[] validate (File file) { |
| // |
| //Step 1. Read the BPEL process using the Model API. |
| BPELReader reader = new BPELReader(); |
| |
| reader.read( file, fResourceSet ); |
| Process process = reader.getProcess(); |
| |
| if (process == null) { |
| // If the file cannot be fetched in the resource set it's not because it does not exist necessarily. |
| // EMF resource sets will not produce a corresponding EMF model if the process (top node) has the "wrong" |
| // namespace. In this case, we fall back to DOM only validation. |
| return super.validate(file); |
| } |
| |
| // Step 2. Preparation for the validator. |
| linkModels(process); |
| |
| // Process as INode |
| INode node = AdapterRegistry.INSTANCE.adapt( process.getElement(), INode.class ); |
| |
| // Step 3. Run it |
| fRunner = new Runner ( new ModelQuery() , node); |
| return fRunner.run(); |
| } |
| |
| /** |
| * @param source |
| * @return the validation result |
| */ |
| |
| @Override |
| public IProblem[] validate (URL source) { |
| // |
| //Step 1. Read the BPEL process using the Model API. |
| BPELReader reader = new BPELReader(); |
| |
| reader.read( source, fResourceSet ); |
| Process process = reader.getProcess(); |
| |
| if (process == null) { |
| // If the file cannot be fetched in the resource set it's not because it does not exist necessarily. |
| // EMF resource sets will not produce a corresponding EMF model if the process (top node) has the "wrong" |
| // namespace. In this case, we fall back to DOM only validation. |
| return super.validate(source); |
| } |
| // Step 2. Preparation for the validator. |
| linkModels(process); |
| |
| // Process as INode |
| INode node = AdapterRegistry.INSTANCE.adapt( process.getElement(), INode.class ); |
| |
| // Step 3. Run it |
| fRunner = new Runner ( new ModelQuery() , node); |
| return fRunner.run(); |
| } |
| |
| |
| void linkModels ( EObject process ) { |
| |
| // |
| // Each extensible element points to the DOM element that |
| // comprises it. This is done in the BPEL reader as well as |
| // the WSDL readers. Here we add a pointer to the |
| // emf objects from the DOM objects. |
| |
| Iterator<?> emfIterator = process.eAllContents(); |
| while (emfIterator.hasNext()) { |
| Object obj = emfIterator.next(); |
| // This is because only ExtensibleElement has a reference to |
| // a DOM element. |
| if (obj instanceof WSDLElement) { |
| WSDLElement wsdle = (WSDLElement) obj; |
| Element el = wsdle.getElement(); |
| if (el != null) { |
| el.setUserData("emf.model", obj, null); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| |
| |
| /** |
| * Main entry point for the command line validator. |
| * @param argv |
| * @throws Exception |
| */ |
| |
| static public void main (String argv[]) throws Exception { |
| |
| Main builder = new Main(); |
| GetOpt opt = new GetOpt("-h",argv); |
| builder.run(opt); |
| } |
| } |