<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop' | |
#***************************************************************************** | |
# | |
# template.php | |
# | |
# Author: Denis Roy | |
# Date: 2005-06-16 | |
# | |
# Description: Type your page comments here - these are not sent to the browser | |
# | |
# | |
#**************************************************************************** | |
# | |
# Begin: page-specific settings. Change these. | |
$pageTitle = "BPEL Model"; | |
$pageKeywords = "BPEL, model"; | |
$pageAuthor = "BPEL Team"; | |
# Add page-specific Nav bars here | |
# Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3) | |
include($_SERVER['DOCUMENT_ROOT'] . "/$projectShortName/items/developers_menu.php"); | |
# End: page-specific settings | |
# | |
# Paste your HTML content between the EOHTML markers! | |
$html = <<<EOHTML | |
<div id="maincontent"> | |
<div id="midcolumn"> | |
<h1>$pageTitle</h1> | |
Last modified on December 7, 2005 | |
<p> | |
This document attempts to explain many of the design decisions present in | |
the BPEL model, as well as where to locate key code and how to make changes. | |
</p> | |
<h2>Spec Level</h2> | |
<p> | |
The model will track the evolving OASIS WS-BPEL specification as it | |
approaches 2.0. Current support of the model is at the 1.1 level plus the | |
following resolved OASIS issues: | |
</p> | |
<ul class="midlist"> | |
<li>Issue 13 (Expressions and Queries in Elements instead of Attributes)</li> | |
<li>Issue 34 (No Dependency on WS-A)</li> | |
<li>Issue 37 and 202 (Add "join" value to initiate attribute of Correlation)</li> | |
<li>Issue 68 (Catch syntax broken)</li> | |
</ul> | |
<h2>Model Objects</h2> | |
<p> | |
Most of the BPEL model objects, with some exceptions, are located in the | |
<i>org.eclipse.bpel.model</i> package. | |
</p> | |
<p> | |
Message properties and property aliases are located in | |
<i>org.eclipse.bpel.model.messageproperties</i>. | |
</p> | |
<p> | |
Partner link types and roles are located in | |
<i>org.eclipse.bpel.model.partnerlinktype.</i> | |
</p> | |
<h2>Reading and Writing BPEL Files</h2> | |
<p> | |
Most of the conversion from the .bpel file into an EMF model occurs in | |
<i>org.eclipse.bpel.core.resources.BPELReader</i>. This class is instantiated | |
by <i>BPELResourceImpl</i>, which in turn is created by <i>BPELResourceFactoryImpl</i>, | |
which is registered in the plugin.xml file as the extension parser for | |
.bpel files. | |
</p> | |
<p> | |
<i>BPELReader</i> has methods for translating each of the BPEL elements and | |
attributes from DOM objects into EMF objects. At the moment, the DOM | |
objects are discarded by the reader once the EMF objects are created, | |
and they are recreated by the <i>BPELWriter</i>. However, this has the | |
disadvantage of losing any user formatting and comments in the source | |
file upon save. The model should use the same approach as the WSDL model | |
in that the DOM tree would be kept in memory in parallel to the EMF model, | |
and the two kept in sync. | |
</p> | |
<p> | |
Here is a snippet of code which will load a BPEL process from an IFile: | |
</p> | |
<pre> | |
// New resource set, or add to an existing one | |
ResourceSet resourceSet = new ResourceSetImpl(); | |
// In non-workbench cases, find another way to create your URI | |
URI uri = URI.createPlatformResourceURI(file.getFullPath().toString()); | |
// Use getResource(), not createResource() | |
Resource resource = resourceSet.getResource(uri, true); | |
// There's only one thing in the list | |
Process process = (Process)resource.getContents().get(0); | |
</pre> | |
<p> | |
To save the process, call <i>resource.save()</i>. | |
</p> | |
<h2>Extensibility</h2> | |
<p> | |
BPEL is an extensible language. The specification builds upon the | |
extensibility support in WSDL. Many BPEL elements are subtypes of | |
<i>ExtensibleElement</i>. Such elements may contain attributes and | |
elements which are not defined in the BPEL specification. The reader | |
must therefore be extensible. When it encounters an unknown attribute | |
or element (an <i>ExtensibilityElement</i>), it should query an appropriate | |
deserializer to reconstitute the EMF model object. Likewise, the | |
writer should query an appropriate serializer to reconstitute the | |
DOM element from the EMF model object. | |
</p> | |
<p> | |
Extenders of the BPEL model should register a <i>BPELExtensionSerializer</i> | |
and <i>BPELExtensionDeserializer</i> for each of their <i>ExtensibilityElements</i>. | |
The <i>BPELExtensionRegistry</i> holds onto these registrations, and they may | |
be made during the execution of your EMF Package�s init() method. | |
If the reader or writer encounters an <i>ExtensibilityElement</i> for which | |
a serializer or deserializer is not found in the registry, the default | |
implementations <i>BPELUnknownExtensionSerializer</i> and | |
<i>BPELUnknownExtensionDeserializer</i> will be used. | |
</p> | |
<h2>Support for non-Workbench scenarios</h2> | |
<p> | |
The BPEL Model, while based on EMF, is intended to be functional both in | |
an Eclipse Workbench (either a full Workbench or headless scenario) and | |
independently of an Eclipse Workbench. The latter scenario makes the | |
model suitable to scenarios such as command-line validation, or use in a | |
Java-based runtime which is not based on Eclipse. | |
</p> | |
<p> | |
To facilitate the non-Workbench scenario, the plug-in class | |
<i>org.eclipse.bpel.core.BPELPlugin</i> extends <i>EMFPlugin</i>. | |
<i>EMFPlugin</i> is designed for exactly this scenario. Also see | |
<i>org.eclipse.bpel.core.terms.BPELTerms</i>, which has special logic to handle | |
both the Workbench and non-Workbench cases. | |
</p> | |
<p> | |
Committers must ensure that they do not introduce any code which relies | |
on the Workbench running. <i>Platform.isRunning()</i> is a safe test that can | |
be performed to determine whether or not the Workbench is running. | |
</p> | |
<h2>Dependencies</h2> | |
<p> | |
<i>org.eclipse.xsd</i> is the Eclipse XSD model, referenced by BPEL Variables | |
and other locations. | |
</p> | |
<p> | |
<i>org.eclipse.wst.wsdl</i> and <i>org.wsdl4j</i> are the WSDL model, referenced | |
in a number of places from BPEL. | |
</p> | |
<p> | |
<i>org.eclipse.emf.*</i> is the EMF runtime. | |
</p> | |
<p> | |
<i>org.apache.xerces</i> is the Xerces parser from Apache. The BPEL reader and | |
writer use this to turn the XML into model elements and vice versa. | |
</p> | |
<p> | |
<i>org.eclipse.core.runtime</i> is used by all plug-ins in an Eclipse environment. | |
</p> | |
<p> | |
<i>org.eclipse.core.resources</i> is used only in <i>BPELPlugin</i>. In general, | |
the model should not use IResources or any other functionality from | |
this plug-in due to the required support for non-Workbench scenarios. | |
</p> | |
<h2>Proxies</h2> | |
<p> | |
EMF supports object references in such a way that it is not necessary to | |
load all referenced files up front. To this end, a particular EMF object | |
may be a Proxy, which is resolved when a getter method returns a | |
particular object. | |
</p> | |
<p> | |
As an example, consider a BPEL Variable, which references an XSD type | |
(as represented by <i>org.eclipse.xsd.XSDTypeDefinition</i>). The Variable | |
API <i>getType()</i> is used to access this type. However, until <i>getType()</i> | |
is called, the referenced XSD file is not loaded, and the | |
<i>XSDTypeDefinition</i> is only a proxy. The auto-generated logic in <i>getType()</i> | |
causes the proxy to be resolved, causing the XSD file to be loaded | |
and the proxy replaced with a real <i>XSDTypeDefinition</i>, which is | |
returned to the caller. | |
</p> | |
<p> | |
In package <i>org.eclipse.bpel.model.proxy</i>, find proxy classes for all | |
referenced object types. These proxies each have a unique URI encoding | |
which contains all of the information necessary to resolve the proxy. | |
</p> | |
<p> | |
Notice also that there are proxy classes for object references within | |
the BPEL file, for references such as Variables. When deserializing a | |
BPEL file, when the reader encounters a variable reference (in a Receive, | |
for example), it should create a <i>VariableProxy</i> to put in the Receive. | |
This proxy would be resolved to the appropriate Variable when | |
<i>getVariable()</i> is called. However, it doesn�t work like that today. | |
Instead, <i>Process.getPostLoadRunnables()</i> provides access to a list of | |
runnables which are executed after the first reading pass. | |
Today, classes such as <i>VariableProxy</i> are only used when the post-load | |
runnable fails to find a particular referenced object. | |
</p> | |
<h2>Extensibility Points</h2> | |
<ul class="midlist"> | |
<li> | |
Registration of serializers and deserializers for extensibility elements | |
may be registered with the <i>BPELExtensionRegistry</i>. This registration | |
should be made in the package <i>init()</i> method of the plugin containing | |
your serializer and deserializer, and these classes must implement | |
<i>BPELExtensionSerializer</i> and <i>BPELExtensionDeserializer</i>, respectively. | |
</li> | |
<li> | |
BPEL provides for an extensible ServiceReference scheme, in the same | |
way as it allows language extensibility for expressions and queries. | |
To serialize and deserialize the service references, implement | |
<i>ServiceReferenceDeserializer</i> and <i>ServiceReferenceSerializer</i>, and | |
make your registrations in your package <i>init()</i> method, calling | |
<i>BPELExtensionRegistry.registryServiceReference[De]serializer()</i>. | |
</li> | |
<li> | |
Depending on how one defines a schema for extensibility elements, | |
order of elements and attributes may be important. To do this, | |
register in the plug-in extension point | |
<i>org.eclipse.bpel.model.extensions_reordering</i>, and provide a class which | |
implements <i>IExtensibilityElementListHandler</i>. This class will be called | |
upon serialization and you will be given the opportunity to rearrange | |
the list of extensibility elements for a given BPEL element. Note that | |
this currently only works in a Workbench environment, as it relies on | |
the plug-in extension point. | |
</li> | |
</ul> | |
<h2>Tolerance for incomplete files</h2> | |
<p> | |
The BPEL model, generally speaking, is tolerant of BPEL files which are | |
incomplete (and hence, technically, syntactically invalid), as long as | |
they are well-formed XML and have a process at the document root. This | |
is necessary because, from an editing point of view, it is clearly | |
unreasonable to force the user to specify all mandatory attributes | |
and elements before saving for the first time � it is an iterative | |
process. The model must then save and load this incomplete file, even | |
though it may not pass syntactic validation. | |
</p> | |
<h2>Making Changes to the Model</h2> | |
<p> | |
The model classes are generated from the EMF Ecore models located in | |
the org.eclipse.bpel.model/src/model folder. | |
</p> | |
<p> | |
To set your workspace up to regenerate the model, you need to do the following: | |
<ol> | |
<li>Have org.eclipse.bpel.model in loaded in your workspace from CVS</li> | |
<li>File->Import->External Plug-ins and Fragments. Select org.eclipse.xsd, org.eclipse.emf.ecore and org.eclipse.wst.wsdl and import them into your workspace. These plug-ins need to be in the workspace so their ecore and genmodel files can be loacted by EMF.</li> | |
</ol> | |
</p> | |
<p> | |
If you double-click on one of the ecore files (such as bpel.ecore), | |
you can add or remove model objects or properties. After making changes, | |
save the ecore file and close it. Double-click to open the corresponding | |
genmodel file. Right-click on the root node in the editor, and Generate | |
Model Code. EMF will generate all of the necessary Java code. | |
</p> | |
<p> | |
Please note that any methods in the model objects which do not contain | |
the @generated javadoc tag will be left alone. (As a convention, we | |
usually mark hand-modified methods with @customized for clarity). | |
</p> | |
<p> | |
After doing this, please open the class CorrelationPattern and replace | |
<pre> | |
public static final CorrelationPattern OUTIN_LITERAL = new CorrelationPattern(OUTIN, "outin"); | |
</pre> | |
with | |
<pre> | |
public static final CorrelationPattern OUTIN_LITERAL = new CorrelationPattern(OUTIN, "out-in"); | |
</pre> | |
</p> | |
</div> | |
$rightcolumn_links | |
</div> | |
EOHTML; | |
# Generate the web page | |
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html); | |
?> |