Spring Application Example

Overview

Within the context of the eoa component model, a spring application is just one of the many types of application components which can be developed and deployed within alakai. A spring application, which is implemented by a spring engine, uses the spring application framework to "wire" together an application's services (see the deployment descriptors below for an example of how this "wiring" is accomplished).

This example actually consists of four separate applications: an order management system (which is fronted by a 'web application') and three identical warehouse management applications, each of which executes within a different location, i.e. within hypothetical warehouses located in Dallas, Chicago and Atlanta. When an order is placed by the customer, via the web application, the order is fulfilled from the warehouse within closest proximity to the customer's location. See the diagram below for a detailed description of the interactions between the four different applications.

Describing the Applications

The applications and the engines which implement them are described via the descriptor contained within their respective deployments. The deployment POMs serve to define a deployment's dependencies and the deployment descriptors serve to model the components contained within the deployment. Note that a detailed discussion regarding deployment management is included within the user guide and will not be duplicated here. For your convenience, however, a reference containing all of the deployment POMs and all of the deployment descriptors, which are relevant to this specific demo, have been included below.

Coding the Applications

The Sources

The complete source code listing for the OrderManager application, the web-application that fronts it, and the WarehouseManager application is contained within the repository bundled within the alakai distribution. Each deployment is located within a separate sub-directory named according to its organization id, artifact id and version, all of which can be derived from the descriptors listed below.

The APIs

As depicted in the sequence diagram, this example consists of two separate applications and four engines, i.e. an engine which implements an instance of the OrderManager application and three engines, each of which implement an instance of the WarehouseManager application. The applications were developed using the Spring Application API and the engines were developed using the Spring Engine API. Note that you don't have to actually code the engines, i.e. you just model them within your descriptor. You do, however, have to code the applications.

Hiding the Middleware API

This is a best practice. Each EOA application type should define a corresponding application api which effectively hides the eoa specification api from its application developers, while still providing the ability to cast back into the middleware api if so desired. As an example, the MyApplication object which models a Spring Application instance, can be cast to an instance of SpringEngine, which is considered a middleware object, i.e. because it extends the EOA EngineRT class.

...

// cast 'myApplication' to an instance of SpringEngine
// for access to the 'middleware' api

MyApplication myApplication = MyApplicationContext.getApplication();
SpringEngine springEngine = (SpringEngine)myApplication;

// retrieve a reference to a hypothetical partner
// engine

QName partnerName = new QName("http://foo", "partner");
EngineReference engineReference = springEngine.getEngineReference(partnerName);

// now do something with it, e.g. examine the service
// references

engineReference.getServiceReferences();

...        
Showcasing the Underlying Technology

The application api should also provide the developer access to the underlying technology showcased by its specific application type, which in this case, is the spring application framework, e.g.

...

// cast myApplication to an instance of SpringEngine and retrieve
// the spring application context

org.springframework.context.ApplicationContext applicationContext = null;
applicationContext = ((SpringEngine)myApplication).getApplicationContext();

// now do something with it, e.g. retrieve a bean definition

Object myBean = applicationContext.getBean("myBean");
        
...        
Alternative Method Signatures

Two alternative 'styles' are provided when coding methods within your spring applications, i.e. when coding the methods which map to the operations defined on the interfaces implemented by your application. Note that the style used has no bearing on how the binding actually sends/receives the associated messages, i.e. whether it employs anonymous or non-anonymous responses. This behavior is constrained via policy.

Non-Blocking Style

The non-blocking signature is the preferred style. It is aligned more closely with the middleware api which facilitates the loose coupling of applications. The response, if any, is returned asynchronously, i.e. passed back to alakai by the SpringEngine on a separate thread.

...

public void placeOrder(MyOperation myOperation, ActionContext requestContext);

...

To use the non-blocking style requires that you create a method which has the same name as the operation you're implementing, which is 'placeOrder' in this case, and which declares MyOperation and ActionContext as arguments. See the example below for an implementation of this method signature. Note that method must not declare any checked exceptions. If an unchecked exception is thrown, alakai will translate it to an instance of SystemFault and return it to caller (assuming the MEP requires one.)

Blocking Style

The blocking style completely hides the middleware api . The request, which is modeled as an element, is processed by the application and the response, if any, is returned by the application as an element, i.e. the method's return type is org.w3c.dom.Element .

...

public Element getOrderStatus(Element request) throws OrderNotFoundFault;

...

The method name must match the name of the operation implemented, which is 'getOrderStatus' in this case. Secondly, the return value, which is typed as an Element, represents the normal response, i.e. the non-fault response. And lastly, the method may declare exceptions, i.e. types which are assignable from MyFault and/or SystemFault (which is unchecked). To return a declared fault response, an instance of MyFault, which contains the qualified name of declared fault, is thrown. Unchecked exceptions, when thrown, are converted by the SpringEngine into an instance of SystemFault .

Receiving a Request

The order fulfillment process, as depicted in the sequence diagram above, is initiated when an order is placed via the web (or alternatively initiated by a partner service). Below is a code snippet from the OrderProcessor impl which is contained within the OrderManager application and which is invoked by the SpringEngine when processing requests addressed to the OrderManagerApplication. Please refer to the comments within the order manager descriptor, which describe how this runtime 'mapping' is performed.

...

public class OrderProcessorImpl implements OrderProcessor {

...

  // this method is invoked by SpringEngine when a place order request
  // is received
  
  public void placeOrder(MyOperation myOperation, ActionContext requestContext) {

    // using message fragments (which map a schema type to a
    // predefined query string) we extract the zipcode and
    // items element from request

    Message request = requestContext.getMessage();
    String zipCode = request.evaluateString(ZIP_CODE_PROPERTY);
    Element itemsEl = (Element)request.evaluateNode(ITEMS_PROPERTY);
    List<Element> itemsList = DOMUtils.getChildElements(itemsEl);

    // using customer zip, select warehouse within closest proximity to
    // customer location and retrieve proxy which models the warehouse
    // management system. note that this object encapsulates logic
    // required to invoke a partner application, which is listed below
    // within the 'Invoking a Partner' section

    WarehouseLocation warehouseManager = WarehouseLocation.getInstance(zipCode);

    // check to see if items are available to promise. if not, an
    // out of stock exception is thrown in which case we return
    // an out of stock fault to caller

    AvailabilityResponse response = null;
    try {
        response = warehouseManager.checkAvailability(zipCode, itemsList);
    } catch (OutOfStockFault of) {
        FaultContext fResponse = myOperation.createFaultAction(OUT_OF_STOCK_FAULT);
        Message faultMessage = fResponse.getMessage();
        Element temp = (Element)faultMessage.evaluateNode(ITEMS_PROPERTY);
        for (Element item : DOMUtils.getChildElements(of.getPayload())) {
            temp.appendChild(faultMessage.adoptNode(item));
        }
        myOperation.sendResponse(fResponse);
        return;
    }

    // items are in stock and have been promised to customer. using
    // customer order number generated by warehouse management
    // system, create and persist order on our system

    Set<Item> items = new HashSet<Item>();
    for (Element temp : itemsList) {
        Item catalogItem = catalogProcessor.getItem(temp.getAttribute("id"));
        Item orderItem = new Item(catalogItem.getId(), catalogItem.getDescription());
        orderItem.setQuantity(Integer.parseInt(temp.getAttribute("quantity")));
        orderItem.setPrice(catalogItem.getPrice() * orderItem.getQuantity());
        items.add(orderItem);
    }

    String orderNumber = response.getOrderNumber();
    double sc = response.getShippingCost();
    CustomerOrder customerOrder = new CustomerOrder(orderNumber, zipCode, items, sc);
    customerOrderDAO.insertCustomerOrder(customerOrder);

    // now we schedule the order with warehouse management system.
    // note that this is a potentially long running exchange, so
    // we serialize the message exchange instance within the customer
    // order as an outstanding request which is un-marshalled
    // when the partner response is received and is used to complete
    // the exchange (see the example listed below within the
    // 'Returning a Response' section)

    customerOrder.addOutstandingRequest(new OutstandingRequest(myOperation));
    customerOrderDAO.updateCustomerOrder(customerOrder);
    warehouseManager.scheduleOrder(orderNumber);

  }

...

}

Returning a Response

Because the non-blocking method signature was used to process the place order request, we use the MyOperation object, i.e. the MEP instance, to return the order confirmation response back to client as depicted within the sequence diagram above.

...

public class OrderProcessorImpl implements OrderProcessor {

  ....

  // invoked by WarehouseLocation object which processes asynchronous replies
  // sent in response to schedule order requests. see the 'Invoking a Partner'
  // example listed below for detail
   
  public void placeOrderResponse(CustomerOrder customerOrder, Date estimatedShipDate) {

      // now we process the outstanding processOrder request by
      // retrieving the MEP instance serialized within the placeOrder
      // method

      String mexID = MyOperation.toID(myRole, PLACE_ORDER_OPERATION);
      OutstandingRequest or = customerOrder.getOutstandingRequest(mexID);
      MyOperation myOperation = or.getMessageExchange();

      // create a runtime response message instance. the def for
      // which is provided within the example-business-docs
      // deployment descriptor, i.e. we don't have to build it
      // up manually

      ActionContext placeOrderResponse = myOperation.createResponseAction();
      Element payload = placeOrderResponse.getMessage().getContent();
      payload.setAttribute("orderNumber", customerOrder.getOrderNumber());
      String date = DateFormat.getDateInstance().format(customerOrder.getEstShipDate());
      payload.setAttribute("estimatedShipDate", date);
      Double totalPrice = 0;
      for (Item orderItem : customerOrder.getItems()) {
          totalPrice = totalPrice + orderItem.getPrice();
      }
      Double shipCost = customerOrder.getShipCost();
      totalPrice = totalPrice + shipCost;
      payload.setAttribute("shippingCost", Double.toString(shipCost));
      payload.setAttribute("totalPrice", Double.toString(totalPrice));
    
      // return the response to the client, set flag which indicates
      // outstanding request is complete and update customer order
      // record
    
      myOperation.sendResponse(placeOrderResponse);
      or.setResponseSent(true);
      customerOrderDAO.updateCustomerOrder(customerOrder);

  }

  ...

}

Invoking a Partner

Within the OrderManager application, the logic required to invoke the partner WarehouseManager application is encapsulated within the WarehouseLocation class, which is listed below. Note that by modeling the partner as an EOA application component, we can manipulate multiple instances abstractly, i.e. the interactions with the WarehouseManager application instance which executes within the Dallas location are handled no differently than the interactions with the application instances which execute within the Chicago and Atlanta locations. This is an important concept and one which is highlighted within the user guide under the topic engine assignment.

...

public class WarehouseLocation extends AbstractWarehouse {

  private PartnerApplication partner;

  private WarehouseLocation(PartnerApplication partner) {
      this.partner = partner;
  }

  /**
   * Using customer zip, retrieves an instance of warehouse manager application,
   * i.e. which executes at warehouse location within closest proximity of
   * customer location.
   * 
   * @param zipCode
   * @return
   */
  public static WarehouseLocation getInstance(String zipCode) {

      MyApplication myApplication = MyApplicationContext.getApplication();

      PartnerApplication partner = null;
      int temp = Integer.parseInt(zipCode);
      if (temp > 75200 && temp < 75400) {
          partner = myApplication.getPartner(Constants.DALLAS_WAREHOUSE);
      } else if (temp > 30300 && temp < 31200) {
          partner = myApplication.getPartner(Constants.ATLANTA_WAREHOUSE);
      } else {
          partner = myApplication.getPartner(Constants.CHICAGO_WAREHOUSE);
      }

      return new WarehouseLocation(partner);

  }

  /**
   * Checks item availability at selected warehouse location as modeled by 
   * the 'partner' instance variable.
   * 
   * 
   * @param partner
   *        warehouse management system
   * @return String order number if items available to promise
   * @throws OutOfStockException
   *         if items out of stock
   */
  public AvailabilityResponse checkAvailability(String zipCode, List<Element> items) throws OutOfStockFault {

      // retrieve a role performed by partner, i.e which maps to an
      // interface, and the desired operation

      PartnerRole pRole = partner.getPartnerRole(PARTNER_AVAILABILITY_ROLE);
      PartnerOperation pOperation = pRole.createOperation(CHECK_AVAILABILITY_OPERATION);

      // populate partner request and check availability of items ordered
      // by customer

      ActionContext pRequest = pOperation.createRequestAction();
      Node zipCodeElement = pRequest.getMessage().evaluateNode(ZIP_CODE_PROPERTY);
      DOMUtils.setText((Element)zipCodeElement, zipCode);
      Element itemsElement = (Element)pRequest.getMessage().evaluateNode(ITEMS_PROPERTY);
      for (Element item : items) {
          itemsElement.appendChild(pRequest.getMessage().importNode(item, true));
      }

      // if items are not available to promise, an out of stock fault
      // is returned containing deficient items

      ActionContext pResponse = pOperation.sendRequest(pRequest, 1000 * 10);
      Message responseMessage = pResponse.getMessage();
      if (pResponse instanceof FaultContext) {
          itemsElement = (Element)responseMessage.evaluateNode(ITEMS_PROPERTY);
          throw new OutOfStockFault(itemsElement);
      } else {
          String orderNumber = responseMessage.evaluateString(ORDER_NUMBER_PROPERTY);
          Element payload = responseMessage.getContent();
          Element shipCostElement = DOMUtils.getFirstChildElement(payload);
          Double shippingCost = null;
          try {
              String text = DOMUtils.getText(shipCostElement);
              shippingCost = (Double)NumberFormat.getCurrencyInstance().parse(text);
          } catch (ParseException pe) {
              throw new RuntimeException(pe.getMessage());
          }
          return new AvailabilityResponse(orderNumber, shippingCost);
      }

  }

 /**
   * Schedules order with warehouse management system responsible for fulfilling
   * order as modeled by 'partner' instance variable. Warehouse has already
   * earmarked inventory as 'promised.' Note that response is returned
   * asynchronously, i.e. this is a potentially long-running exchange. See the
   * 'Receiving a Response' example below.
   * 
   * @param orderNumber
   */
  public void scheduleOrder(String orderNumber) {
      PartnerRole pRole = partner.getPartnerRole(PARTNER_ORDER_PROCESSOR_ROLE);
      PartnerOperation pOperation = pRole.createOperation(SCHEDULE_ORDER_OPERATION);
      ActionContext request = pOperation.createRequestAction();
      Element payload = request.getMessage().getContent();
      payload.setAttribute("orderNumber", orderNumber);
      pOperation.sendRequest(request);
  }

}

Receiving a Response

When a partner is invoked using the non-blocking invocation API, i.e. as depicted within the WarehouseLocation.scheduleOrder() method above, the response, if any, is returned to the application by the SpringEngine by invoking a method defined on an application class defined within the application's deployment descriptor (please refer to the comments within the order manager descriptor, which describe how this runtime 'mapping' is performed.) As indicated below, the method's signature must define the ActionContext class as single argument with a void return type and no declared exceptions.

...

/**
 * Models 'warehouse manager' partner application abstractly, i.e. it handles
 * asynchronous responses from all warehouse locations.
 */
public class AbstractWarehouse implements Warehouse {
    
    private OrderProcessor orderProcessor;
    private CustomerOrderDAO customerOrderDAO;
  
    /**
     * Receives schedule order response asynchronously and terminates message
     * exchange initiated within OrderProcessor#placeOrder(MyOperation, ActionContext)}
     * 
     * @param response
     */
    public void scheduleOrderResponse(ActionContext responseContext) {
      
        // locate order which has been successfully scheduled for
        // shipment and update it with estimated ship date

        Message response = responseContext.getMessage();
        String orderNumber = response.evaluateString(ORDER_NUMBER_PROPERTY);
    
        CustomerOrder customerOrder = customerOrderDAO.selectCustomerOrder(orderNumber);
        if (customerOrder == null) {
            log.error("received schedule order response with invalid order id " 
              + orderNumber);
            return;
        }
    
        String temp = response.getContent().getAttribute("estimatedShipDate");
        Date estimatedShipDate = null;
        try {
            estimatedShipDate = DateFormat.getDateInstance().parse(temp);
        } catch (ParseException pe) {
            String error = "error processing schedule order response " 
              + pe.getMessage();
            log.error(error);
            customerOrder.setError(error);
            customerOrder.setStatus(Status.ERROR);
            customerOrderDAO.updateCustomerOrder(customerOrder);
            return;
        }
    
        customerOrder.setEstShipDate(estimatedShipDate);
        customerOrderDAO.updateCustomerOrder(customerOrder);
    
        // notify order processor of estimated ship date, so that it
        // can process the outstanding place order request
    
        orderProcessor.placeOrderResponse(customerOrder, estimatedShipDate);
      
    }
  
    /**
     * Receives get order status response asynchronously.
     * 
     * @param response
     */
     public void getOrderStatusResponse(ActionContext responseContext) {
         // getOrderStatus operation is never invoked on partner
     }
  
    /*
     * dependency injector. set by spring framework
     */
    public void setCustomerOrderDAO(CustomerOrderDAO customerOrderDAO) {
        this.customerOrderDAO = customerOrderDAO;
    }
  
    /*
     * dependency injector. set by spring framework
     */
    public void setOrderProcessor(OrderProcessor orderProcessor) {
        this.orderProcessor = orderProcessor;
    }

}

Installing and Running the Example

No installation is necessary, assuming you've already installed alakai. The distribution includes the definitions for the order management application and its engine, etc ... within the 'samples/spring/ordermgr' system sub-directory, and the definitions for the warehouse management applications and their respective engines, etc ... within the 'samples/spring/whsemgr' system sub-directory.

To run the demo, execute two separate system instances. Note that you need roughly 250 mb of available RAM to run two instances on the same box, so unless you've got RAM to spare, close your IDE, etc ... before running.

  • To run the first system instance, cd to the alakai/bin directory, type 'run samples/spring/ordermgr' and hit enter
  • To run the second system instance, in a separate cmd window/terminal, cd to the alakai/bin directory, type 'run samples/spring/whsemgr' and hit enter
  • Then go to http://localhost:8090/order/ to place your order.

    Note that changing your zip code, causes the order to be fulfilled from a different warehouse - as indicated by the the first three letters of the order number. Also, 'water wiggles' are perpetually out of stock. They're just too much fun.

Descriptor References

Deployment POMs

Each application deployment contains a project descriptor which serves to define the deployment's dependencies, i.e. the extensions required by the application in order to implement its behavior. Alakai uses the maven dependency manager (which uses a pom.xml file) to model a project's dependencies. For more information regarding dependency management within the context of the alakai system, please refer to the dependency management section of the user guide. The POM files for the applications and the engines that implement them are listed below.

Application POMs
Order Manager POM
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <parent>
    <groupId>org.bluestemsoftware.open.eoa.example.order.manager.eoa</groupId>
    <artifactId>example-order-manager-eoa</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.bluestemsoftware.open.eoa.example.order.manager.eoa</groupId>
  <artifactId>order-manager-application</artifactId>
  <version>0.8.0.0</version>
  <packaging>eoa-component</packaging>
  <name>order-manager-application</name>
  <url>http://alakai.org</url>
  <build>
    <plugins>
      <plugin>
        <groupId>org.bluestemsoftware.open.eoa.plugin</groupId>
        <artifactId>maven-eoa-plugin</artifactId>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- ************************ test dependencies ******************************** -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.test.system</groupId>
      <artifactId>system-test</artifactId>
      <version>0.8.0.0</version>
      <scope>test</scope>
    </dependency>
    <!-- ********************** provided dependencies ****************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa</groupId>
      <artifactId>specification-eoa</artifactId>
      <scope>system</scope>
      <systemPath>${env.ALAKAI_HOME}/repository/org/bluestemsoftware/specification/eoa/specification-eoa/0.8.0.0/specification-eoa-0.8.0.0.jar</systemPath>
    </dependency>
    <!-- *********************** shared dependencies ******************************* -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa.ext</groupId>
      <artifactId>specification-eoa-ext</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.application.spring</groupId>
      <artifactId>spring-application-api</artifactId>
      <version>0.8.0.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <scope>provided</scope>
    </dependency>
    <!-- *********************** scoped dependencies ******************************* -->
    <dependency>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
      <scope>compile</scope>
      <version>2.9.0</version>
      <optional>true</optional>
      <exclusions>
        <exclusion>
          <groupId>xml-apis</groupId>
          <artifactId>xml-apis</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.order.manager</groupId>
      <artifactId>order-manager-api</artifactId>
      <version>0.8.0.0</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>    
    <!-- *********************** feature dependencies ****************************** -->
    <!-- ********************** component dependencies ***************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.business.docs</groupId>
      <artifactId>example-business-docs</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager</groupId>
      <artifactId>warehouse-manager-application</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
      <optional>true</optional>
    </dependency>
    <!-- *********************** module dependencies ******************************* -->
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.order.manager.web.retail</groupId>
      <artifactId>order-manager-web-retail</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>war</type>
    </dependency>
  </dependencies>
</project>
Warehouse Manager POM
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <parent>
    <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager</groupId>
    <artifactId>example-warehouse-manager</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager</groupId>
  <artifactId>warehouse-manager-application</artifactId>
  <version>0.8.0.0</version>
  <packaging>eoa-component</packaging>
  <name>warehouse-manager-application</name>
  <url>http://alakai.org</url>
  <build>
    <plugins>
      <plugin>
        <groupId>org.bluestemsoftware.open.eoa.plugin</groupId>
        <artifactId>maven-eoa-plugin</artifactId>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- ************************ test dependencies ******************************** -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.test.system</groupId>
      <artifactId>system-test</artifactId>
      <version>0.8.0.0</version>
      <scope>test</scope>
    </dependency>
    <!-- ********************** provided dependencies ****************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa</groupId>
      <artifactId>specification-eoa</artifactId>
      <scope>system</scope>
      <systemPath>${env.ALAKAI_HOME}/repository/org/bluestemsoftware/specification/eoa/specification-eoa/0.8.0.0/specification-eoa-0.8.0.0.jar</systemPath>
    </dependency>
    <!-- *********************** shared dependencies ******************************* -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa.ext</groupId>
      <artifactId>specification-eoa-ext</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.application.spring</groupId>
      <artifactId>spring-application-api</artifactId>
      <version>0.8.0.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.engine.spring</groupId>
      <artifactId>spring-engine-api</artifactId>
      <version>0.8.0.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>2.5.1</version>
      <scope>provided</scope>
      <optional>true</optional><!-- project classpath only. provided by engine -->
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>2.5.1</version>
      <scope>provided</scope>
      <optional>true</optional><!-- project classpath only. provided by engine -->
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>2.5.1</version>
      <scope>provided</scope>
      <optional>true</optional><!-- project classpath only. provided by engine -->
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <!-- *********************** scoped dependencies ******************************* -->
    <dependency>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
      <scope>compile</scope>
      <version>2.9.0</version>
      <optional>true</optional>
      <exclusions>
        <exclusion>
          <groupId>xml-apis</groupId>
          <artifactId>xml-apis</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <!-- *********************** feature dependencies ****************************** -->
    <!-- ********************** component dependencies ***************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.business.docs</groupId>
      <artifactId>example-business-docs</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.order.manager.eoa</groupId>
      <artifactId>order-manager-application</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
      <optional>true</optional>
    </dependency>
    <!-- *********************** module dependencies ******************************* -->
  </dependencies>
</project>
Engine POMs
Order Manager Engine POM
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <parent>
    <groupId>org.bluestemsoftware.open.eoa.example.order.manager.eoa</groupId>
    <artifactId>example-order-manager-eoa</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.bluestemsoftware.open.eoa.example.order.manager.eoa</groupId>
  <artifactId>order-manager-engine</artifactId>
  <version>0.8.0.0</version>
  <packaging>eoa-component</packaging>
  <name>order-manager-engine</name>
  <url>http://alakai.org</url>
  <build>
    <plugins>
      <plugin>
        <groupId>org.bluestemsoftware.open.eoa.plugin</groupId>
        <artifactId>maven-eoa-plugin</artifactId>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- ************************ test dependencies ******************************** -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.test.system</groupId>
      <artifactId>system-test</artifactId>
      <version>0.8.0.0</version>
      <scope>test</scope>
    </dependency>
    <!-- ********************** provided dependencies ****************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa</groupId>
      <artifactId>specification-eoa</artifactId>
      <scope>system</scope>
      <systemPath>${env.ALAKAI_HOME}/repository/org/bluestemsoftware/specification/eoa/specification-eoa/0.8.0.0/specification-eoa-0.8.0.0.jar</systemPath>
    </dependency>
    <!-- *********************** shared dependencies ******************************* -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa.ext</groupId>
      <artifactId>specification-eoa-ext</artifactId>
      <scope>provided</scope>
    </dependency>
    <!-- *********************** scoped dependencies ******************************* -->
    <!-- *********************** feature dependencies ****************************** -->
    <!-- ********************** component dependencies ***************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
      <artifactId>warehouse-manager-atlanta</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
      <artifactId>warehouse-manager-chicago</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
      <artifactId>warehouse-manager-dallas</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>
Atlanta Warehouse Engine POM
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <parent>
    <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
    <artifactId>warehouse-manager-engine</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
  <artifactId>warehouse-manager-atlanta</artifactId>
  <version>0.8.0.0</version>
  <packaging>eoa-component</packaging>
  <name>warehouse-manager-atlanta</name>
  <url>http://alakai.org</url>
  <build>
    <plugins>
      <plugin>
        <groupId>org.bluestemsoftware.open.eoa.plugin</groupId>
        <artifactId>maven-eoa-plugin</artifactId>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- ************************ test dependencies ******************************** -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.test.system</groupId>
      <artifactId>system-test</artifactId>
      <version>0.8.0.0</version>
      <scope>test</scope>
    </dependency>
    <!-- ********************** provided dependencies ****************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa</groupId>
      <artifactId>specification-eoa</artifactId>
      <scope>system</scope>
      <systemPath>${env.ALAKAI_HOME}/repository/org/bluestemsoftware/specification/eoa/specification-eoa/0.8.0.0/specification-eoa-0.8.0.0.jar</systemPath>
    </dependency>
    <!-- *********************** shared dependencies ******************************* -->
      <dependency>
      <groupId>org.bluestemsoftware.specification.eoa.ext</groupId>
      <artifactId>specification-eoa-ext</artifactId>
      <scope>provided</scope>
    </dependency>
    <!-- *********************** scoped dependencies ******************************* -->
    <!-- *********************** feature dependencies ****************************** -->
    <!-- ********************** component dependencies ***************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.order.manager.eoa</groupId>
      <artifactId>order-manager-engine</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>
Chicago Warehouse Engine POM
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <parent>
    <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
    <artifactId>warehouse-manager-engine</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
  <artifactId>warehouse-manager-chicago</artifactId>
  <version>0.8.0.0</version>
  <packaging>eoa-component</packaging>
  <name>warehouse-manager-chicago</name>
  <url>http://alakai.org</url>
  <build>
    <plugins>
      <plugin>
        <groupId>org.bluestemsoftware.open.eoa.plugin</groupId>
        <artifactId>maven-eoa-plugin</artifactId>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- ************************ test dependencies ******************************** -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.test.system</groupId>
      <artifactId>system-test</artifactId>
      <version>0.8.0.0</version>
      <scope>test</scope>
    </dependency>
    <!-- ********************** provided dependencies ****************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa</groupId>
      <artifactId>specification-eoa</artifactId>
      <scope>system</scope>
      <systemPath>${env.ALAKAI_HOME}/repository/org/bluestemsoftware/specification/eoa/specification-eoa/0.8.0.0/specification-eoa-0.8.0.0.jar</systemPath>
    </dependency>
    <!-- *********************** shared dependencies ******************************* -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa.ext</groupId>
      <artifactId>specification-eoa-ext</artifactId>
      <scope>provided</scope>
    </dependency>
    <!-- *********************** scoped dependencies ******************************* -->
    <!-- *********************** feature dependencies ****************************** -->
    <!-- ********************** component dependencies ***************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.order.manager.eoa</groupId>
      <artifactId>order-manager-engine</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>
Dallas Warehouse Engine POM
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <parent>
    <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
    <artifactId>warehouse-manager-engine</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.bluestemsoftware.open.eoa.example.warehouse.manager.engine</groupId>
  <artifactId>warehouse-manager-dallas</artifactId>
  <version>0.8.0.0</version>
  <packaging>eoa-component</packaging>
  <name>warehouse-manager-dallas</name>
  <url>http://alakai.org</url>
  <build>
    <plugins>
      <plugin>
        <groupId>org.bluestemsoftware.open.eoa.plugin</groupId>
        <artifactId>maven-eoa-plugin</artifactId>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- ************************ test dependencies ******************************** -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.test.system</groupId>
      <artifactId>system-test</artifactId>
      <version>0.8.0.0</version>
      <scope>test</scope>
    </dependency>
    <!-- ********************** provided dependencies ****************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.specification.eoa</groupId>
      <artifactId>specification-eoa</artifactId>
      <scope>system</scope>
      <systemPath>${env.ALAKAI_HOME}/repository/org/bluestemsoftware/specification/eoa/specification-eoa/0.8.0.0/specification-eoa-0.8.0.0.jar</systemPath>
    </dependency>
    <!-- *********************** shared dependencies ******************************* -->
      <dependency>
      <groupId>org.bluestemsoftware.specification.eoa.ext</groupId>
      <artifactId>specification-eoa-ext</artifactId>
      <scope>provided</scope>
    </dependency>
    <!-- *********************** scoped dependencies ******************************* -->
    <!-- *********************** feature dependencies ****************************** -->
    <!-- ********************** component dependencies ***************************** -->
    <dependency>
      <groupId>org.bluestemsoftware.open.eoa.example.order.manager.eoa</groupId>
      <artifactId>order-manager-engine</artifactId>
      <version>0.8.0.0</version>
      <scope>runtime</scope>
      <type>eoa-component</type>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

Deployment Descriptors

A deployment descriptor defines the components contained within its associated deployment. For more information regarding deployment descriptors and the different types of deployments supported by alakai, please see the deployment management section of the user-guide.

This demo involves seven different deployments: a deployment which contains the definitions for the messages used by the applications, two application deployments each of which contains the corresponding definition for its application, and four engine deployments each of which defines an engine which implements, i.e. executes, its corresponding application .

Business Documents
<?xml version="1.0"?>
<deployment xmlns="http://bluestemsoftware.org/specification/eoa/1.0/deployment">
  <providers>
    <xs:schema id="MyProperties" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mycompany.com/business/docs" xmlns:tns="http://mycompany.com/business/docs">
      <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
        <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
          <eoa:property name="ZipCode" type="tns:tZipCode" />
          <eoa:property name="OrderNumber" type="tns:tOrderNumber" />
          <eoa:property name="Items" type="tns:tItemDetail" />
        </xs:appinfo>
      </xs:annotation>
      <xs:complexType name="tItemDetail">
        <xs:sequence>
          <xs:element name="Item" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
              <xs:attribute name="id" use="required" type="xs:NCName" />
              <xs:attribute name="quantity" use="required" type="xs:int" />
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
      <xs:simpleType name="tZipCode">
        <xs:restriction base="xs:string">
          <xs:pattern value="\d{5}|\d{0}" />
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType name="tOrderNumber">
        <xs:restriction base="xs:string">
          <xs:pattern value="\c{3}-\d{5}" />
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>
    <xs:schema id="MyMessages" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mycompany.com/business/docs" xmlns:tns="http://mycompany.com/business/docs">
      <xs:include schemaLocation="#MyProperties" />
      <xs:element name="AvailabilityRequest">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:ZipCode">
              <eoa:query>/tns:AvailabilityRequest/tns:ZipCode</eoa:query>
            </eoa:fragment>
            <eoa:fragment property="tns:Items">
              <eoa:query>/tns:AvailabilityRequest/tns:Items</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ZipCode" type="tns:tZipCode" />
            <xs:element name="Items" type="tns:tItemDetail" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AvailabilityResponse">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:OrderNumber">
              <eoa:query>/tns:AvailabilityResponse/@orderNumber</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ShippingCost" type="xs:string" />
          </xs:sequence>
          <xs:attribute name="orderNumber" type="tns:tOrderNumber" />
        </xs:complexType>
      </xs:element>
      <xs:element name="OutOfStockFault">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:Items">
              <eoa:query>/tns:OutOfStockFault/tns:Items</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Items" type="tns:tItemDetail" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="OrderNotFoundFault">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:OrderNumber">
              <eoa:query>/tns:OrderNotFoundFault/@orderNumber</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="orderNumber" type="tns:tOrderNumber" />
        </xs:complexType>
      </xs:element>
      <xs:element name="OrderRequest">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:ZipCode">
              <eoa:query>/tns:OrderRequest/tns:ZipCode</eoa:query>
            </eoa:fragment>
            <eoa:fragment property="tns:Items">
              <eoa:query>/tns:OrderRequest/tns:Items</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ZipCode" type="tns:tZipCode" />
            <xs:element name="Items" type="tns:tItemDetail" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="OrderResponse">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:OrderNumber">
              <eoa:query>/tns:OrderResponse/@orderNumber</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="orderNumber" type="tns:tOrderNumber" />
          <xs:attribute name="shippingCost" />
          <xs:attribute name="totalPrice" />
          <xs:attribute name="estimatedShipDate" />
        </xs:complexType>
      </xs:element>
      <xs:element name="ScheduleOrderRequest">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:OrderNumber">
              <eoa:query>/tns:ScheduleOrderRequest/@orderNumber</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="orderNumber" type="tns:tOrderNumber" />
        </xs:complexType>
      </xs:element>
      <xs:element name="ScheduleOrderResponse">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:OrderNumber">
              <eoa:query>/tns:ScheduleOrderResponse/@orderNumber</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="orderNumber" type="tns:tOrderNumber" />
          <xs:attribute name="estimatedShipDate" />
        </xs:complexType>
      </xs:element>
      <xs:element name="getOrderStatus">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:OrderNumber">
              <eoa:query>/tns:getOrderStatus/tns:OrderNumber</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="OrderNumber" type="tns:tOrderNumber" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="OrderStatusResponse">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:OrderNumber">
              <eoa:query>/tns:OrderStatusResponse/@orderNumber</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="orderNumber" type="tns:tOrderNumber" />
          <xs:attribute name="status" />
        </xs:complexType>
      </xs:element>
      <xs:element name="ShippingConfirmation">
        <xs:annotation xmlns:eoa="http://bluestemsoftware.org/specification/eoa/1.0/component/schema/ext">
          <xs:appinfo source="http://bluestemsoftware.org/specification/eoa/1.0">
            <eoa:fragment property="tns:OrderNumber">
              <eoa:query>/tns:ShippingConfirmation/@orderNumber</eoa:query>
            </eoa:fragment>
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="orderNumber" type="tns:tOrderNumber" />
          <xs:attribute name="actualShipDate" />
        </xs:complexType>
      </xs:element>
    </xs:schema>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:OrderRequest">
      <payload xmlns="">
        <OrderRequest xmlns="http://mycompany.com/business/docs">
          <ZipCode />
          <Items />
        </OrderRequest>
      </payload>
    </eoa:message>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:OrderResponse">
      <payload xmlns="">
        <OrderResponse xmlns="http://mycompany.com/business/docs"/>
      </payload>
    </eoa:message>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:AvailabilityRequest">
      <payload xmlns="">
        <AvailabilityRequest xmlns="http://mycompany.com/business/docs">
          <ZipCode />
          <Items />
        </AvailabilityRequest>
      </payload>
    </eoa:message>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:AvailabilityResponse">
      <payload xmlns="">
        <AvailabilityResponse xmlns="http://mycompany.com/business/docs">
          <ShippingCost />
        </AvailabilityResponse>
      </payload>
    </eoa:message>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:ScheduleOrderRequest">
      <payload xmlns="">
        <ScheduleOrderRequest xmlns="http://mycompany.com/business/docs" />
      </payload>
    </eoa:message>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:ScheduleOrderResponse">
      <payload xmlns="">
        <ScheduleOrderResponse xmlns="http://mycompany.com/business/docs" />
      </payload>
    </eoa:message>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:OrderStatusResponse">
      <payload xmlns="">
        <OrderStatusResponse xmlns="http://mycompany.com/business/docs" />
      </payload>
    </eoa:message>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:ShippingConfirmation">
      <payload xmlns="">
        <ShippingConfirmation xmlns="http://mycompany.com/business/docs" />
      </payload>
    </eoa:message>
    <eoa:message xmlns:eoa="http://bluestemsoftware.org/specification/eoa/ext/message/default/1.0" xmlns:tns="http://mycompany.com/business/docs" name="tns:OutOfStockFault">
      <payload xmlns="">
        <OutOfStockFault xmlns="http://mycompany.com/business/docs">
          <Items />
        </OutOfStockFault>
      </payload>
    </eoa:message>
  </providers>
</deployment>
Application Descriptors
Order Manager Descriptor
<deployment xmlns="http://bluestemsoftware.org/specification/eoa/1.0/deployment">
  <components>
    <wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl" targetNamespace="http://com.mycompany/eoa/om/1.0" xmlns:tns="http://com.mycompany/eoa/om/1.0">
      <wsdl:types>
        <xs:import namespace="http://mycompany.com/business/docs" xmlns:xs="http://www.w3.org/2001/XMLSchema" />
      </wsdl:types>
      <wsdl:interface name="OrderProcessor" xmlns:ns01="http://mycompany.com/business/docs">
        <wsdl:fault name="OutOfStockFault" element="ns01:OutOfStockFault" />
        <wsdl:fault name="OrderNotFoundFault" element="ns01:OrderNotFoundFault" />
        <wsdl:operation name="placeOrder" pattern="http://www.w3.org/ns/wsdl/in-out">
          <wsdl:input element="ns01:OrderRequest" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:placeOrder" />
          <wsdl:output element="ns01:OrderResponse" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:placeOrderResponse" />
          <wsdl:outfault ref="tns:OutOfStockFault" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:placeOrderOutOfStockFault" />
        </wsdl:operation>
        <wsdl:operation name="getOrderStatus" pattern="http://www.w3.org/ns/wsdl/in-out" style="http://www.w3.org/ns/wsdl/style/iri" xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions" wsdlx:safe="true">
          <wsdl:input element="ns01:getOrderStatus" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:getOrderStatus" />
          <wsdl:output element="ns01:OrderStatusResponse" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:getOrderStatusResponse" />
          <wsdl:outfault ref="tns:OrderNotFoundFault" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:getOrderStatusOrderNotFoundFault" />
        </wsdl:operation>
        <wsdl:operation name="completeOrder" pattern="http://www.w3.org/ns/wsdl/in-only">
          <wsdl:input element="ns01:ShippingConfirmation" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:completeOrder" />
        </wsdl:operation>
      </wsdl:interface>
      <ext:application xmlns:ext="http://bluestemsoftware.org/specification/eoa/1.0/component/wsdl/ext" name="OrderManager">
        <ext:role name="http://mycompany.com/om/order/processor" interface="tns:OrderProcessor" />
      </ext:application>
    </wsdl:description>
  </components>
  <providers>
    <application xmlns="http://bluestemsoftware.org/open/eoa/ext/application/spring/1.0" xmlns:tns="http://com.mycompany/eoa/om/1.0" name="tns:OrderManager">
      <partners>
        <!-- 
          define a reference to self 
         -->
        <applicationReference applicationName="tns:OrderManager">
          <!-- 
            define a role reference for each role defined on referenced application component.
            note that the 'beanType' attribute specifies the name of a class (preferrably an
            interface) which MUST be assignable from a bean defined within the engine configuration.
            in this case the OrderManagerEngine defines the 'OrderProcessor' bean which maps to
            the class 'org.bluestemsoftware.open.eoa.example.order.manager.service.OrderProcessorImpl'
            which implements the 'OrderProcessor' interface.          
          -->
          <roleReference roleName="http://mycompany.com/om/order/processor" beanType="org.bluestemsoftware.open.eoa.example.order.manager.service.OrderProcessor" />
        </applicationReference>
        <!-- 
          define a reference to the OrderManager application
         -->
        <applicationReference xmlns:ns="http://software.vendor.com/1.0" applicationName="ns:WarehouseManager">
          <!-- 
            define a role reference for each role defined on referenced application component.
            note that the 'beanType' attribute specifies the name of a class (preferrably an
            interface) which MAY be assignable from a bean defined within the engine configuration,
            i.e. if an asynchronous 'callback' is expected when partner is invoked. in this case
            the OrderManagerEngine defines the 'AbstractWarehouse' bean which maps to the class
            'org.bluestemsoftware.open.eoa.example.order.manager.service.AbstractWarehouse'
            which implements the 'Warehouse' interface.          
          -->
          <roleReference roleName="http://mycompany.com/wm/order/processor" beanType="org.bluestemsoftware.open.eoa.example.order.manager.service.Warehouse" />
        </applicationReference>
      </partners>
    </application>
  </providers>
</deployment>
Warehouse Manager Descriptor
<deployment xmlns="http://bluestemsoftware.org/specification/eoa/1.0/deployment">
  <components>
    <wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl" targetNamespace="http://software.vendor.com/1.0" xmlns:tns="http://software.vendor.com/1.0">
      <wsdl:types>
        <xs:import namespace="http://mycompany.com/business/docs" xmlns:xs="http://www.w3.org/2001/XMLSchema" />
      </wsdl:types>
      <wsdl:interface name="AvailabilityProcessor" xmlns:ns01="http://mycompany.com/business/docs">
        <wsdl:fault name="OutOfStockFault" element="ns01:OutOfStockFault" />
        <wsdl:operation name="checkAvailability" pattern="http://www.w3.org/ns/wsdl/in-out">
          <wsdl:input element="ns01:AvailabilityRequest" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:checkAvailability" />
          <wsdl:output element="ns01:AvailabilityResponse" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:checkAvailabilityResponse" />
          <wsdl:outfault ref="tns:OutOfStockFault" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:checkAvailabilityOutOfStockFault" />
        </wsdl:operation>
      </wsdl:interface>
      <wsdl:interface name="OrderProcessor" xmlns:ns01="http://mycompany.com/business/docs">
        <wsdl:operation name="scheduleOrder" pattern="http://www.w3.org/ns/wsdl/in-out">
          <wsdl:input element="ns01:ScheduleOrderRequest" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:scheduleOrder" />
          <wsdl:output element="ns01:ScheduleOrderResponse" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:scheduleOrderResponse" />
        </wsdl:operation>
        <wsdl:operation name="getOrderStatus" pattern="http://www.w3.org/ns/wsdl/in-out" style="http://www.w3.org/ns/wsdl/style/iri" xmlns:wsdlx="http://www.w3.org/ns/wsdl-extensions">
          <wsdl:input element="ns01:getOrderStatus" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:getOrderStatus" />
          <wsdl:output element="ns01:OrderStatusResponse" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" wsam:Action="urn:getOrderStatusResponse" />
        </wsdl:operation>
      </wsdl:interface>
      <ext:application xmlns:ext="http://bluestemsoftware.org/specification/eoa/1.0/component/wsdl/ext" name="WarehouseManager">
        <ext:role name="http://mycompany.com/wm/availability/processor" interface="tns:AvailabilityProcessor" />
        <ext:role name="http://mycompany.com/wm/order/processor" interface="tns:OrderProcessor" />
      </ext:application>
    </wsdl:description>
  </components>
  <providers>
    <application xmlns="http://bluestemsoftware.org/open/eoa/ext/application/spring/1.0" xmlns:tns="http://software.vendor.com/1.0" name="tns:WarehouseManager">
      <partners>
        <!-- 
          define a reference to self 
         -->
        <applicationReference applicationName="tns:WarehouseManager">
          <!-- 
            define a role reference for each role defined on referenced application component.
            note that the 'beanType' attribute specifies the name of a class (preferrably an interface)
            which MUST be assignable from a bean defined within the engine configuration. In this case, the
            WarehouseManagerEngines all define the 'AvailabilityProcessor' bean and the 'OrderProcessor'
            bean which are assignable from the beanTypes indicated here (i.e. they're the same class.)        
          -->
          <roleReference roleName="http://mycompany.com/wm/availability/processor" beanType="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.AvailabilityProcessor" />
          <roleReference roleName="http://mycompany.com/wm/order/processor" beanType="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.OrderProcessor" />
        </applicationReference>
        <applicationReference xmlns:ns="http://com.mycompany/eoa/om/1.0" applicationName="ns:OrderManager">
          <!-- 
            note that we're not required to map a bean to partner order processor role. we
            invoke complete order operation which uses 'in-only' mep - no response to handle 
          -->
        </applicationReference>
      </partners>
    </application>
  </providers>
</deployment>
Engine Descriptors
Order Manager Engine Descriptor
<deployment xmlns="http://bluestemsoftware.org/specification/eoa/1.0/deployment">
  <components>
    <wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl" targetNamespace="http://com.mycompany/eoa/om/1.0" xmlns:tns="http://com.mycompany/eoa/om/1.0">
      <wsdl:binding name="POXHTTPBinding" type="http://www.w3.org/ns/wsdl/http" interface="tns:OrderProcessor">
        <wsdl:operation ref="tns:placeOrder" xmlns:whttp="http://www.w3.org/ns/wsdl/http" whttp:location="placeOrder" />
        <wsdl:operation ref="tns:getOrderStatus" xmlns:whttp="http://www.w3.org/ns/wsdl/http" whttp:location="getOrderStatus" whttp:method="GET" />
        <wsdl:operation ref="tns:completeOrder" xmlns:whttp="http://www.w3.org/ns/wsdl/http" whttp:location="completeOrder" />
      </wsdl:binding>
      <wsdl:binding name="SOAP12HTTPBinding" type="http://www.w3.org/ns/wsdl/soap" xmlns:wsoap="http://www.w3.org/ns/wsdl/soap" wsoap:version="1.2" wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/" />
      <wsdl:binding name="SOAP12VMTPBinding" type="http://www.w3.org/ns/wsdl/soap" xmlns:wsoap="http://www.w3.org/ns/wsdl/soap" wsoap:version="1.2" wsoap:protocol="http://bluestemsoftware.org/specification/eoa/ext/soap12/vmtp" />
      <wsdl:service name="OrderService" interface="tns:OrderProcessor" xmlns:whtp="http://www.w3.org/ns/wsdl/http">
        <wsdl:endpoint name="POXEndpoint" binding="tns:POXHTTPBinding" address="http://localhost:8080/eoa/ws/OrderService/POXHTTPEndpoint/" />
        <wsdl:endpoint name="SOAP12HTTPEndpoint" binding="tns:SOAP12HTTPBinding" address="http://localhost:8080/eoa/ws/OrderService/SOAP12HTTPEndpoint/">
          <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
            <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
              <wsp:Policy />
            </wsam:Addressing>
          </wsp:Policy>
        </wsdl:endpoint>
        <wsdl:endpoint name="SOAP12VMTPEndpoint" binding="tns:SOAP12VMTPBinding" address="vmtp:/eoa/ws/OrderService/SOAP12VMTPEndpoint/">
          <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
            <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
              <wsp:Policy>
                <wsam:NonAnonymousResponses />
              </wsp:Policy>
            </wsam:Addressing>
          </wsp:Policy>
        </wsdl:endpoint>
      </wsdl:service>
      <ext:engine xmlns:ext="http://bluestemsoftware.org/specification/eoa/1.0/component/wsdl/ext" name="OrderManagerEngine" application="tns:OrderManager">
        <ext:actor role="http://mycompany.com/om/order/processor" service="tns:OrderService" />
      </ext:engine>
    </wsdl:description>
  </components>
  <providers>
    <binding xmlns="http://bluestemsoftware.org/specification/eoa/ext/binding/http/default/1.0" xmlns:tns="http://com.mycompany/eoa/om/1.0" name="tns:POXHTTPBinding">
      <configuration>
        <operations>
          <operation name="tns:placeOrder">
            <requestorTimeout>6000000</requestorTimeout>
          </operation>
          <operation name="tns:getOrderStatus">
            <requestorTimeout>6000000</requestorTimeout>
          </operation>
        </operations>
        <maxPayloadProcessors>5</maxPayloadProcessors>
      </configuration>
    </binding>
    <binding xmlns="http://bluestemsoftware.org/specification/eoa/ext/binding/soap/default/1.0" xmlns:tns="http://com.mycompany/eoa/om/1.0" name="tns:SOAP12HTTPBinding">
      <configuration>
        <embedStackTraceInFaults>true</embedStackTraceInFaults>
        <requestorTimeout>6000000</requestorTimeout>
        <minHeaderProcessors>5</minHeaderProcessors>
        <maxPayloadProcessors>5</maxPayloadProcessors>
      </configuration>
    </binding>
    <engine xmlns="http://bluestemsoftware.org/open/eoa/engine/spring/1.0" xmlns:tns="http://com.mycompany/eoa/om/1.0" name="tns:OrderManagerEngine">
      <!--
        The following section represents spring engine type specific configuration. It contains an
        optional web-module deployment which will be loaded by the spring engine, and an embedded
        set of spring bean definitions.
      -->
      <configuration>
        <modules>
          <web ref="org.bluestemsoftware.open.eoa.example.order.manager.web.retail/order-manager-web-retail/war">
            <rootContext>order</rootContext>
          </web>
        </modules>
        <beans xmlns="http://www.springframework.org/schema/beans" default-init-method="init" default-destroy-method="destroy">
          <!--
            All requests targeted to the 'http://mycompany.com/om/order/processor' role as defined
            within the 'OrderManagerApplication' deployment descriptor will be forwarded to the
            'OrderProcessorImpl' class by invoking a method whose signature matches the invoked
            operation. Note that the class defined below must be assignable from the 'beanType'
            defined within the runtime application definition.
          -->
          <bean id="OrderProcessor" class="org.bluestemsoftware.open.eoa.example.order.manager.service.OrderProcessorImpl">
            <property name="catalogProcessor">
              <ref bean="CatalogProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
          </bean>
          <!--
            All requests targeted to the 'http://mycompany.com/wm/order/processor' role as defined
            within the 'OrderManagerApplication' deployment descriptor (which in this case represent
            asynchronous 'callbacks' from the 'WarehouseManagerApplication' will be forwarded to the
            'AbstractWarehouse' class by invoking a method whose signature matches the invoked
            operation. Note that the class defined below must be assignable from the 'beanType'
            defined within the runtime application definition.
          -->
          <bean id="AbstractWarehouse" class="org.bluestemsoftware.open.eoa.example.order.manager.service.AbstractWarehouse">
            <property name="orderProcessor">
              <ref bean="OrderProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
          </bean>
          <!--
            The following beans are injected into the beans defined above by
            the Spring Application Framework.
          -->
          <bean id="CatalogProcessor" class="org.bluestemsoftware.open.eoa.example.order.manager.service.CatalogProcessorImpl" />
          <bean id="CustomerOrderDAO" class="org.bluestemsoftware.open.eoa.example.order.manager.service.dao.CustomerOrderDAO" />
        </beans>
      </configuration>
      <partners>
        <engineReference xmlns:ns="http://my.company.com/wm/atlanta/1.0" engineName="ns:WarehouseManagerEngine">
          <serviceReference serviceName="ns:AvailabilityService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - supplements whttp attribs defined on ref'd endpoint. configures
                - clients for outbound requests. pwd retrieved from cred. store.
                - value 'partnerhost' is placeholder for actual host name defined
                - on referenced endpoint address
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="partnerhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - enables jaas authentication on servlet which handles async
                - responses returned by partner service. value 'myhost' is
                - placeholder for actual host name and/or ip address. users
                - are defined within credential store
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="myhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - overrides host on default wsa:ReplyTo address generated by
                - ws-addressing feature with 'localhost' so example will
                - will work on any machine
               -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy xmlns:wsaf="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/addressing/policy/1.0">
                    <wsam:NonAnonymousResponses wsaf:replyTo="http://localhost:8080/eoa/ws/xmlns(ns=http://com.mycompany/eoa/om/1.0)ns:OrderManagerEngine/xmlns(ns=http://my.company.com/wm/atlanta/1.0)ns:WarehouseManagerEngine/xmlns(ns=http://my.company.com/wm/atlanta/1.0)ns:AvailabilityService/SOAP12Endpoint/" />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
          <serviceReference serviceName="ns:OrderService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - supplements whttp attribs defined on ref'd endpoint. configures
                - clients for outbound requests. pwd retrieved from cred. store.
                - value 'partnerhost' is placeholder for actual host name defined
                - on referenced endpoint address
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="partnerhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - enables jaas authentication on servlet which handles async
                - responses returned by partner service. value 'myhost' is
                - placeholder for actual host name and/or ip address. users
                - are defined within credential store 
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="myhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - overrides host on default wsa:ReplyTo address generated by
                - ws-addressing feature with 'localhost' so example will
                - will work on any machine
               -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy xmlns:wsaf="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/addressing/policy/1.0">
                    <wsam:NonAnonymousResponses wsaf:replyTo="http://localhost:8080/eoa/ws/xmlns(ns=http://com.mycompany/eoa/om/1.0)ns:OrderManagerEngine/xmlns(ns=http://my.company.com/wm/atlanta/1.0)ns:WarehouseManagerEngine/xmlns(ns=http://my.company.com/wm/atlanta/1.0)ns:OrderService/SOAP12Endpoint/" />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
        <engineReference xmlns:ns="http://my.company.com/wm/dallas/1.0" engineName="ns:WarehouseManagerEngine">
          <serviceReference serviceName="ns:AvailabilityService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - supplements whttp attribs defined on ref'd endpoint. configures
                - clients for outbound requests. pwd retrieved from cred. store.
                - value 'partnerhost' is placeholder for actual host name defined
                - on referenced endpoint address
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="partnerhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - enables jaas authentication on servlet which handles async
                - responses returned by partner service. value 'myhost' is
                - placeholder for actual host name and/or ip address. users
                - are defined within credential store 
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="myhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - overrides host on default wsa:ReplyTo address generated by
                - ws-addressing feature with 'localhost' so example will
                - will work on any machine
               -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy xmlns:wsaf="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/addressing/policy/1.0">
                    <wsam:NonAnonymousResponses wsaf:replyTo="http://localhost:8080/eoa/ws/xmlns(ns=http://com.mycompany/eoa/om/1.0)ns:OrderManagerEngine/xmlns(ns=http://my.company.com/wm/dallas/1.0)ns:WarehouseManagerEngine/xmlns(ns=http://my.company.com/wm/dallas/1.0)ns:AvailabilityService/SOAP12Endpoint/" />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
          <serviceReference serviceName="ns:OrderService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - supplements whttp attribs defined on ref'd endpoint. configures
                - clients for outbound requests. pwd retrieved from cred. store.
                - value 'partnerhost' is placeholder for actual host name defined
                - on referenced endpoint address
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="partnerhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - enables jaas authentication on servlet which handles async
                - responses returned by partner endpoint. value 'myhost' is
                - placeholder for actual host name and/or ip address. users
                - are defined within credential store 
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="myhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - overrides host on default wsa:ReplyTo address generated by
                - ws-addressing feature with 'localhost' so example will
                - will work on any machine
               -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy xmlns:wsaf="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/addressing/policy/1.0">
                    <wsam:NonAnonymousResponses wsaf:replyTo="http://localhost:8080/eoa/ws/xmlns(ns=http://com.mycompany/eoa/om/1.0)ns:OrderManagerEngine/xmlns(ns=http://my.company.com/wm/dallas/1.0)ns:WarehouseManagerEngine/xmlns(ns=http://my.company.com/wm/dallas/1.0)ns:OrderService/SOAP12Endpoint/" />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
        <engineReference xmlns:ns="http://my.company.com/wm/chicago/1.0" engineName="ns:WarehouseManagerEngine">
          <serviceReference serviceName="ns:AvailabilityService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - supplements whttp attribs defined on ref'd endpoint. configures
                - clients for outbound requests. pwd retrieved from cred. store.
                - value 'partnerhost' is placeholder for actual host name defined
                - on referenced endpoint address
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="partnerhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - enables jaas authentication on servlet which handles async
                - responses returned by partner endpoint. value 'myhost' is
                - placeholder for actual host name and/or ip address. users
                - are defined within credential store 
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="myhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - overrides host on default wsa:ReplyTo address generated by
                - ws-addressing feature with 'localhost' so example will
                - will work on any machine
               -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy xmlns:wsaf="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/addressing/policy/1.0">
                    <wsam:NonAnonymousResponses wsaf:replyTo="http://localhost:8080/eoa/ws/xmlns(ns=http://com.mycompany/eoa/om/1.0)ns:OrderManagerEngine/xmlns(ns=http://my.company.com/wm/chicago/1.0)ns:WarehouseManagerEngine/xmlns(ns=http://my.company.com/wm/chicago/1.0)ns:AvailabilityService/SOAP12Endpoint/" />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
          <serviceReference serviceName="ns:OrderService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - supplements whttp attribs defined on ref'd endpoint. configures
                - clients for outbound requests. pwd retrieved from cred. store.
                - value 'partnerhost' is placeholder for actual host name defined
                - on referenced endpoint address
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="partnerhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - enables jaas authentication on servlet which handles async
                - responses returned by partner endpoint. value 'myhost' is
                - placeholder for actual host name and/or ip address. users
                - are defined within credential store 
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="myhost" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                </dns:authInfo>
              </wsp:Policy>
              <!-- 
                - overrides host on default wsa:ReplyTo address generated by
                - ws-addressing feature with 'localhost' so example will
                - will work on any machine
               -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy xmlns:wsaf="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/addressing/policy/1.0">
                    <wsam:NonAnonymousResponses wsaf:replyTo="http://localhost:8080/eoa/ws/xmlns(ns=http://com.mycompany/eoa/om/1.0)ns:OrderManagerEngine/xmlns(ns=http://my.company.com/wm/chicago/1.0)ns:WarehouseManagerEngine/xmlns(ns=http://my.company.com/wm/chicago/1.0)ns:OrderService/SOAP12Endpoint/" />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
      </partners>
    </engine>
  </providers>
</deployment>
Atlanta Warehouse Engine Descriptor
<deployment xmlns="http://bluestemsoftware.org/specification/eoa/1.0/deployment">
  <components>
    <wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl" targetNamespace="http://my.company.com/wm/atlanta/1.0" xmlns:tns="http://my.company.com/wm/atlanta/1.0" xmlns:ns01="http://software.vendor.com/1.0">
      <wsp:Policy xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="WSAPolicy" xmlns:wsp="http://www.w3.org/ns/ws-policy">
        <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
          <wsp:Policy>
            <wsam:NonAnonymousResponses />
          </wsp:Policy>
        </wsam:Addressing>
      </wsp:Policy>
      <wsdl:binding name="SOAP12Binding" type="http://www.w3.org/ns/wsdl/soap" xmlns:wsoap="http://www.w3.org/ns/wsdl/soap" wsoap:version="1.2" wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/" />
      <wsdl:service name="AvailabilityService" interface="ns01:AvailabilityProcessor">
        <!-- 
          - note that whttp attribs enable jaas authentication on inbound requests.
          - credentials are defined within credential store feature configuration
        -->
        <wsdl:endpoint name="SOAP12Endpoint" binding="tns:SOAP12Binding" xmlns:whtp="http://www.w3.org/ns/wsdl/http" whtp:authenticationScheme="basic" whtp:authenticationRealm="warehouse" address="http://localhost:8082/eoa/ws/xmlns(ns=http://my.company.com/wm/atlanta/1.0)ns:AvailabilityService/SOAP12Endpoint/">
          <wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy" URI="#WSAPolicy" />
        </wsdl:endpoint>
      </wsdl:service>
      <wsdl:service name="OrderService" interface="ns01:OrderProcessor">
        <!-- 
          - note that whttp attribs enable jaas authentication on inbound requests.
          - credentials are defined within credential store feature configuration
        -->
        <wsdl:endpoint name="SOAP12Endpoint" binding="tns:SOAP12Binding" xmlns:whtp="http://www.w3.org/ns/wsdl/http" whtp:authenticationScheme="basic" whtp:authenticationRealm="warehouse" address="http://localhost:8082/eoa/ws/xmlns(ns=http://my.company.com/wm/atlanta/1.0)ns:OrderService/SOAP12Endpoint/">
          <wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy" URI="#WSAPolicy" />
        </wsdl:endpoint>
      </wsdl:service>
      <ext:engine xmlns:ext="http://bluestemsoftware.org/specification/eoa/1.0/component/wsdl/ext" name="WarehouseManagerEngine" application="ns01:WarehouseManager">
        <ext:actor role="http://mycompany.com/wm/availability/processor" service="tns:AvailabilityService" />
        <ext:actor role="http://mycompany.com/wm/order/processor" service="tns:OrderService" />
      </ext:engine>
    </wsdl:description>
  </components>
  <providers>
    <binding xmlns="http://bluestemsoftware.org/specification/eoa/ext/binding/soap/default/1.0" xmlns:tns="http://my.company.com/wm/atlanta/1.0" name="tns:SOAP12Binding">
      <configuration>
        <embedStackTraceInFaults>true</embedStackTraceInFaults>
        <requestorTimeout>6000000</requestorTimeout>
        <minHeaderProcessors>5</minHeaderProcessors>
        <maxPayloadProcessors>5</maxPayloadProcessors>
      </configuration>
    </binding>
    <engine xmlns="http://bluestemsoftware.org/open/eoa/engine/spring/1.0" xmlns:tns="http://my.company.com/wm/atlanta/1.0" name="tns:WarehouseManagerEngine">
      <!--
        The following section represents spring engine type specific configuration. It contains an
        an embedded set of spring bean definitions.
      -->
      <configuration xmlns:cfg="http://bluestemsoftware.org/specification/eoa/ext/engine/spring/config/1.0">
        <beans xmlns="http://www.springframework.org/schema/beans" default-init-method="init" default-destroy-method="destroy">
          <!--
            All requests targeted to the 'http://mycompany.com/wm/availability/processor' role as defined
            within the 'WarehouseManagerApplication' deployment descriptor will be forwarded to the
            'AvailabilityProcessor' class by invoking a method whose signature matches the invoked
            operation. Note that the class defined below must be assignable from the 'beanType'
            defined within the runtime application definition.
          -->
          <bean id="AvailabilityProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.AvailabilityProcessor">
            <property name="shippingProcessor">
              <ref bean="ShippingProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
            <property name="inventory">
              <map>
                <entry key="1" value="100000" />
                <entry key="2" value="100000" />
                <entry key="3" value="100000" />
                <entry key="4" value="100000" />
                <entry key="5" value="0" />
              </map>
            </property>
          </bean>
          <!--
            All requests targeted to the 'http://mycompany.com/wm/order/processor' role as defined
            within the 'WarehouseManagerApplication' deployment descriptor will be forwarded to the
            'OrderProcessor' class by invoking a method whose signature matches the invoked
            operation. Note that the class defined below must be assignable from the 'beanType'
            defined within the runtime application definition.
          -->
          <bean id="OrderProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.OrderProcessor">
            <property name="shippingProcessor">
              <ref bean="ShippingProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
          </bean>
          <!--
            The following beans are injected into the beans defined above by
            the Spring Application Framework.
          -->
          <bean id="ShippingProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.ShippingProcessor">
            <property name="orderProcessor">
              <ref bean="OrderProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
          </bean>
          <bean id="CustomerOrderDAO" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.dao.CustomerOrderDAO">
            <!-- TODO: use jee:jndi-lookup tag to inject datasource once directory server feature implemented -->
          </bean>
        </beans>
      </configuration>
      <partners>
        <engineReference engineName="tns:WarehouseManagerEngine">
          <serviceReference serviceName="tns:AvailabilityService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - configures client for aysnc responses sent in response to requests
                - addressed to this endpoint. password retrieved from credential store
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="localhost" port="8080" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
          <serviceReference serviceName="tns:OrderService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - configures client for aysnc responses sent in response to requests
                - addressed to this endpoint. password retrieved from credential store
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="localhost" port="8080" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
        <engineReference xmlns:ns="http://com.mycompany/eoa/om/1.0" engineName="ns:OrderManagerEngine">
          <serviceReference serviceName="ns:OrderService">
            <endpointReference endpointName="SOAP12HTTPEndpoint">
              <!-- 
                - public policy on ref'd endpoint is non-specific regarding anon
                - responses. overrides default behavior which is to use non-anon
               -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy>
                    <wsam:AnonymousResponses />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
      </partners>
    </engine>
  </providers>
</deployment>
Chicago Warehouse Engine Descriptor
<deployment xmlns="http://bluestemsoftware.org/specification/eoa/1.0/deployment">
  <components>
    <wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl" targetNamespace="http://my.company.com/wm/chicago/1.0" xmlns:tns="http://my.company.com/wm/chicago/1.0" xmlns:ns01="http://software.vendor.com/1.0">
      <wsp:Policy xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="WSAPolicy" xmlns:wsp="http://www.w3.org/ns/ws-policy">
        <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
          <wsp:Policy>
            <wsam:NonAnonymousResponses />
          </wsp:Policy>
        </wsam:Addressing>
      </wsp:Policy>
      <wsdl:binding name="SOAP12Binding" type="http://www.w3.org/ns/wsdl/soap" xmlns:wsoap="http://www.w3.org/ns/wsdl/soap" wsoap:version="1.2" wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/" />
      <wsdl:service name="AvailabilityService" interface="ns01:AvailabilityProcessor">
        <!-- 
          - note that whttp attribs enable jaas authentication on inbound requests.
          - credentials are defined within credential store feature configuration
        -->
        <wsdl:endpoint name="SOAP12Endpoint" binding="tns:SOAP12Binding" xmlns:whtp="http://www.w3.org/ns/wsdl/http" whtp:authenticationScheme="basic" whtp:authenticationRealm="warehouse" address="http://localhost:8082/eoa/ws/xmlns(ns=http://my.company.com/wm/chicago/1.0)ns:AvailabilityService/SOAP12Endpoint/">
          <wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy" URI="#WSAPolicy" />
        </wsdl:endpoint>
      </wsdl:service>
      <wsdl:service name="OrderService" interface="ns01:OrderProcessor">
        <!-- 
          - note that whttp attribs enable jaas authentication on inbound requests.
          - credentials are defined within credential store feature configuration
        -->
        <wsdl:endpoint name="SOAP12Endpoint" binding="tns:SOAP12Binding" xmlns:whtp="http://www.w3.org/ns/wsdl/http" whtp:authenticationScheme="basic" whtp:authenticationRealm="warehouse" address="http://localhost:8082/eoa/ws/xmlns(ns=http://my.company.com/wm/chicago/1.0)ns:OrderService/SOAP12Endpoint/">
          <wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy" URI="#WSAPolicy" />
        </wsdl:endpoint>
      </wsdl:service>
      <ext:engine xmlns:ext="http://bluestemsoftware.org/specification/eoa/1.0/component/wsdl/ext" name="WarehouseManagerEngine" application="ns01:WarehouseManager">
        <ext:actor role="http://mycompany.com/wm/availability/processor" service="tns:AvailabilityService" />
        <ext:actor role="http://mycompany.com/wm/order/processor" service="tns:OrderService" />
      </ext:engine>
    </wsdl:description>
  </components>
  <providers>
    <binding xmlns="http://bluestemsoftware.org/specification/eoa/ext/binding/soap/default/1.0" xmlns:tns="http://my.company.com/wm/chicago/1.0" name="tns:SOAP12Binding">
      <configuration>
        <embedStackTraceInFaults>true</embedStackTraceInFaults>
        <requestorTimeout>6000000</requestorTimeout>
        <minHeaderProcessors>5</minHeaderProcessors>
        <maxPayloadProcessors>5</maxPayloadProcessors>
      </configuration>
    </binding>
    <engine xmlns="http://bluestemsoftware.org/open/eoa/engine/spring/1.0" xmlns:tns="http://my.company.com/wm/chicago/1.0" name="tns:WarehouseManagerEngine">
      <!--
        The following section represents spring engine type specific configuration. It contains an
        an embedded set of spring bean definitions.
      -->
      <configuration xmlns:cfg="http://bluestemsoftware.org/specification/eoa/ext/engine/spring/config/1.0">
        <beans xmlns="http://www.springframework.org/schema/beans" default-init-method="init" default-destroy-method="destroy">
          <!--
            All requests targeted to the 'http://mycompany.com/wm/availability/processor' role as defined
            within the 'WarehouseManagerApplication' deployment descriptor will be forwarded to the
            'AvailabilityProcessor' class by invoking a method whose signature matches the invoked
            operation. Note that the class defined below must be assignable from the 'beanType'
            defined within the runtime application definition.
          -->
          <bean id="AvailabilityProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.AvailabilityProcessor">
            <property name="shippingProcessor">
              <ref bean="ShippingProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
            <property name="inventory">
              <map>
                <entry key="1" value="100000" />
                <entry key="2" value="100000" />
                <entry key="3" value="100000" />
                <entry key="4" value="100000" />
                <entry key="5" value="0" />
              </map>
            </property>
          </bean>
          <!--
            All requests targeted to the 'http://mycompany.com/wm/order/processor' role as defined
            within the 'WarehouseManagerApplication' deployment descriptor will be forwarded to the
            'OrderProcessor' class by invoking a method whose signature matches the invoked
            operation. Note that the class defined below must be assignable from the 'beanType'
            defined within the runtime application definition.
          -->
          <bean id="OrderProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.OrderProcessor">
            <property name="shippingProcessor">
              <ref bean="ShippingProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
          </bean>
          <!--
            The following beans are injected into the beans defined above by
            the Spring Application Framework.
          -->
          <bean id="ShippingProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.ShippingProcessor">
            <property name="orderProcessor">
              <ref bean="OrderProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
          </bean>
          <bean id="CustomerOrderDAO" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.dao.CustomerOrderDAO">
            <!-- TODO: use jee:jndi-lookup tag to inject datasource once directory server feature implemented -->
          </bean>
        </beans>
      </configuration>
      <partners>
        <engineReference engineName="tns:WarehouseManagerEngine">
          <serviceReference serviceName="tns:AvailabilityService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - configures client for aysnc responses sent in response to requests
                - addressed to this endpoint. password retrieved from credential store
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="localhost" port="8080" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
          <serviceReference serviceName="tns:OrderService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - configures client for aysnc responses sent in response to requests
                - addressed to this endpoint. password retrieved from credential store
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="localhost" port="8080" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
        <engineReference xmlns:ns="http://com.mycompany/eoa/om/1.0" engineName="ns:OrderManagerEngine">
          <serviceReference serviceName="ns:OrderService">
            <endpointReference endpointName="SOAP12HTTPEndpoint">
              <!-- 
                - public policy on ref'd endpoint is non-specific regarding anon
                - responses. overrides default behavior which is to use non-anon
               -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy>
                    <wsam:AnonymousResponses />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
      </partners>
    </engine>
  </providers>
</deployment>
Dallas Warehouse Engine Descriptor
<deployment xmlns="http://bluestemsoftware.org/specification/eoa/1.0/deployment">
  <components>
    <wsdl:description xmlns:wsdl="http://www.w3.org/ns/wsdl" targetNamespace="http://my.company.com/wm/dallas/1.0" xmlns:tns="http://my.company.com/wm/dallas/1.0" xmlns:ns01="http://software.vendor.com/1.0">
      <wsp:Policy xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="WSAPolicy" xmlns:wsp="http://www.w3.org/ns/ws-policy">
        <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
          <wsp:Policy>
            <wsam:NonAnonymousResponses />
          </wsp:Policy>
        </wsam:Addressing>
      </wsp:Policy>
      <wsdl:binding name="SOAP12Binding" type="http://www.w3.org/ns/wsdl/soap" xmlns:wsoap="http://www.w3.org/ns/wsdl/soap" wsoap:version="1.2" wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/" />
      <wsdl:service name="AvailabilityService" interface="ns01:AvailabilityProcessor">
        <!-- 
          - note that whttp attribs enable jaas authentication on inbound requests.
          - credentials are defined within credential store feature configuration
        -->
        <wsdl:endpoint name="SOAP12Endpoint" binding="tns:SOAP12Binding" xmlns:whtp="http://www.w3.org/ns/wsdl/http" whtp:authenticationScheme="basic" whtp:authenticationRealm="warehouse" address="http://localhost:8082/eoa/ws/xmlns(ns=http://my.company.com/wm/dallas/1.0)ns:AvailabilityService/SOAP12Endpoint/">
          <wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy" URI="#WSAPolicy" />
        </wsdl:endpoint>
      </wsdl:service>
      <wsdl:service name="OrderService" interface="ns01:OrderProcessor">
        <!-- 
          - note that whttp attribs enable jaas authentication on inbound requests.
          - credentials are defined within credential store feature configuration
        -->
        <wsdl:endpoint name="SOAP12Endpoint" binding="tns:SOAP12Binding" xmlns:whtp="http://www.w3.org/ns/wsdl/http" whtp:authenticationScheme="basic" whtp:authenticationRealm="warehouse" address="http://localhost:8082/eoa/ws/xmlns(ns=http://my.company.com/wm/dallas/1.0)ns:OrderService/SOAP12Endpoint/">
          <wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy" URI="#WSAPolicy" />
        </wsdl:endpoint>
      </wsdl:service>
      <ext:engine xmlns:ext="http://bluestemsoftware.org/specification/eoa/1.0/component/wsdl/ext" name="WarehouseManagerEngine" application="ns01:WarehouseManager">
        <ext:actor role="http://mycompany.com/wm/availability/processor" service="tns:AvailabilityService" />
        <ext:actor role="http://mycompany.com/wm/order/processor" service="tns:OrderService" />
      </ext:engine>
    </wsdl:description>
  </components>
  <providers>
    <binding xmlns="http://bluestemsoftware.org/specification/eoa/ext/binding/soap/default/1.0" xmlns:tns="http://my.company.com/wm/dallas/1.0" name="tns:SOAP12Binding">
      <configuration>
        <embedStackTraceInFaults>true</embedStackTraceInFaults>
        <requestorTimeout>6000000</requestorTimeout>
        <minHeaderProcessors>5</minHeaderProcessors>
        <maxPayloadProcessors>5</maxPayloadProcessors>
      </configuration>
    </binding>
    <engine xmlns="http://bluestemsoftware.org/open/eoa/engine/spring/1.0" xmlns:tns="http://my.company.com/wm/dallas/1.0" name="tns:WarehouseManagerEngine">
      <!--
        The following section represents spring engine type specific configuration. It contains an
        an embedded set of spring bean definitions.
      -->
      <configuration xmlns:cfg="http://bluestemsoftware.org/specification/eoa/ext/engine/spring/config/1.0">
        <beans xmlns="http://www.springframework.org/schema/beans" default-init-method="init" default-destroy-method="destroy">
          <!--
            All requests targeted to the 'http://mycompany.com/wm/availability/processor' role as defined
            within the 'WarehouseManagerApplication' deployment descriptor will be forwarded to the
            'AvailabilityProcessor' class by invoking a method whose signature matches the invoked
            operation. Note that the class defined below must be assignable from the 'beanType'
            defined within the runtime application definition.
          -->
          <bean id="AvailabilityProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.AvailabilityProcessor">
            <property name="shippingProcessor">
              <ref bean="ShippingProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
            <property name="inventory">
              <map>
                <entry key="1" value="100000" />
                <entry key="2" value="100000" />
                <entry key="3" value="100000" />
                <entry key="4" value="100000" />
                <entry key="5" value="0" />
              </map>
            </property>
          </bean>
          <!--
            All requests targeted to the 'http://mycompany.com/wm/order/processor' role as defined
            within the 'WarehouseManagerApplication' deployment descriptor will be forwarded to the
            'OrderProcessor' class by invoking a method whose signature matches the invoked
            operation. Note that the class defined below must be assignable from the 'beanType'
            defined within the runtime application definition.
          -->
          <bean id="OrderProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.OrderProcessor">
            <property name="shippingProcessor">
              <ref bean="ShippingProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
          </bean>
          <!--
            The following beans are injected into the beans defined above by
            the Spring Application Framework.
          -->
          <bean id="ShippingProcessor" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.ShippingProcessor">
            <property name="orderProcessor">
              <ref bean="OrderProcessor" />
            </property>
            <property name="customerOrderDAO">
              <ref bean="CustomerOrderDAO" />
            </property>
          </bean>
          <bean id="CustomerOrderDAO" class="org.bluestemsoftware.open.eoa.example.warehouse.manager.service.dao.CustomerOrderDAO">
            <!-- TODO: use jee:jndi-lookup tag to inject datasource once directory server feature implemented -->
          </bean>
        </beans>
      </configuration>
      <partners>
        <engineReference engineName="tns:WarehouseManagerEngine">
          <serviceReference serviceName="tns:AvailabilityService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - configures client for aysnc responses sent in response to requests
                - addressed to this endpoint. password retrieved from credential store
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="localhost" port="8080" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
          <serviceReference serviceName="tns:OrderService">
            <endpointReference endpointName="SOAP12Endpoint">
              <!-- 
                - configures client for aysnc responses sent in response to requests
                - addressed to this endpoint. password retrieved from credential store
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <dns:authInfo host="localhost" port="8080" xmlns:dns="http://bluestemsoftware.org/specification/eoa/ext/feature/ws/transport/http/policy/1.0">
                  <dns:scheme>basic</dns:scheme>
                  <dns:realm>ordermgr</dns:realm>
                  <dns:user>someone</dns:user>
                </dns:authInfo>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
        <engineReference xmlns:ns="http://com.mycompany/eoa/om/1.0" engineName="ns:OrderManagerEngine">
          <serviceReference serviceName="ns:OrderService">
            <endpointReference endpointName="SOAP12HTTPEndpoint">
              <!-- 
                - public policy on ref'd endpoint is non-specific regarding anon
                - responses. overrides default behavior which is to use non-anon
              -->
              <wsp:Policy xmlns:wsp="http://www.w3.org/ns/ws-policy">
                <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
                  <wsp:Policy>
                    <wsam:AnonymousResponses />
                  </wsp:Policy>
                </wsam:Addressing>
              </wsp:Policy>
            </endpointReference>
          </serviceReference>
        </engineReference>
      </partners>
    </engine>
  </providers>
</deployment>

Web Module Descriptors

web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <display-name>Order Manager Web Module</display-name>

  <description>Referenced as a dependency within Order Manager example application</description>

  <!--
    - Used in place of spring's context loader. Loads the root application
    - context for THIS WEB MODULE at startup (by default from the url
    - '/WEB-INF/applicationContext.xml') and sets as its parent, the root
    - application context for the order manager application defined within
    - 'META-INF/eoa/deployment.xml' of the order manager deployment.
  -->
  <listener>
    <listener-class>org.bluestemsoftware.open.eoa.ext.engine.spring10.util.ContextLoaderListener</listener-class>
  </listener>

  <!--
    - Servlet that dispatches request to registered handlers (Controller
    - implementations). Has its own application context, by default defined
    - in '{servlet-name}-servlet.xml', i.e. 'ordermanager-servlet.xml',
    - which has as its parent the root application context for THIS WEB
    - MODULE. If none defined, then parent is root application context
    - for order manager application (see comment above.)
  -->
  <servlet>
    <servlet-name>ordermanager</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <!-- 
    - All request uri's used within this web app end in '.htm' and are
    - handled by the dispatcher servlet. The uri-to-controller mappings
    - are defined within 'order-manager-servlet.xml'
    -->
  <servlet-mapping>
    <servlet-name>ordermanager</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

  <!--
    - The only 'visible' file directly accessible from web. Loaded by
    - default when request url matches root context URI, i.e. '/order'
   -->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>
applicationContext.xml
 <!--
  - Defines 'root' application context for THIS WEB MODULE. Appropriate for utility
  - classes etc ... used within web tier, i.e. which may be shared among controllers
  - defined in servlet specific application contexts (child contexts)
  -->
  
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

  <bean id="MyUtils" class="org.bluestemsoftware.open.eoa.example.order.manager.web.retail.util.MyUtils"/>

</beans>
ordermanager-servlet.xml
<!--
  - Defines application context for the 'ordermanager' DispatcherServlet. Contains metadata
  - used by servlet to map requests to controllers
-->

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-init-method="init" default-destroy-method="destroy">

  <!-- 
    - Allows us to use simple names for views, e.g. 'order' will be mapped
    - to '/WEB-INF/jsp/order.jsp' by spring.
  -->
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
  </bean>

  <!-- 
    - Request URI's ending in '/order.htm' will be handled by this
    - controller. notice that the collaborators 'orderProcessor'
    - and 'catalogProcessor' are retrieved from root application
    - context of order manager application, i.e. visible to all
    - web modules. The 'myUtils' collaborator is defined within
    - this web module's application context, i.e. only visible to
    - this web module (which includes all servlet contexts)
  -->
  <bean name="order" class="org.bluestemsoftware.open.eoa.example.order.manager.web.retail.OrderController">
    <property name="formView" value="order" />
    <property name="successView" value="redirect:confirm.htm" />
    <property name="orderProcessor">
      <ref bean="OrderProcessor" />
    </property>
    <property name="catalogProcessor">
      <ref bean="CatalogProcessor" />
    </property>
    <property name="myUtils">
      <ref bean="MyUtils" />
    </property>
  </bean>
  
  <!-- 
    - Request URI's ending in '/status.htm' will be handled by this
    - controller. notice that the collaborator 'orderProcessor'
    - is retrieved from root application context of order manager
    - application.
  -->
  <bean name="status" class="org.bluestemsoftware.open.eoa.example.order.manager.web.retail.StatusController">
    <property name="formView" value="status" />
    <property name="successView" value="redirect:inform.htm" />
    <property name="orderProcessor">
      <ref bean="OrderProcessor" />
    </property>
  </bean>

  <!-- 
    - an 'out-of-the-box' controller works for this page, i.e. no custom
    - behavior. controller uses uri file name, i.e. 'home', as view name
  -->
  <bean id="home" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />

  <!-- 
    - an 'out-of-the-box' controller works for this page, i.e. no custom
    - behavior. controller uses uri file name, i.e. 'logout', as view name
  -->
  <bean id="logout" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
  
  <!-- 
    - an 'out-of-the-box' controller works for this page, i.e. no custom
    - behavior. controller uses uri file name, i.e. 'inform', as view name
  -->
  <bean id="inform" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />

  <!-- 
    - dispatcher servlet uses these mappings to match request uri's to
    - bean name of controller which handles request
  -->
  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
      <value>
      /home.htm=home
      /order.htm=order
      /status.htm=status
      /logout.htm=logout
      </value>
    </property>
  </bean>

</beans>