You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2007/01/25 19:54:31 UTC
svn commit: r499904 - in
/incubator/openejb/trunk/openejb3/container/openejb-jee/src/test:
java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java
java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java
resources/daytrader-ejb-jar.xml
Author: dain
Date: Thu Jan 25 10:54:30 2007
New Revision: 499904
URL: http://svn.apache.org/viewvc?view=rev&rev=499904
Log:
Switched to daytrader for example cmp conversion as it has more relationships
Added support of unidirectional mappings
Added:
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-ejb-jar.xml
Modified:
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java
incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java
Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java?view=diff&rev=499904&r1=499903&r2=499904
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/Cmp2ConversionTest.java Thu Jan 25 10:54:30 2007
@@ -34,16 +34,15 @@
import junit.framework.TestCase;
import org.apache.openejb.jee.oej2.OpenejbJarType;
-import org.apache.openejb.jee.oej2.EnterpriseBean;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.Relationships;
import org.apache.openejb.jee.EjbRelation;
import org.apache.openejb.jee.EjbRelationshipRole;
import org.apache.openejb.jee.RelationshipRoleSource;
-import org.apache.openejb.jee.CmrField;
import org.apache.openejb.jee.EntityBean;
import org.apache.openejb.jee.CmpField;
import org.apache.openejb.jee.Multiplicity;
+import org.apache.openejb.jee.PersistenceType;
/**
* @version $Rev$ $Date$
@@ -55,14 +54,12 @@
}
public void testConversion() throws Exception {
-// InputStream in = this.getClass().getClassLoader().getResourceAsStream("ejb-jar-cmp-example1.xml");
-
- EntityMappings entityMappings = generateEntityMappings("itest-ejb-jar-2.2.xml");
+ EntityMappings entityMappings = generateEntityMappings("daytrader-ejb-jar.xml");
JAXBContext ctx = JAXBContext.newInstance(OpenejbJarType.class);
Unmarshaller unmarshaller = ctx.createUnmarshaller();
- InputStream in = this.getClass().getClassLoader().getResourceAsStream("openejb-jar-2.2.xml");
+ InputStream in = this.getClass().getClassLoader().getResourceAsStream("daytrader-corrected.xml");
String expected = readContent(in);
JAXBElement element = (JAXBElement) unmarshaller.unmarshal(new ByteArrayInputStream(expected.getBytes()));
@@ -97,17 +94,24 @@
EjbJar ejbJar = (EjbJar) unmarshaller.unmarshal(new ByteArrayInputStream(expected.getBytes()));
EntityMappings entityMappings = new EntityMappings();
- // todo it would be nice if entities were auto mapped by name
Map<String, Entity> entitiesByName = new HashMap<String,Entity>();
for (org.apache.openejb.jee.EnterpriseBean enterpriseBean : ejbJar.getEnterpriseBeans()) {
- if (!(enterpriseBean instanceof EntityBean)) {
+ // skip all non-CMP beans
+ if (!(enterpriseBean instanceof EntityBean) ||
+ ((EntityBean) enterpriseBean).getPersistenceType() != PersistenceType.CONTAINER) {
continue;
}
EntityBean bean = (EntityBean) enterpriseBean;
+
Entity entity = new Entity();
+
+ // description: contains the name of the entity bean
entity.setDescription(bean.getEjbName());
+
+ // class: the java class for the entity
entity.setClazz(bean.getEjbClass());
- // todo if not set, use ejb name but replace spaces with '_'
+
+ // name: the name of the entity in queries
if (bean.getAbstractSchemaName() != null) {
entity.setName(bean.getAbstractSchemaName());
} else {
@@ -159,8 +163,10 @@
RelationshipRoleSource leftRoleSource = leftRole.getRelationshipRoleSource();
String leftEjbName = leftRoleSource == null ? null : leftRoleSource.getEjbName();
Entity leftEntity = entitiesByName.get(leftEjbName);
- CmrField leftCmrField = leftRole.getCmrField();
- String leftFieldName = leftCmrField.getCmrFieldName();
+ String leftFieldName = null;
+ if (leftRole.getCmrField() != null) {
+ leftFieldName = leftRole.getCmrField().getCmrFieldName();
+ }
boolean leftCascade = leftRole.getCascadeDelete() != null;
boolean leftIsOne = leftRole.getMultiplicity() == Multiplicity.ONE;
@@ -168,8 +174,10 @@
RelationshipRoleSource rightRoleSource = rightRole.getRelationshipRoleSource();
String rightEjbName = rightRoleSource == null ? null : rightRoleSource.getEjbName();
Entity rightEntity = entitiesByName.get(rightEjbName);
- CmrField rightCmrField = rightRole.getCmrField();
- String rightFieldName = rightCmrField.getCmrFieldName();
+ String rightFieldName = null;
+ if (rightRole.getCmrField() != null) {
+ rightFieldName = rightRole.getCmrField().getCmrFieldName();
+ }
boolean rightCascade = rightRole.getCascadeDelete() != null;
boolean rightIsOne = rightRole.getMultiplicity() == Multiplicity.ONE;
@@ -179,126 +187,151 @@
//
// left
- OneToOne leftOneToOne = new OneToOne();
- leftOneToOne.setName(leftFieldName);
- if (leftCascade) {
- // todo simplify cmrType in jaxb tree
- CascadeType cascadeType = new CascadeType();
- cascadeType.setCascadeAll(true);
- leftOneToOne.setCascade(cascadeType);
+ OneToOne leftOneToOne = null;
+ if (leftFieldName != null) {
+ leftOneToOne = new OneToOne();
+ leftOneToOne.setName(leftFieldName);
+ if (leftCascade) {
+ CascadeType cascadeType = new CascadeType();
+ cascadeType.setCascadeAll(true);
+ leftOneToOne.setCascade(cascadeType);
+ }
+ leftEntity.getAttributes().getOneToOne().add(leftOneToOne);
}
- leftEntity.getAttributes().getOneToOne().add(leftOneToOne);
// right
- OneToOne rightOneToOne = new OneToOne();
- rightOneToOne.setName(rightFieldName);
- // todo only non-owning (non-fk) side gets mapped-by
- // mapped by only required for bi-directional
- if (leftFieldName != null) {
- rightOneToOne.setMappedBy(leftFieldName);
- }
- if (rightCascade) {
- // todo simplify cmrType in jaxb tree
- CascadeType cascadeType = new CascadeType();
- cascadeType.setCascadeAll(true);
- rightOneToOne.setCascade(cascadeType);
+ OneToOne rightOneToOne = null;
+ if (rightFieldName != null) {
+ rightOneToOne = new OneToOne();
+ rightOneToOne.setName(rightFieldName);
+ // todo only non-owning (non-fk) side gets mapped-by
+ // mapped by only required for bi-directional
+ if (leftFieldName != null) {
+ rightOneToOne.setMappedBy(leftFieldName);
+ }
+ if (rightCascade) {
+ CascadeType cascadeType = new CascadeType();
+ cascadeType.setCascadeAll(true);
+ rightOneToOne.setCascade(cascadeType);
+ }
+ rightEntity.getAttributes().getOneToOne().add(rightOneToOne);
}
- rightEntity.getAttributes().getOneToOne().add(rightOneToOne);
// link
- leftOneToOne.setRelatedField(rightOneToOne);
- rightOneToOne.setRelatedField(leftOneToOne);
+ if (leftFieldName != null && rightFieldName != null) {
+ leftOneToOne.setRelatedField(rightOneToOne);
+ rightOneToOne.setRelatedField(leftOneToOne);
+ }
} else if (leftIsOne && !rightIsOne) {
//
// one-to-many
//
// left
- OneToMany leftOneToMany = new OneToMany();
- leftOneToMany.setName(leftFieldName);
- // mapped by only required for bi-directional
- if (rightFieldName != null) {
- leftOneToMany.setMappedBy(rightFieldName);
- }
- if (leftCascade) {
- // todo simplify cmrType in jaxb tree
- CascadeType cascadeType = new CascadeType();
- cascadeType.setCascadeAll(true);
- leftOneToMany.setCascade(cascadeType);
+ OneToMany leftOneToMany = null;
+ if (leftFieldName != null) {
+ leftOneToMany = new OneToMany();
+ leftOneToMany.setName(leftFieldName);
+ // mapped by only required for bi-directional
+ if (rightFieldName != null) {
+ leftOneToMany.setMappedBy(rightFieldName);
+ }
+ if (leftCascade) {
+ CascadeType cascadeType = new CascadeType();
+ cascadeType.setCascadeAll(true);
+ leftOneToMany.setCascade(cascadeType);
+ }
+ leftEntity.getAttributes().getOneToMany().add(leftOneToMany);
}
- leftEntity.getAttributes().getOneToMany().add(leftOneToMany);
// right
- ManyToOne rightManyToOne = new ManyToOne();
- rightManyToOne.setName(rightFieldName);
- rightEntity.getAttributes().getManyToOne().add(rightManyToOne);
+ ManyToOne rightManyToOne = null;
+ if (rightFieldName != null) {
+ rightManyToOne = new ManyToOne();
+ rightManyToOne.setName(rightFieldName);
+ rightEntity.getAttributes().getManyToOne().add(rightManyToOne);
+ }
// link
- leftOneToMany.setRelatedField(rightManyToOne);
- rightManyToOne.setRelatedField(leftOneToMany);
+ if (leftFieldName != null && rightFieldName != null) {
+ leftOneToMany.setRelatedField(rightManyToOne);
+ rightManyToOne.setRelatedField(leftOneToMany);
+ }
} else if (!leftIsOne && rightIsOne) {
//
// many-to-one
//
// left
- ManyToOne leftManyToOne = new ManyToOne();
- leftManyToOne.setName(leftFieldName);
- leftEntity.getAttributes().getManyToOne().add(leftManyToOne);
-
- // right
- OneToMany rightOneToMany = new OneToMany();
- rightOneToMany.setName(rightFieldName);
- // mapped by only required for bi-directional
+ ManyToOne leftManyToOne = null;
if (leftFieldName != null) {
- rightOneToMany.setMappedBy(leftFieldName);
+ leftManyToOne = new ManyToOne();
+ leftManyToOne.setName(leftFieldName);
+ leftEntity.getAttributes().getManyToOne().add(leftManyToOne);
}
- if (rightCascade) {
- // todo simplify cmrType in jaxb tree
- CascadeType cascadeType = new CascadeType();
- cascadeType.setCascadeAll(true);
- rightOneToMany.setCascade(cascadeType);
+
+ // right
+ OneToMany rightOneToMany = null;
+ if (rightFieldName != null) {
+ rightOneToMany = new OneToMany();
+ rightOneToMany.setName(rightFieldName);
+ // mapped by only required for bi-directional
+ if (leftFieldName != null) {
+ rightOneToMany.setMappedBy(leftFieldName);
+ }
+ if (rightCascade) {
+ CascadeType cascadeType = new CascadeType();
+ cascadeType.setCascadeAll(true);
+ rightOneToMany.setCascade(cascadeType);
+ }
+ rightEntity.getAttributes().getOneToMany().add(rightOneToMany);
}
- rightEntity.getAttributes().getOneToMany().add(rightOneToMany);
// link
- leftManyToOne.setRelatedField(rightOneToMany);
- rightOneToMany.setRelatedField(leftManyToOne);
+ if (leftFieldName != null && rightFieldName != null) {
+ leftManyToOne.setRelatedField(rightOneToMany);
+ rightOneToMany.setRelatedField(leftManyToOne);
+ }
} else if (!leftIsOne && !rightIsOne) {
//
// many-to-many
//
// left
- ManyToMany leftManyToMany = new ManyToMany();
- leftManyToMany.setName(leftFieldName);
- if (leftCascade) {
- // todo simplify cmrType in jaxb tree
- CascadeType cascadeType = new CascadeType();
- cascadeType.setCascadeAll(true);
- leftManyToMany.setCascade(cascadeType);
+ ManyToMany leftManyToMany = null;
+ if (leftFieldName != null) {
+ leftManyToMany = new ManyToMany();
+ leftManyToMany.setName(leftFieldName);
+ if (leftCascade) {
+ CascadeType cascadeType = new CascadeType();
+ cascadeType.setCascadeAll(true);
+ leftManyToMany.setCascade(cascadeType);
+ }
+ leftEntity.getAttributes().getManyToMany().add(leftManyToMany);
}
- leftEntity.getAttributes().getManyToMany().add(leftManyToMany);
-
// right
- ManyToMany rightManyToMany = new ManyToMany();
- rightManyToMany.setName(rightFieldName);
- // mapped by only required for bi-directional
- if (leftFieldName != null) {
- rightManyToMany.setMappedBy(leftFieldName);
- }
- if (rightCascade) {
- // todo simplify cmrType in jaxb tree
- CascadeType cascadeType = new CascadeType();
- cascadeType.setCascadeAll(true);
- rightManyToMany.setCascade(cascadeType);
+ ManyToMany rightManyToMany = null;
+ if (rightFieldName != null) {
+ rightManyToMany = new ManyToMany();
+ rightManyToMany.setName(rightFieldName);
+ // mapped by only required for bi-directional
+ if (leftFieldName != null) {
+ rightManyToMany.setMappedBy(leftFieldName);
+ }
+ if (rightCascade) {
+ CascadeType cascadeType = new CascadeType();
+ cascadeType.setCascadeAll(true);
+ rightManyToMany.setCascade(cascadeType);
+ }
+ rightEntity.getAttributes().getManyToMany().add(rightManyToMany);
}
- rightEntity.getAttributes().getManyToMany().add(rightManyToMany);
// link
- leftManyToMany.setRelatedField(rightManyToMany);
- rightManyToMany.setRelatedField(leftManyToMany);
+ if (leftFieldName != null && rightFieldName != null) {
+ leftManyToMany.setRelatedField(rightManyToMany);
+ rightManyToMany.setRelatedField(leftManyToMany);
+ }
}
}
}
@@ -306,7 +339,7 @@
//
// transient: non-persistent fields
//
- // todo scan class file for fields that are not cmp-fields or cmr-fields
+ // todo scan class file for fields that are not cmp-fields or cmr-fields and mark them transient
return entityMappings;
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java?view=diff&rev=499904&r1=499903&r2=499904
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/java/org/apache/openejb/jee/jpa/OpenEjb2CmpConversion.java Thu Jan 25 10:54:30 2007
@@ -87,39 +87,48 @@
continue;
}
- EjbRelationshipRoleType leftRole = roles.get(0);
- EjbRelationshipRoleType.RelationshipRoleSource leftRoleSource = leftRole.getRelationshipRoleSource();
- String leftEjbName = leftRoleSource == null ? null : leftRoleSource.getEjbName();
- EntityData leftEntityData = entities.get(leftEjbName);
- String leftFieldName = leftRole.getCmrField().getCmrFieldName();
+ if (relation.getManyToManyTableName() == null) {
+ EjbRelationshipRoleType leftRole = roles.get(0);
+ EjbRelationshipRoleType.RelationshipRoleSource leftRoleSource = leftRole.getRelationshipRoleSource();
+ String leftEjbName = leftRoleSource == null ? null : leftRoleSource.getEjbName();
+ EntityData leftEntityData = entities.get(leftEjbName);
+ String leftFieldName = leftRole.getCmrField().getCmrFieldName();
- RelationField field;
- if (leftRole.isForeignKeyColumnOnSource()) {
- field = leftEntityData.relations.get(leftFieldName);
- } else {
- field = leftEntityData.relations.get(leftFieldName).getRelatedField();
- }
-
- EjbRelationshipRoleType.RoleMapping roleMapping = leftRole.getRoleMapping();
- for (EjbRelationshipRoleType.RoleMapping.CmrFieldMapping cmrFieldMapping : roleMapping.getCmrFieldMapping()) {
- JoinColumn joinColumn = new JoinColumn();
- joinColumn.setName(cmrFieldMapping.getForeignKeyColumn());
- joinColumn.setReferencedColumnName(cmrFieldMapping.getKeyColumn());
- field.getJoinColumn().add(joinColumn);
- }
+ RelationField field;
+ if (leftRole.isForeignKeyColumnOnSource()) {
+ field = leftEntityData.relations.get(leftFieldName);
+ // todo warn field not found
+ if (field == null) continue;
+ } else {
+ RelationField other = leftEntityData.relations.get(leftFieldName);
+ // todo warn field not found
+ if (other == null) continue;
+ field = other.getRelatedField();
+ // todo warn field not found
+ if (field == null) continue;
+ }
-// if (roles.size() > 1) {
-// EjbRelationshipRoleType rightRole = roles.get(1);
-// EjbRelationshipRoleType.RelationshipRoleSource rightRoleSource = rightRole.getRelationshipRoleSource();
-// String rightEjbName = rightRoleSource == null ? null : rightRoleSource.getEjbName();
-// Entity rightEntity = entities.get(rightEjbName);
-// EjbRelationshipRoleType.CmrField rightCmrField = rightRole.getCmrField();
-// String rightFieldName = rightCmrField.getCmrFieldName();
-//
-//// boolean rightCascade = rightRole.getCascadeDelete() != null;
-//// boolean rightIsOne = rightRole.getMultiplicity() == Multiplicity.ONE;
-// }
+ // For one-to-one, make sure that the field to recieve the FK
+ // is marked as the owning field
+ if (field instanceof OneToOne) {
+ OneToOne left = (OneToOne) field;
+ OneToOne right = (OneToOne) left.getRelatedField();
+ if (right != null) {
+ left.setMappedBy(null);
+ right.setMappedBy(left.getName());
+ }
+ }
+ EjbRelationshipRoleType.RoleMapping roleMapping = leftRole.getRoleMapping();
+ for (EjbRelationshipRoleType.RoleMapping.CmrFieldMapping cmrFieldMapping : roleMapping.getCmrFieldMapping()) {
+ JoinColumn joinColumn = new JoinColumn();
+ joinColumn.setName(cmrFieldMapping.getForeignKeyColumn());
+ joinColumn.setReferencedColumnName(cmrFieldMapping.getKeyColumn());
+ field.getJoinColumn().add(joinColumn);
+ }
+ } else {
+ // todo support many-to-many
+ }
}
}
}
Added: incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-ejb-jar.xml
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-ejb-jar.xml?view=auto&rev=499904
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-ejb-jar.xml (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/test/resources/daytrader-ejb-jar.xml Thu Jan 25 10:54:30 2007
@@ -0,0 +1,1151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--<ejb-jar version="2.1"-->
+ <!--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/ejb-jar_2_1.xsd"> -->
+<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.0" metadata-complete="true">
+ <display-name>TradeEJBs</display-name>
+ <enterprise-beans>
+ <session>
+ <description>Trade Session EJB manages all Trading services</description>
+ <display-name>TradeEJB</display-name>
+ <ejb-name>TradeEJB</ejb-name>
+ <home>org.apache.geronimo.samples.daytrader.ejb.TradeHome</home>
+ <remote>org.apache.geronimo.samples.daytrader.ejb.Trade</remote>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeBean</ejb-class>
+ <session-type>Stateless</session-type>
+ <transaction-type>Container</transaction-type>
+ <env-entry>
+ <env-entry-name>orderBySQLSupported</env-entry-name>
+ <env-entry-type>java.lang.Boolean</env-entry-type>
+ <env-entry-value>true</env-entry-value>
+ </env-entry>
+ <env-entry>
+ <env-entry-name>updateQuotePrices</env-entry-name>
+ <env-entry-type>java.lang.Boolean</env-entry-type>
+ <env-entry-value>true</env-entry-value>
+ </env-entry>
+ <env-entry>
+ <env-entry-name>publishQuotePriceChange</env-entry-name>
+ <env-entry-type>java.lang.Boolean</env-entry-type>
+ <env-entry-value>false</env-entry-value>
+ </env-entry>
+ <ejb-ref>
+ <ejb-ref-name>ejb/Trade</ejb-ref-name>
+ <ejb-ref-type>Session</ejb-ref-type>
+ <home>org.apache.geronimo.samples.daytrader.ejb.TradeHome</home>
+ <remote>org.apache.geronimo.samples.daytrader.ejb.Trade</remote>
+ <ejb-link>TradeEJB</ejb-link>
+ </ejb-ref>
+ <ejb-local-ref>
+ <ejb-ref-name>ejb/Quote</ejb-ref-name>
+ <ejb-ref-type>Entity</ejb-ref-type>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalQuoteHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalQuote</local>
+ <ejb-link>QuoteEJB</ejb-link>
+ </ejb-local-ref>
+ <ejb-local-ref>
+ <ejb-ref-name>ejb/Account</ejb-ref-name>
+ <ejb-ref-type>Entity</ejb-ref-type>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalAccountHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalAccount</local>
+ <ejb-link>AccountEJB</ejb-link>
+ </ejb-local-ref>
+ <ejb-local-ref>
+ <ejb-ref-name>ejb/Holding</ejb-ref-name>
+ <ejb-ref-type>Entity</ejb-ref-type>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalHoldingHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalHolding</local>
+ <ejb-link>HoldingEJB</ejb-link>
+ </ejb-local-ref>
+ <ejb-local-ref>
+ <ejb-ref-name>ejb/Order</ejb-ref-name>
+ <ejb-ref-type>Entity</ejb-ref-type>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalOrderHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalOrder</local>
+ <ejb-link>OrderEJB</ejb-link>
+ </ejb-local-ref>
+ <ejb-local-ref>
+ <ejb-ref-name>ejb/KeySequence</ejb-ref-name>
+ <ejb-ref-type>Session</ejb-ref-type>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalKeySequenceHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalKeySequence</local>
+ <ejb-link>KeySequenceEJB</ejb-link>
+ </ejb-local-ref>
+ <ejb-local-ref>
+ <ejb-ref-name>ejb/AccountProfile</ejb-ref-name>
+ <ejb-ref-type>Entity</ejb-ref-type>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalAccountProfileHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalAccountProfile</local>
+ <ejb-link>AccountProfileEJB</ejb-link>
+ </ejb-local-ref>
+ <resource-ref>
+ <res-ref-name>jms/QueueConnectionFactory</res-ref-name>
+ <res-type>javax.jms.QueueConnectionFactory</res-type>
+ <res-auth>Application</res-auth>
+ <res-sharing-scope>Shareable</res-sharing-scope>
+ </resource-ref>
+ <resource-ref>
+ <res-ref-name>jms/TopicConnectionFactory</res-ref-name>
+ <res-type>javax.jms.TopicConnectionFactory</res-type>
+ <res-auth>Application</res-auth>
+ <res-sharing-scope>Shareable</res-sharing-scope>
+ </resource-ref>
+ <resource-ref>
+ <res-ref-name>jdbc/TradeDataSource</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+ <res-sharing-scope>Shareable</res-sharing-scope>
+ </resource-ref>
+ <message-destination-ref>
+ <message-destination-ref-name>jms/TradeBrokerQueue</message-destination-ref-name>
+ <message-destination-type>javax.jms.Queue</message-destination-type>
+ <message-destination-usage>Produces</message-destination-usage>
+ <message-destination-link>TradeBrokerQueue</message-destination-link>
+ </message-destination-ref>
+ <message-destination-ref>
+ <message-destination-ref-name>jms/TradeStreamerTopic</message-destination-ref-name>
+ <message-destination-type>javax.jms.Topic</message-destination-type>
+ <message-destination-usage>Produces</message-destination-usage>
+ <message-destination-link>TradeStreamerTopic</message-destination-link>
+ </message-destination-ref>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ </session>
+ <session>
+ <description>Trade JPA Session EJB manages all Trading services</description>
+ <display-name>TradeJPA</display-name>
+ <ejb-name>TradeJPA</ejb-name>
+ <home>org.apache.geronimo.samples.daytrader.ejb.TradeHome</home>
+ <remote>org.apache.geronimo.samples.daytrader.ejb.Trade</remote>
+ <ejb-class>org.apache.geronimo.samples.daytrader.TradeJPA</ejb-class>
+ <session-type>Stateless</session-type>
+ <transaction-type>Container</transaction-type>
+ <env-entry>
+ <env-entry-name>orderBySQLSupported</env-entry-name>
+ <env-entry-type>java.lang.Boolean</env-entry-type>
+ <env-entry-value>true</env-entry-value>
+ </env-entry>
+ <env-entry>
+ <env-entry-name>updateQuotePrices</env-entry-name>
+ <env-entry-type>java.lang.Boolean</env-entry-type>
+ <env-entry-value>true</env-entry-value>
+ </env-entry>
+ <env-entry>
+ <env-entry-name>publishQuotePriceChange</env-entry-name>
+ <env-entry-type>java.lang.Boolean</env-entry-type>
+ <env-entry-value>false</env-entry-value>
+ </env-entry>
+ <resource-ref>
+ <res-ref-name>jms/QueueConnectionFactory</res-ref-name>
+ <res-type>javax.jms.QueueConnectionFactory</res-type>
+ <res-auth>Application</res-auth>
+ <res-sharing-scope>Shareable</res-sharing-scope>
+ </resource-ref>
+ <resource-ref>
+ <res-ref-name>jms/TopicConnectionFactory</res-ref-name>
+ <res-type>javax.jms.TopicConnectionFactory</res-type>
+ <res-auth>Application</res-auth>
+ <res-sharing-scope>Shareable</res-sharing-scope>
+ </resource-ref>
+ <message-destination-ref>
+ <message-destination-ref-name>jms/TradeBrokerQueue</message-destination-ref-name>
+ <message-destination-type>javax.jms.Queue</message-destination-type>
+ <message-destination-usage>Produces</message-destination-usage>
+ <message-destination-link>TradeBrokerQueue</message-destination-link>
+ </message-destination-ref>
+ <message-destination-ref>
+ <message-destination-ref-name>jms/TradeStreamerTopic</message-destination-ref-name>
+ <message-destination-type>javax.jms.Topic</message-destination-type>
+ <message-destination-usage>Produces</message-destination-usage>
+ <message-destination-link>TradeStreamerTopic</message-destination-link>
+ </message-destination-ref>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ </session>
+ <session>
+ <description>Trade JDBC Session EJB manages all Trading services</description>
+ <display-name>TradeJDBC</display-name>
+ <ejb-name>TradeJDBC</ejb-name>
+ <home>org.apache.geronimo.samples.daytrader.session.TradeJDBCHome</home>
+ <remote>org.apache.geronimo.samples.daytrader.session.TradeJDBC</remote>
+ <ejb-class>org.apache.geronimo.samples.daytrader.session.TradeJDBCBean</ejb-class>
+ <session-type>Stateless</session-type>
+ <transaction-type>Container</transaction-type>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ </session>
+ <entity>
+ <display-name>HoldingEJB</display-name>
+ <ejb-name>HoldingEJB</ejb-name>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalHoldingHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalHolding</local>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.HoldingBean</ejb-class>
+ <persistence-type>Container</persistence-type>
+ <prim-key-class>java.lang.Integer</prim-key-class>
+ <reentrant>false</reentrant>
+ <cmp-version>2.x</cmp-version>
+ <abstract-schema-name>Holding</abstract-schema-name>
+ <cmp-field>
+ <field-name>purchasePrice</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>holdingID</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>quantity</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>purchaseDate</field-name>
+ </cmp-field>
+ <primkey-field>holdingID</primkey-field>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>ejbSelectQuoteFromSymbol</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(q) from Quote q WHERE q.symbol = ?1</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findAll</method-name>
+ <method-params/>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(h) from Holding h</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findByUserID</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(h) FROM Holding h WHERE
+ h.account.profile.userID = ?1</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findByAccountID</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(h) FROM Holding h WHERE
+ h.account.accountID = ?1</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>findByPrimaryKeyForUpdate</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(h) FROM Holding h WHERE
+ h.holdingID = ?1</ejb-ql>
+ </query>
+ </entity>
+ <message-driven>
+ <display-name>TradeBrokerMDB</display-name>
+ <ejb-name>TradeBrokerMDB</ejb-name>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeBrokerMDB</ejb-class>
+ <transaction-type>Container</transaction-type>
+ <message-destination-type>javax.jms.Queue</message-destination-type>
+ <message-destination-link>TradeBrokerQueue</message-destination-link>
+ <env-entry>
+ <env-entry-name>statInterval</env-entry-name>
+ <env-entry-type>java.lang.Integer</env-entry-type>
+ <env-entry-value>100</env-entry-value>
+ </env-entry>
+ <ejb-ref>
+ <ejb-ref-name>ejb/Trade</ejb-ref-name>
+ <ejb-ref-type>Session</ejb-ref-type>
+ <home>org.apache.geronimo.samples.daytrader.ejb.TradeHome</home>
+ <remote>org.apache.geronimo.samples.daytrader.ejb.Trade</remote>
+ <ejb-link>TradeEJB</ejb-link>
+ </ejb-ref>
+ </message-driven>
+ <entity>
+ <display-name>AccountProfileEJB</display-name>
+ <ejb-name>AccountProfileEJB</ejb-name>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalAccountProfileHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalAccountProfile</local>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.AccountProfileBean</ejb-class>
+ <persistence-type>Container</persistence-type>
+ <prim-key-class>java.lang.String</prim-key-class>
+ <reentrant>false</reentrant>
+ <cmp-version>2.x</cmp-version>
+ <abstract-schema-name>AccountProfile</abstract-schema-name>
+ <cmp-field>
+ <field-name>address</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>passwd</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>userID</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>email</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>creditCard</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>fullName</field-name>
+ </cmp-field>
+ <primkey-field>userID</primkey-field>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ <query id="Query_5">
+ <description/>
+ <query-method>
+ <method-name>findAll</method-name>
+ <method-params/>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(a) FROM AccountProfile a</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findByPrimaryKeyForUpdate</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(a) FROM AccountProfile a where
+ a.userID = ?1</ejb-ql>
+ </query>
+ </entity>
+ <entity>
+ <description>Stock price quotes including current, open, high, low, etc.</description>
+ <display-name>QuoteEJB</display-name>
+ <ejb-name>QuoteEJB</ejb-name>
+ <home>org.apache.geronimo.samples.daytrader.ejb.QuoteHome</home>
+ <remote>org.apache.geronimo.samples.daytrader.ejb.Quote</remote>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalQuoteHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalQuote</local>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.QuoteBean</ejb-class>
+ <persistence-type>Container</persistence-type>
+ <prim-key-class>java.lang.String</prim-key-class>
+ <reentrant>false</reentrant>
+ <cmp-version>2.x</cmp-version>
+ <abstract-schema-name>Quote</abstract-schema-name>
+ <cmp-field>
+ <field-name>low</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>open</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>volume</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>price</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>high</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>companyName</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>symbol</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>change</field-name>
+ </cmp-field>
+ <primkey-field>symbol</primkey-field>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ <query id="Query_6">
+ <description/>
+ <query-method>
+ <method-name>findAll</method-name>
+ <method-params/>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(q) FROM Quote q</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findQuotes</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(q) FROM Quote q</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findOne</method-name>
+ <method-params/>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(q) FROM Quote q where q.symbol = 's:0'</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>findTSIAQuotesOrderByChange</method-name>
+ <method-params/>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(q) FROM Quote q WHERE q.symbol LIKE 's:1__' ORDER BY q.change DESC</ejb-ql>
+ </query>
+ <query id="Query_10">
+ <description/>
+ <query-method>
+ <method-name>ejbSelectTotalVolume</method-name>
+ <method-params/>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT q.volume FROM Quote q</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>findTSIAQuotes</method-name>
+ <method-params/>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(q) FROM Quote q WHERE q.symbol LIKE 's:1__'</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>findByPrimaryKeyForUpdate</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(q) FROM Quote q where q.symbol = ?1</ejb-ql>
+ </query>
+ </entity>
+ <session>
+ <display-name>KeySequenceEJB</display-name>
+ <ejb-name>KeySequenceEJB</ejb-name>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalKeySequenceHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalKeySequence</local>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.KeySequenceBean</ejb-class>
+ <session-type>Stateless</session-type>
+ <transaction-type>Container</transaction-type>
+ <ejb-local-ref>
+ <ejb-ref-name>ejb/KeyGen</ejb-ref-name>
+ <ejb-ref-type>Entity</ejb-ref-type>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalKeyGenHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalKeyGen</local>
+ <ejb-link>KeyGenEJB</ejb-link>
+ </ejb-local-ref>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ </session>
+ <entity>
+ <display-name>KeyGenEJB</display-name>
+ <ejb-name>KeyGenEJB</ejb-name>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalKeyGenHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalKeyGen</local>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.KeyGenBean</ejb-class>
+ <persistence-type>Container</persistence-type>
+ <prim-key-class>java.lang.String</prim-key-class>
+ <reentrant>false</reentrant>
+ <cmp-version>2.x</cmp-version>
+ <abstract-schema-name>KeyGen</abstract-schema-name>
+ <cmp-field>
+ <field-name>keyVal</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>keyName</field-name>
+ </cmp-field>
+ <primkey-field>keyName</primkey-field>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ <query>
+ <query-method>
+ <method-name>findByPrimaryKeyForUpdate</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(kg) FROM KeyGen kg where
+ kg.keyName = ?1</ejb-ql>
+ </query>
+ </entity>
+ <entity>
+ <display-name>AccountEJB</display-name>
+ <ejb-name>AccountEJB</ejb-name>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalAccountHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalAccount</local>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.AccountBean</ejb-class>
+ <persistence-type>Container</persistence-type>
+ <prim-key-class>java.lang.Integer</prim-key-class>
+ <reentrant>false</reentrant>
+ <cmp-version>2.x</cmp-version>
+ <abstract-schema-name>Account</abstract-schema-name>
+ <cmp-field>
+ <field-name>creationDate</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>openBalance</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>logoutCount</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>balance</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>accountID</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>lastLogin</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>loginCount</field-name>
+ </cmp-field>
+ <primkey-field>accountID</primkey-field>
+ <ejb-local-ref>
+ <ejb-ref-name>ejb/AccountProfile</ejb-ref-name>
+ <ejb-ref-type>Entity</ejb-ref-type>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalAccountProfileHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalAccountProfile</local>
+ <ejb-link>AccountProfileEJB</ejb-link>
+ </ejb-local-ref>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findByUserID</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <ejb-ql>SELECT OBJECT(a) FROM Account a WHERE
+ a.profile.userID = ?1</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findAll</method-name>
+ <method-params/>
+ </query-method>
+ <ejb-ql>SELECT OBJECT(a) FROM Account a</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>findByUserIDForUpdate</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(a) FROM Account a WHERE
+ a.profile.userID = ?1</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>ejbSelectClosedOrders</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </query-method>
+ <ejb-ql>SELECT o.orderID FROM Orders o WHERE
+ o.orderStatus = 'closed' AND o.account.accountID = ?1</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>findByPrimaryKeyForUpdate</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(a) FROM Account a where
+ a.accountID = ?1</ejb-ql>
+ </query>
+ </entity>
+ <entity>
+ <display-name>OrderEJB</display-name>
+ <ejb-name>OrderEJB</ejb-name>
+ <local-home>org.apache.geronimo.samples.daytrader.ejb.LocalOrderHome</local-home>
+ <local>org.apache.geronimo.samples.daytrader.ejb.LocalOrder</local>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.OrderBean</ejb-class>
+ <persistence-type>Container</persistence-type>
+ <prim-key-class>java.lang.Integer</prim-key-class>
+ <reentrant>false</reentrant>
+ <cmp-version>2.x</cmp-version>
+ <abstract-schema-name>Orders</abstract-schema-name>
+ <cmp-field>
+ <field-name>orderFee</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>completionDate</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>orderType</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>orderStatus</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>price</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>quantity</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>openDate</field-name>
+ </cmp-field>
+ <cmp-field>
+ <field-name>orderID</field-name>
+ </cmp-field>
+ <primkey-field>orderID</primkey-field>
+ <security-identity>
+ <description/>
+ <use-caller-identity/>
+ </security-identity>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findAll</method-name>
+ <method-params/>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(o) FROM Orders o</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findClosedOrders</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(o) FROM Orders o WHERE
+ o.orderStatus = 'closed' AND
+ o.account.profile.userID = ?1</ejb-ql>
+ </query>
+ <query>
+ <description/>
+ <query-method>
+ <method-name>findByUserID</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(o) FROM Orders o WHERE
+ o.account.profile.userID = ?1 ORDER BY o.orderID DESC</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>findByPrimaryKeyForUpdate</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(o) FROM Orders o WHERE o.orderID = ?1</ejb-ql>
+ </query>
+ <query>
+ <query-method>
+ <method-name>findClosedOrdersForUpdate</method-name>
+ <method-params>
+ <method-param>java.lang.String</method-param>
+ </method-params>
+ </query-method>
+ <result-type-mapping>Local</result-type-mapping>
+ <ejb-ql>SELECT OBJECT(o) FROM Orders o WHERE
+ o.orderStatus = 'closed' AND
+ o.account.profile.userID = ?1</ejb-ql>
+ </query>
+ </entity>
+ <message-driven>
+ <ejb-name>TradeStreamerMDB</ejb-name>
+ <ejb-class>org.apache.geronimo.samples.daytrader.ejb.TradeStreamerMDB</ejb-class>
+ <transaction-type>Container</transaction-type>
+ <message-destination-type>javax.jms.Topic</message-destination-type>
+ <message-destination-link>TradeStreamerTopic</message-destination-link>
+ <env-entry>
+ <env-entry-name>statInterval</env-entry-name>
+ <env-entry-type>java.lang.Integer</env-entry-type>
+ <env-entry-value>100</env-entry-value>
+ </env-entry>
+ </message-driven>
+ </enterprise-beans>
+ <relationships>
+ <ejb-relation>
+ <ejb-relation-name>Account-Orders</ejb-relation-name>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>AccountEJB</ejb-relationship-role-name>
+ <multiplicity>One</multiplicity>
+ <relationship-role-source>
+ <ejb-name>AccountEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>orders</cmr-field-name>
+ <cmr-field-type>java.util.Collection</cmr-field-type>
+ </cmr-field>
+ </ejb-relationship-role>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>Order-Has-Account</ejb-relationship-role-name>
+ <multiplicity>Many</multiplicity>
+ <cascade-delete/>
+ <relationship-role-source>
+ <ejb-name>OrderEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>account</cmr-field-name>
+ </cmr-field>
+ </ejb-relationship-role>
+ </ejb-relation>
+ <ejb-relation>
+ <ejb-relation-name>Account-AccountProfile</ejb-relation-name>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>Account-Has-AccountProfile</ejb-relationship-role-name>
+ <multiplicity>One</multiplicity>
+ <relationship-role-source>
+ <ejb-name>AccountEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>profile</cmr-field-name>
+ </cmr-field>
+ </ejb-relationship-role>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>AccountProfileEJB</ejb-relationship-role-name>
+ <multiplicity>One</multiplicity>
+ <cascade-delete/>
+ <relationship-role-source>
+ <ejb-name>AccountProfileEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>account</cmr-field-name>
+ </cmr-field>
+ </ejb-relationship-role>
+ </ejb-relation>
+ <ejb-relation>
+ <ejb-relation-name>Account-Holdings</ejb-relation-name>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>AccountEJB</ejb-relationship-role-name>
+ <multiplicity>One</multiplicity>
+ <relationship-role-source>
+ <ejb-name>AccountEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>holdings</cmr-field-name>
+ <cmr-field-type>java.util.Collection</cmr-field-type>
+ </cmr-field>
+ </ejb-relationship-role>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>Holding-Has-Account</ejb-relationship-role-name>
+ <multiplicity>Many</multiplicity>
+ <cascade-delete/>
+ <relationship-role-source>
+ <ejb-name>HoldingEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>account</cmr-field-name>
+ </cmr-field>
+ </ejb-relationship-role>
+ </ejb-relation>
+ <ejb-relation>
+ <ejb-relation-name>Quote-Holdings</ejb-relation-name>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>Holding-Has-Quote</ejb-relationship-role-name>
+ <multiplicity>Many</multiplicity>
+ <relationship-role-source>
+ <ejb-name>HoldingEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>quote</cmr-field-name>
+ </cmr-field>
+ </ejb-relationship-role>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>QuoteEJB</ejb-relationship-role-name>
+ <multiplicity>One</multiplicity>
+ <relationship-role-source>
+ <ejb-name>QuoteEJB</ejb-name>
+ </relationship-role-source>
+ </ejb-relationship-role>
+ </ejb-relation>
+ <ejb-relation>
+ <ejb-relation-name>Quote-Orders</ejb-relation-name>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>Order-Has-Quote</ejb-relationship-role-name>
+ <multiplicity>Many</multiplicity>
+ <cascade-delete/>
+ <relationship-role-source>
+ <ejb-name>OrderEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>quote</cmr-field-name>
+ </cmr-field>
+ </ejb-relationship-role>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>QuoteEJB</ejb-relationship-role-name>
+ <multiplicity>One</multiplicity>
+ <relationship-role-source>
+ <ejb-name>QuoteEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>orders</cmr-field-name>
+ <cmr-field-type>java.util.Collection</cmr-field-type>
+ </cmr-field>
+ </ejb-relationship-role>
+ </ejb-relation>
+ <ejb-relation>
+ <ejb-relation-name>Order-Holding</ejb-relation-name>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>Order-Has-Holding</ejb-relationship-role-name>
+ <multiplicity>One</multiplicity>
+ <relationship-role-source>
+ <ejb-name>OrderEJB</ejb-name>
+ </relationship-role-source>
+ <cmr-field>
+ <cmr-field-name>holding</cmr-field-name>
+ </cmr-field>
+ </ejb-relationship-role>
+ <ejb-relationship-role>
+ <ejb-relationship-role-name>HoldingEJB</ejb-relationship-role-name>
+ <multiplicity>One</multiplicity>
+ <cascade-delete/>
+ <relationship-role-source>
+ <ejb-name>HoldingEJB</ejb-name>
+ </relationship-role-source>
+ </ejb-relationship-role>
+ </ejb-relation>
+ </relationships>
+ <assembly-descriptor>
+ <method-permission>
+ <description>UncheckedPermission:+:Unchecked method permission</description>
+ <unchecked/>
+ <method>
+ <ejb-name>AccountEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>AccountProfileEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>HoldingEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>KeyGenEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>KeySequenceEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>OrderEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>QuoteEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ </method-permission>
+ <container-transaction>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>publishQuotePriceChange</method-name>
+ <method-params>
+ <method-param>org.apache.geronimo.samples.daytrader.QuoteDataBean</method-param>
+ <method-param>java.math.BigDecimal</method-param>
+ <method-param>java.math.BigDecimal</method-param>
+ <method-param>double</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>cancelOrderOnePhase</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>completeOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>queueOrderOnePhase</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJPA</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>publishQuotePriceChange</method-name>
+ <method-params>
+ <method-param>org.apache.geronimo.samples.daytrader.QuoteDataBean</method-param>
+ <method-param>java.math.BigDecimal</method-param>
+ <method-param>java.math.BigDecimal</method-param>
+ <method-param>double</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJPA</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>cancelOrderOnePhase</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJPA</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>completeOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJPA</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>queueOrderOnePhase</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>cancelOrderOnePhase</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>completeOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>publishQuotePriceChange</method-name>
+ <method-params>
+ <method-param>com.ibm.websphere.samples.trade.QuoteDataBean</method-param>
+ <method-param>java.math.BigDecimal</method-param>
+ <method-param>java.math.BigDecimal</method-param>
+ <method-param>double</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>queueOrderOnePhase</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <trans-attribute>RequiresNew</trans-attribute>
+ </container-transaction>
+ <container-transaction>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>cancelOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>completeOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>resetTrade</method-name>
+ <method-params>
+ <method-param>boolean</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJPA</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>cancelOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJPA</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>completeOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJPA</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>resetTrade</method-name>
+ <method-params>
+ <method-param>boolean</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>cancelOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>completeOrderOnePhaseDirect</method-name>
+ <method-params>
+ <method-param>java.lang.Integer</method-param>
+ </method-params>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-intf>Remote</method-intf>
+ <method-name>resetTrade</method-name>
+ <method-params>
+ <method-param>boolean</method-param>
+ </method-params>
+ </method>
+ <trans-attribute>NotSupported</trans-attribute>
+ </container-transaction>
+ <container-transaction>
+ <method>
+ <ejb-name>AccountEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>AccountProfileEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>HoldingEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>KeyGenEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>KeySequenceEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>OrderEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>QuoteEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>TradeBrokerMDB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>TradeEJB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>TradeJPA</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>TradeStreamerMDB</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <method>
+ <ejb-name>TradeJDBC</ejb-name>
+ <method-name>*</method-name>
+ </method>
+ <trans-attribute>Required</trans-attribute>
+ </container-transaction>
+ <message-destination>
+ <message-destination-name>TradeBrokerQueue</message-destination-name>
+ </message-destination>
+ <message-destination>
+ <message-destination-name>TradeStreamerTopic</message-destination-name>
+ </message-destination>
+ </assembly-descriptor>
+</ejb-jar>