Return-Path: Delivered-To: apmail-incubator-open-jpa-commits-archive@locus.apache.org Received: (qmail 12322 invoked from network); 19 Jul 2006 21:38:25 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 19 Jul 2006 21:38:25 -0000 Received: (qmail 90394 invoked by uid 500); 19 Jul 2006 21:38:25 -0000 Delivered-To: apmail-incubator-open-jpa-commits-archive@incubator.apache.org Received: (qmail 90374 invoked by uid 500); 19 Jul 2006 21:38:25 -0000 Mailing-List: contact open-jpa-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: open-jpa-dev@incubator.apache.org Delivered-To: mailing list open-jpa-commits@incubator.apache.org Received: (qmail 90365 invoked by uid 99); 19 Jul 2006 21:38:25 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 19 Jul 2006 14:38:25 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: domain of pcl@apache.org designates 140.211.166.113 as permitted sender) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 19 Jul 2006 14:38:18 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 338341A985D; Wed, 19 Jul 2006 14:36:43 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r423615 [43/44] - in /incubator/openjpa/trunk: ./ openjpa-jdbc-5/ openjpa-jdbc-5/src/ openjpa-jdbc-5/src/main/ openjpa-jdbc-5/src/main/java/ openjpa-jdbc-5/src/main/java/org/ openjpa-jdbc-5/src/main/java/org/apache/ openjpa-jdbc-5/src/main/... Date: Wed, 19 Jul 2006 21:35:07 -0000 To: open-jpa-commits@incubator.apache.org From: pcl@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060719213643.338341A985D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,109 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import org.apache.openjpa.jdbc.kernel.DelegatingJDBCFetchConfiguration; +import org.apache.openjpa.jdbc.kernel.EagerFetchModes; +import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration; +import org.apache.openjpa.jdbc.kernel.LRSSizes; +import org.apache.openjpa.jdbc.sql.JoinSyntaxes; +import org.apache.openjpa.kernel.DelegatingFetchConfiguration; +import org.apache.openjpa.kernel.FetchConfiguration; +import org.apache.openjpa.persistence.FetchPlan; +import org.apache.openjpa.persistence.PersistenceExceptions; + +/** + * JDBC extensions to the fetch plan. + * + * @since 4.0 + * @author Abe White + * @published + */ +public class JDBCFetchPlan + extends FetchPlan + implements EagerFetchModes, LRSSizes, JoinSyntaxes { + + private DelegatingJDBCFetchConfiguration _fetch; + + /** + * Constructor; supply delegate. + */ + public JDBCFetchPlan(FetchConfiguration fetch) { + super(fetch); + } + + @Override + protected DelegatingFetchConfiguration newDelegatingFetchConfiguration + (FetchConfiguration fetch) { + _fetch = new DelegatingJDBCFetchConfiguration((JDBCFetchConfiguration) + fetch, PersistenceExceptions.TRANSLATOR); + return _fetch; + } + + public int getEagerFetchMode() { + return _fetch.getEagerFetchMode(); + } + + public JDBCFetchPlan setEagerFetchMode(int mode) { + _fetch.setEagerFetchMode(mode); + return this; + } + + public int getSubclassFetchMode() { + return _fetch.getSubclassFetchMode(); + } + + public JDBCFetchPlan setSubclassFetchMode(int mode) { + _fetch.setSubclassFetchMode(mode); + return this; + } + + public int getResultSetType() { + return _fetch.getResultSetType(); + } + + public JDBCFetchPlan setResultSetType(int type) { + _fetch.setResultSetType(type); + return this; + } + + public int getFetchDirection() { + return _fetch.getFetchDirection(); + } + + public JDBCFetchPlan setFetchDirection(int direction) { + _fetch.setFetchDirection(direction); + return this; + } + + public int getLRSSize() { + return _fetch.getLRSSize(); + } + + public JDBCFetchPlan setLRSSize(int lrsSize) { + _fetch.setLRSSize(lrsSize); + return this; + } + + public int getJoinSyntax() { + return _fetch.getJoinSyntax(); + } + + public JDBCFetchPlan setJoinSyntax(int syntax) { + _fetch.setJoinSyntax(syntax); + return this; + } +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCFetchPlan.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,81 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import org.apache.openjpa.conf.OpenJPAConfiguration; +import org.apache.openjpa.conf.ProductDerivation; +import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl; +import org.apache.openjpa.lib.conf.ConfigurationProvider; +import org.apache.openjpa.persistence.FetchPlan; +import org.apache.openjpa.persistence.PersistenceProductDerivation; + +/** + * Sets JDBC-specific JPA specification defaults. + * + * @author Abe White + * @nojavadoc + */ +public class JDBCPersistenceProductDerivation + implements ProductDerivation { + + public int getType() { + return TYPE_SPEC_STORE; + } + + public void beforeConfigurationConstruct(ConfigurationProvider cp) { + } + + public void beforeConfigurationLoad(OpenJPAConfiguration c) { + if (!(c instanceof JDBCConfigurationImpl)) + return; + + c.getStoreFacadeTypeRegistry().registerImplementation( + FetchPlan.class, JDBCFetchPlan.class); + + JDBCConfigurationImpl conf = (JDBCConfigurationImpl) c; + String jpa = PersistenceProductDerivation.SPEC_JPA; + String ejb = PersistenceProductDerivation.ALIAS_EJB; + + conf.metaFactoryPlugin.setAlias(jpa, + PersistenceMappingFactory.class.getName()); + conf.metaFactoryPlugin.setAlias(ejb, + PersistenceMappingFactory.class.getName()); + + conf.mappingFactoryPlugin.setAlias(jpa, + PersistenceMappingFactory.class.getName()); + conf.mappingFactoryPlugin.setAlias(ejb, + PersistenceMappingFactory.class.getName()); + + conf.mappingDefaultsPlugin.setAlias(jpa, + PersistenceMappingDefaults.class.getName()); + conf.mappingDefaultsPlugin.setAlias(ejb, + PersistenceMappingDefaults.class.getName()); + } + + public void afterSpecificationSet(OpenJPAConfiguration c) { + String jpa = PersistenceProductDerivation.SPEC_JPA; + if (!(c instanceof JDBCConfigurationImpl) + || !jpa.equals(c.getSpecification())) + return; + + JDBCConfigurationImpl conf = (JDBCConfigurationImpl) c; + conf.mappingDefaultsPlugin.setDefault(jpa); + conf.mappingDefaultsPlugin.setString(jpa); + } + + public void afterClose(OpenJPAConfiguration c) { + } +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverride.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverride.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverride.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverride.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,43 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; +import javax.persistence.Column; + +/** + * Allows override of complex embedded or superclass mappings. + * + * @author Abe White + * @since 4.0 + */ +@Target({ TYPE }) +@Retention(RUNTIME) +public @interface MappingOverride { + + String name() default ""; + + Column[] columns() default {}; + + XJoinColumn[] joinColumns() default {}; + + ElementJoinColumn[] elementJoinColumns() default {}; + + ContainerTable containerTable() default @ContainerTable(specified = false); +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverride.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverrides.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverrides.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverrides.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverrides.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,34 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Allows override of complex embedded or superclass mappings. + * + * @author Abe White + * @since 4.0 + */ +@Target({ TYPE }) +@Retention(RUNTIME) +public @interface MappingOverrides { + + MappingOverride[] value() default {}; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingOverrides.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingTag.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingTag.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingTag.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingTag.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,86 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +///////////////////////////////////////////////////////// +// NOTE: when adding a new type, make sure to update the +// table in PersistenceMappingParser +///////////////////////////////////////////////////////// + +/** + * Set of mapping tags used in JPA. + * + * @author Abe White + */ +enum MappingTag { + + ASSOC_OVERRIDE, + ASSOC_OVERRIDES, + ATTR_OVERRIDE, + ATTR_OVERRIDES, + COL, + COLUMN_RESULT, + DISCRIM_COL, + DISCRIM_VAL, + ENTITY_RESULT, + ENUMERATED, + FIELD_RESULT, + GEN_ID_TABLE, + INHERITANCE, + JOIN_COL, + JOIN_COLS, + JOIN_TABLE, + PK_JOIN_COL, + PK_JOIN_COLS, + SECONDARY_TABLE, + SECONDARY_TABLES, + SQL_RESULT_SET_MAPPING, + SQL_RESULT_SET_MAPPINGS, + TABLE, + TABLE_GEN, + TEMPORAL, + // openjpa extensions + CLASS_CRIT, + COLS, + CONTAINER_TABLE, + DATASTORE_ID_COL, + DISCRIM_STRAT, + EAGER_FETCH_MODE, + ELEM_CLASS_CRIT, + ELEM_FK, + ELEM_INDEX, + ELEM_JOIN_COL, + ELEM_JOIN_COLS, + ELEM_NONPOLY, + EMBEDDED_MAPPING, + FK, + INDEX, + MAPPING_OVERRIDE, + MAPPING_OVERRIDES, + NONPOLY, + ORDER_COL, + STRAT, + SUBCLASS_FETCH_MODE, + UNIQUE, + VERSION_COL, + VERSION_COLS, + VERSION_STRAT, + X_JOIN_COL, + X_JOIN_COLS, + X_SECONDARY_TABLE, + X_SECONDARY_TABLES, + X_TABLE, +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/MappingTag.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Nonpolymorphic.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Nonpolymorphic.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Nonpolymorphic.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Nonpolymorphic.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,35 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Indicates that the annotated relation is not entirely polymorphic. + * + * @author Abe White + * @since 4.0 + */ +@Target({ METHOD, FIELD }) +@Retention(RUNTIME) +public @interface Nonpolymorphic { + + NonpolymorphicType value() default NonpolymorphicType.EXACT; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Nonpolymorphic.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/NonpolymorphicType.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/NonpolymorphicType.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/NonpolymorphicType.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/NonpolymorphicType.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,28 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +/** + * Nonpolymorphic settings. + * + * @author Abe White + * @since 4.0 + */ +public enum NonpolymorphicType { + + EXACT, + JOINABLE, + FALSE }; Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/NonpolymorphicType.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/OrderColumn.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/OrderColumn.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/OrderColumn.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/OrderColumn.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,45 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Surrogate order column. + * + * @author Abe White + * @since 4.0 + */ +@Target({ METHOD, FIELD }) +@Retention(RUNTIME) +public @interface OrderColumn { + + String name() default ""; + + boolean enabled() default true; + + boolean insertable() default true; + + boolean updatable() default true; + + String columnDefinition() default ""; + + int precision() default 0; // decimal precision +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/OrderColumn.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingDefaults.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingDefaults.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingDefaults.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingDefaults.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,165 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import org.apache.openjpa.jdbc.meta.ClassMapping; +import org.apache.openjpa.jdbc.meta.Discriminator; +import org.apache.openjpa.jdbc.meta.FieldMapping; +import org.apache.openjpa.jdbc.meta.MappingDefaultsImpl; +import org.apache.openjpa.jdbc.meta.ValueMapping; +import org.apache.openjpa.jdbc.meta.Version; +import org.apache.openjpa.jdbc.meta.strats.FlatClassStrategy; +import org.apache.openjpa.jdbc.meta.strats.NoneDiscriminatorStrategy; +import org.apache.openjpa.jdbc.meta.strats.NoneVersionStrategy; +import org.apache.openjpa.jdbc.meta.strats.NumberVersionStrategy; +import org.apache.openjpa.jdbc.meta.strats.SubclassJoinDiscriminatorStrategy; +import org.apache.openjpa.jdbc.meta.strats.ValueMapDiscriminatorStrategy; +import org.apache.openjpa.jdbc.meta.strats.VerticalClassStrategy; +import org.apache.openjpa.jdbc.schema.Column; +import org.apache.openjpa.jdbc.schema.Schema; +import org.apache.openjpa.jdbc.schema.Table; +import org.apache.openjpa.jdbc.sql.JoinSyntaxes; +import org.apache.openjpa.meta.JavaTypes; +import serp.util.Strings; + +/** + * Supplies default mapping information in accordance with JPA spec. + * + * @author Steve Kim + * @author Abe White + */ +public class PersistenceMappingDefaults + extends MappingDefaultsImpl { + + public PersistenceMappingDefaults() { + setDefaultMissingInfo(true); + setStoreEnumOrdinal(true); + setOrderLists(false); + setAddNullIndicator(false); + setDiscriminatorColumnName("DTYPE"); + } + + @Override + public Object getStrategy(Version vers, boolean adapt) { + Object strat = super.getStrategy(vers, adapt); + ClassMapping cls = vers.getClassMapping(); + if (strat != null || cls.getJoinablePCSuperclassMapping() != null + || cls.getVersionField() != null) + return strat; + + if (vers.getMappingInfo().getColumns().isEmpty()) + return NoneVersionStrategy.getInstance(); + return new NumberVersionStrategy(); + } + + @Override + public Object getStrategy(Discriminator disc, boolean adapt) { + Object strat = super.getStrategy(disc, adapt); + ClassMapping cls = disc.getClassMapping(); + if (strat != null || cls.getJoinablePCSuperclassMapping() != null + || disc.getMappingInfo().getValue() != null) + return strat; + + // don't use a column-based discriminator approach unless user has set + // a column explicitly or is using flat inheritance explicitly + if (!disc.getMappingInfo().getColumns().isEmpty()) + return new ValueMapDiscriminatorStrategy(); + + ClassMapping base = cls; + while (base.getMappingInfo().getHierarchyStrategy() == null + && base.getPCSuperclassMapping() != null) + base = base.getPCSuperclassMapping(); + + strat = base.getMappingInfo().getHierarchyStrategy(); + if (FlatClassStrategy.ALIAS.equals(strat)) + return new ValueMapDiscriminatorStrategy(); + if (VerticalClassStrategy.ALIAS.equals(strat) + && dict.joinSyntax != JoinSyntaxes.SYNTAX_TRADITIONAL) + return new SubclassJoinDiscriminatorStrategy(); + return NoneDiscriminatorStrategy.getInstance(); + } + + @Override + public String getTableName(ClassMapping cls, Schema schema) { + return Strings.getClassName(cls.getDescribedType()).replace('$', '_'); + } + + @Override + public String getTableName(FieldMapping fm, Schema schema) { + // base name is table of defining type + '_' + String name = fm.getDefiningMapping().getTable().getName() + "_"; + + // if this is an assocation table, spec says to suffix with table of + // the related type. spec doesn't cover other cases; we're going to + // suffix with the field name + ClassMapping rel = fm.getElementMapping().getTypeMapping(); + boolean assoc = rel != null && rel.getTable() != null + && fm.getTypeCode() != JavaTypes.MAP; + if (assoc) + name += rel.getTable().getName(); + else + name += fm.getName(); + return name.replace('$', '_'); + } + + @Override + public void populateJoinColumn(FieldMapping fm, Table local, Table foreign, + Column col, Object target, int pos, int cols) { + // only use spec defaults with column targets + if (!(target instanceof Column)) + return; + + // if this is a bidi relation, prefix with inverse field name, else + // prefix with owning entity name + FieldMapping[] inverses = fm.getInverseMappings(); + String name; + if (inverses.length > 0) + name = inverses[0].getName(); + else + name = fm.getDefiningMapping().getTypeAlias(); + + // suffix with '_' + target column + name += "_" + ((Column) target).getName(); + col.setName(name); + } + + @Override + public void populateForeignKeyColumn(ValueMapping vm, String name, + Table local, Table foreign, Column col, Object target, boolean inverse, + int pos, int cols) { + // if this is a non-inverse collection element key, it must be in + // a join table; jpa says to use the target column name, + // which is the default + if (!inverse && vm == vm.getFieldMapping().getElement() + && vm.getFieldMapping().getTypeCode() != JavaTypes.MAP) + return; + + // otherwise jpa always uses _ for column name, even + // when only one col + if (target instanceof Column) + col.setName(name + "_" + ((Column) target).getName()); + } + + @Override + public void populateColumns(Version vers, Table table, Column[] cols) { + // check for version field and use its name as column name + FieldMapping fm = vers.getClassMapping().getVersionFieldMapping(); + if (fm != null && cols.length == 1) + cols[0].setName(fm.getName()); + else + super.populateColumns(vers, table, cols); + } +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingDefaults.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingFactory.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingFactory.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingFactory.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingFactory.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,58 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import org.apache.openjpa.jdbc.conf.JDBCConfiguration; +import org.apache.openjpa.jdbc.meta.MappingRepository; +import org.apache.openjpa.meta.MetaDataFactory; +import org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser; +import org.apache.openjpa.persistence.PersistenceMetaDataFactory; +import org.apache.openjpa.persistence.XMLPersistenceMetaDataParser; + +/** + * {@link MetaDataFactory} for JPA mapping information. + * + * @author Abe White + * @since 4.0 + */ +public class PersistenceMappingFactory + extends PersistenceMetaDataFactory { + + @Override + protected AnnotationPersistenceMetaDataParser newAnnotationParser() { + AnnotationPersistenceMappingParser parser = + new AnnotationPersistenceMappingParser((JDBCConfiguration) + repos.getConfiguration()); + // strict mode means we're using a separate mapping parser, so if + // we're adapting parse metadata hints + if (strict) + parser.setMappingOverride(((MappingRepository) repos). + getStrategyInstaller().isAdapting()); + return parser; + } + + @Override + protected XMLPersistenceMetaDataParser newXMLParser(boolean loading) { + XMLPersistenceMappingParser parser = new XMLPersistenceMappingParser + ((JDBCConfiguration) repos.getConfiguration()); + // strict mode means we're using a separate mapping parser, so if + // we're adapting parse metadata hints + if (strict && loading) + parser.setMappingOverride(((MappingRepository) repos). + getStrategyInstaller().isAdapting()); + return parser; + } +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/PersistenceMappingFactory.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Strategy.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Strategy.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Strategy.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Strategy.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,34 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.*; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Mapping strategy. + * + * @author Abe White + * @since 4.0 + */ +@Target({ TYPE, METHOD, FIELD }) +@Retention(RUNTIME) +public @interface Strategy { + + String value() default ""; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Strategy.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/SubclassFetchMode.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/SubclassFetchMode.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/SubclassFetchMode.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/SubclassFetchMode.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,34 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Determines how to eager-fetch subclass data. + * + * @author Abe White + * @since 4.0 + */ +@Target({ TYPE }) +@Retention(RUNTIME) +public @interface SubclassFetchMode { + + EagerFetchType value() default EagerFetchType.NONE; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/SubclassFetchMode.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Unique.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Unique.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Unique.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Unique.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,41 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Unique constraint definition. + * + * @author Abe White + * @since 4.0 + */ +@Target({ METHOD, FIELD }) +@Retention(RUNTIME) +public @interface Unique { + + String name() default ""; + + boolean enabled() default true; + + boolean deferred() default false; + + String[] columnNames() default {}; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/Unique.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumn.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumn.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumn.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumn.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,48 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Surrogate version column. + * + * @author Abe White + * @since 4.0 + */ +@Target({ TYPE }) +@Retention(RUNTIME) +public @interface VersionColumn { + + String name() default ""; + + boolean nullable() default true; + + boolean insertable() default true; + + boolean updatable() default true; + + String columnDefinition() default ""; + + int length() default 255; + + int precision() default 0; // decimal precision + + int scale() default 0; // decimal scale +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumn.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumns.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumns.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumns.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumns.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,34 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Allows the specification of multiple version columns for complex versioning. + * + * @author Abe White + * @since 4.0 + */ +@Target({ TYPE }) +@Retention(RUNTIME) +public @interface VersionColumns { + + VersionColumn[] value() default {}; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionColumns.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionStrategy.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionStrategy.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionStrategy.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionStrategy.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,34 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.TYPE; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Version mapping strategy. + * + * @author Abe White + * @since 4.0 + */ +@Target({ TYPE }) +@Retention(RUNTIME) +public @interface VersionStrategy { + + String value() default ""; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/VersionStrategy.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumn.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumn.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumn.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumn.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,51 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Extended join column. + * + * @author Abe White + * @since 4.0 + */ +@Target({ METHOD, FIELD }) +@Retention(RUNTIME) +public @interface XJoinColumn { + + String name() default ""; + + String referencedColumnName() default ""; + + String referencedAttributeName() default ""; + + boolean unique() default false; + + boolean nullable() default true; + + boolean insertable() default true; + + boolean updatable() default true; + + String columnDefinition() default ""; + + String table() default ""; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumn.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumns.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumns.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumns.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumns.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,35 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Target; + +/** + * Allows the specification of multiple columns for compound joins. + * + * @author Abe White + * @since 4.0 + */ +@Target({ METHOD, FIELD }) +@Retention(RUNTIME) +public @interface XJoinColumns { + + XJoinColumn[] value() default {}; +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XJoinColumns.java ------------------------------------------------------------------------------ svn:executable = * Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java?rev=423615&view=auto ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java Wed Jul 19 14:34:44 2006 @@ -0,0 +1,867 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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. + */ +package org.apache.openjpa.persistence.jdbc; + +import java.sql.Types; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.persistence.DiscriminatorType; +import javax.persistence.EnumType; +import javax.persistence.InheritanceType; +import javax.persistence.TemporalType; + +import org.apache.commons.lang.StringUtils; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.apache.openjpa.jdbc.conf.JDBCConfiguration; +import org.apache.openjpa.jdbc.meta.ClassMapping; +import org.apache.openjpa.jdbc.meta.ClassMappingInfo; +import org.apache.openjpa.jdbc.meta.DiscriminatorMappingInfo; +import org.apache.openjpa.jdbc.meta.FieldMapping; +import org.apache.openjpa.jdbc.meta.MappingRepository; +import org.apache.openjpa.jdbc.meta.QueryResultMapping; +import org.apache.openjpa.jdbc.meta.SequenceMapping; +import org.apache.openjpa.jdbc.meta.strats.EnumValueHandler; +import org.apache.openjpa.jdbc.meta.strats.FlatClassStrategy; +import org.apache.openjpa.jdbc.meta.strats.FullClassStrategy; +import org.apache.openjpa.jdbc.meta.strats.NoneClassStrategy; +import org.apache.openjpa.jdbc.meta.strats.VerticalClassStrategy; +import org.apache.openjpa.jdbc.schema.Column; +import org.apache.openjpa.jdbc.schema.Unique; +import org.apache.openjpa.lib.log.Log; +import org.apache.openjpa.lib.util.Localizer; +import org.apache.openjpa.meta.ClassMetaData; +import org.apache.openjpa.meta.FieldMetaData; +import org.apache.openjpa.meta.JavaTypes; +import org.apache.openjpa.meta.MetaDataRepository; +import org.apache.openjpa.persistence.XMLPersistenceMetaDataParser; +import static org.apache.openjpa.persistence.jdbc.MappingTag.*; + +/** + * Custom SAX parser used by the system to parse persistence mapping files. + * + * @author Steve Kim + * @nojavadoc + */ +public class XMLPersistenceMappingParser + extends XMLPersistenceMetaDataParser { + + private static final Map _elems = + new HashMap(); + + static { + _elems.put("association-override", ASSOC_OVERRIDE); + _elems.put("attribute-override", ATTR_OVERRIDE); + _elems.put("column", COL); + _elems.put("column-result", COLUMN_RESULT); + _elems.put("discriminator-column", DISCRIM_COL); + _elems.put("discriminator-value", DISCRIM_VAL); + _elems.put("entity-result", ENTITY_RESULT); + _elems.put("enumerated", ENUMERATED); + _elems.put("field-result", FIELD_RESULT); + _elems.put("inheritance", INHERITANCE); + _elems.put("join-column", JOIN_COL); + _elems.put("inverse-join-column", COL); + _elems.put("join-table", JOIN_TABLE); + _elems.put("primary-key-join-column", PK_JOIN_COL); + _elems.put("secondary-table", SECONDARY_TABLE); + _elems.put("sql-result-set-mapping", SQL_RESULT_SET_MAPPING); + _elems.put("table", TABLE); + _elems.put("table-generator", TABLE_GEN); + _elems.put("temporal", TEMPORAL); + } + + private static final Localizer _loc = Localizer.forPackage + (XMLPersistenceMappingParser.class); + + private String _override = null; + private String _schema = null; + private String _colTable = null; + private String _secondaryTable = null; + private List _cols = null; + private List _joinCols = null; + private List _supJoinCols = null; + private boolean _lob = false; + private TemporalType _temporal = null; + private EnumSet _unique = EnumSet.noneOf(UniqueFlag.class); + private DiscriminatorType _discType; + private Column _discCol; + private int _resultIdx = 0; + + /** + * Constructor; supply configuration. + */ + public XMLPersistenceMappingParser(JDBCConfiguration conf) { + super(conf); + } + + /** + * Create a new metadata repository. + */ + @Override + protected MetaDataRepository newRepository() { + return ((JDBCConfiguration) getConfiguration()). + newMappingRepositoryInstance(); + } + + @Override + protected void reset() { + super.reset(); + clearColumnInfo(); + clearClassInfo(); + clearSecondaryTableInfo(); + _override = null; + _schema = null; + _resultIdx = 0; + } + + @Override + protected Object startSystemMappingElement(String name, Attributes attrs) + throws SAXException { + MappingTag tag = _elems.get(name); + if (tag == null) { + if ("schema".equals(name)) + return name; + return null; + } + + boolean ret; + switch (tag) { + case TABLE_GEN: + ret = startTableGenerator(attrs); + break; + case SQL_RESULT_SET_MAPPING: + ret = startSQLResultSetMapping(attrs); + break; + case ENTITY_RESULT: + ret = startEntityResult(attrs); + break; + case FIELD_RESULT: + ret = startFieldResult(attrs); + break; + case COLUMN_RESULT: + ret = startColumnResult(attrs); + break; + default: + ret = false; + } + return (ret) ? tag : null; + } + + @Override + protected void endSystemMappingElement(String name) + throws SAXException { + MappingTag tag = _elems.get(name); + if (tag == null) { + if ("schema".equals(name)) + _schema = currentText(); + return; + } + + switch (tag) { + case SQL_RESULT_SET_MAPPING: + endSQLResultSetMapping(); + break; + case ENTITY_RESULT: + endEntityResult(); + break; + } + } + + @Override + protected Object startClassMappingElement(String name, Attributes attrs) + throws SAXException { + MappingTag tag = _elems.get(name); + if (tag == null) + return null; + + boolean ret; + switch (tag) { + case TABLE: + ret = startTable(attrs); + break; + case SECONDARY_TABLE: + ret = startSecondaryTable(attrs); + break; + case DISCRIM_COL: + _discCol = parseColumn(attrs); + ret = true; + break; + case DISCRIM_VAL: + ret = true; + break; + case INHERITANCE: + ret = startInheritance(attrs); + break; + case ASSOC_OVERRIDE: + case ATTR_OVERRIDE: + ret = startAttributeOverride(attrs); + break; + case PK_JOIN_COL: + ret = startPrimaryKeyJoinColumn(attrs); + break; + case COL: + ret = startColumn(attrs); + break; + case JOIN_COL: + ret = startJoinColumn(attrs); + break; + case JOIN_TABLE: + ret = startJoinTable(attrs); + break; + case TABLE_GEN: + ret = startTableGenerator(attrs); + break; + case UNIQUE: + getLog().warn(_loc.get("unique-constraints", currentElement())); + ret = false; + break; + case TEMPORAL: + case ENUMERATED: + ret = true; + break; + case SQL_RESULT_SET_MAPPING: + ret = startSQLResultSetMapping(attrs); + break; + case ENTITY_RESULT: + ret = startEntityResult(attrs); + break; + case FIELD_RESULT: + ret = startFieldResult(attrs); + break; + case COLUMN_RESULT: + ret = startColumnResult(attrs); + break; + default: + ret = false; + } + return (ret) ? tag : null; + } + + @Override + protected void endClassMappingElement(String name) + throws SAXException { + MappingTag tag = _elems.get(name); + if (tag == null) + return; + + switch (tag) { + case SECONDARY_TABLE: + endSecondaryTable(); + break; + case DISCRIM_VAL: + endDiscriminatorValue(); + break; + case ATTR_OVERRIDE: + endAttributeOverride(); + break; + case JOIN_TABLE: + endJoinTable(); + break; + case TEMPORAL: + endTemporal(); + break; + case ENUMERATED: + endEnumerated(); + break; + case SQL_RESULT_SET_MAPPING: + endSQLResultSetMapping(); + break; + case ENTITY_RESULT: + endEntityResult(); + break; + } + } + + @Override + protected void startClassMapping(ClassMetaData meta, boolean mappedSuper, + Attributes attrs) + throws SAXException { + if (mappedSuper) + ((ClassMapping) meta).getMappingInfo().setStrategy + (NoneClassStrategy.ALIAS); + } + + @Override + protected void endClassMapping(ClassMetaData meta) + throws SAXException { + ClassMapping cm = (ClassMapping) meta; + if (_supJoinCols != null) + cm.getMappingInfo().setColumns(_supJoinCols); + + if (_discCol != null) { + DiscriminatorMappingInfo dinfo = cm.getDiscriminator(). + getMappingInfo(); + if (_discType != null) { + switch (_discType) { + case CHAR: + _discCol.setJavaType(JavaTypes.CHAR); + break; + case INTEGER: + _discCol.setJavaType(JavaTypes.INT); + break; + default: + _discCol.setJavaType(JavaTypes.STRING); + break; + } + } + dinfo.setColumns(Arrays.asList(new Column[]{ _discCol })); + } + clearClassInfo(); + } + + /** + * Clear cached class mapping info. + */ + private void clearClassInfo() { + _supJoinCols = null; + _discCol = null; + _discType = null; + } + + /** + * Start tracking secondary table information and columns + */ + private boolean startSecondaryTable(Attributes attrs) + throws SAXException { + _secondaryTable = toTableName(attrs.getValue("schema"), + attrs.getValue("name")); + return true; + } + + /** + * Set the secondary table information back to the owning class mapping. + */ + private void endSecondaryTable() { + ClassMapping cm = (ClassMapping) currentElement(); + ClassMappingInfo info = cm.getMappingInfo(); + info.setSecondaryTableJoinColumns(_secondaryTable, _joinCols); + clearSecondaryTableInfo(); + } + + /** + * Clear cached secondary table info. + */ + private void clearSecondaryTableInfo() { + _joinCols = null; + _secondaryTable = null; + } + + /** + * Parse table-generator. + */ + private boolean startTableGenerator(Attributes attrs) { + String name = attrs.getValue("name"); + Log log = getLog(); + if (log.isInfoEnabled()) + log.info(_loc.get("parse-gen", name)); + if (getRepository().getCachedSequenceMetaData(name) != null + && log.isWarnEnabled()) + log.warn(_loc.get("override-gen", name)); + + SequenceMapping seq = (SequenceMapping) getRepository(). + addSequenceMetaData(name); + seq.setSequencePlugin(SequenceMapping.IMPL_VALUE_TABLE); + seq.setTable(toTableName(attrs.getValue("schema"), + attrs.getValue("table"))); + seq.setPrimaryKeyColumn(attrs.getValue("pk-column-name")); + seq.setSequenceColumn(attrs.getValue("value-column-name")); + seq.setPrimaryKeyValue(attrs.getValue("pk-column-value")); + String val = attrs.getValue("initial-value"); + if (val != null) + seq.setInitialValue(Integer.parseInt(val)); + val = attrs.getValue("allocation-size"); + if (val != null) + seq.setAllocate(Integer.parseInt(val)); + + Object cur = currentElement(); + Object scope = (cur instanceof ClassMetaData) + ? ((ClassMetaData) cur).getDescribedType() : null; + seq.setSource(getSourceFile(), scope, seq.SRC_XML); + return true; + } + + /** + * Parse inheritance. + */ + private boolean startInheritance(Attributes attrs) { + String val = attrs.getValue("strategy"); + if (val == null) + return true; + + ClassMapping cm = (ClassMapping) currentElement(); + ClassMappingInfo info = cm.getMappingInfo(); + switch (Enum.valueOf(InheritanceType.class, val)) { + case SINGLE_TABLE: + info.setHierarchyStrategy(FlatClassStrategy.ALIAS); + break; + case JOINED: + info.setHierarchyStrategy(VerticalClassStrategy.ALIAS); + break; + case TABLE_PER_CLASS: + info.setHierarchyStrategy(FullClassStrategy.ALIAS); + break; + } + return true; + } + + /** + * Parse discriminator-value. + */ + private void endDiscriminatorValue() { + String val = currentText(); + if (StringUtils.isEmpty(val)) + return; + + ClassMapping cm = (ClassMapping) currentElement(); + cm.getDiscriminator().getMappingInfo().setValue(val); + } + + /** + * Parse temporal. + */ + private void endTemporal() { + String temp = currentText(); + if (!StringUtils.isEmpty(temp)) + _temporal = Enum.valueOf(TemporalType.class, temp); + } + + /** + * Parse enumerated. + */ + private void endEnumerated() { + String text = currentText(); + if (StringUtils.isEmpty(text)) + return; + EnumType type = Enum.valueOf(EnumType.class, text); + + FieldMapping fm = (FieldMapping) currentElement(); + String strat = EnumValueHandler.class.getName() + "(StoreOrdinal=" + + String.valueOf(type == EnumType.ORDINAL) + ")"; + fm.getValueInfo().setStrategy(strat); + } + + @Override + protected boolean startLob(Attributes attrs) + throws SAXException { + if (super.startLob(attrs)) { + _lob = true; + return true; + } + return false; + } + + /** + * Extend to clear annotation mapping info. + */ + @Override + protected void startFieldMapping(FieldMetaData field, Attributes attrs) + throws SAXException { + super.startFieldMapping(field, attrs); + if (getAnnotationParser() != null) { + FieldMapping fm = (FieldMapping) field; + fm.getMappingInfo().clear(); + fm.getValueInfo().clear(); + fm.getElementMapping().getValueInfo().clear(); + fm.getKeyMapping().getValueInfo().clear(); + } + } + + /** + * Extend to set the columns. + */ + @Override + protected void endFieldMapping(FieldMetaData field) + throws SAXException { + // setup columns with cached lob and temporal info + FieldMapping fm = (FieldMapping) field; + if (_lob || _temporal != null) { + if (_cols == null) { + _cols = new ArrayList(1); + _cols.add(new Column()); + } + for (Column col : _cols) { + if (_lob && (fm.getDeclaredTypeCode() == JavaTypes.STRING + || fm.getDeclaredType() == char[].class + || fm.getDeclaredType() == Character[].class)) { + col.setSize(-1); + col.setType(Types.CLOB); + } else if (_lob) + col.setType(Types.BLOB); + else { + switch (_temporal) { + case DATE: + col.setType(Types.DATE); + break; + case TIME: + col.setType(Types.TIME); + break; + case TIMESTAMP: + col.setType(Types.TIMESTAMP); + break; + } + } + } + } + + if (_cols != null) { + switch (fm.getDeclaredTypeCode()) { + case JavaTypes.ARRAY: + if (fm.getDeclaredType() == byte[].class + || fm.getDeclaredType() == char[].class + || fm.getDeclaredType() == Character[].class) { + fm.getValueInfo().setColumns(_cols); + break; + } + // else no break + case JavaTypes.COLLECTION: + case JavaTypes.MAP: + fm.getElementMapping().getValueInfo().setColumns(_cols); + break; + default: + fm.getValueInfo().setColumns(_cols); + } + if (_colTable != null) + fm.getMappingInfo().setTableName(_colTable); + setUnique(fm); + } + clearColumnInfo(); + } + + /** + * Set unique for field. + */ + private void setUnique(FieldMapping fm) { + if (_unique.size() == 2) // i.e. TRUE & FALSE + getLog().warn(_loc.get("inconsist-col-attrs", fm)); + else if (_unique.contains(UniqueFlag.TRUE)) + fm.getValueInfo().setUnique(new Unique()); + } + + /** + * Clear field level column information. + */ + private void clearColumnInfo() { + _cols = null; + _joinCols = null; + _colTable = null; + _lob = false; + _temporal = null; + _unique.clear(); + } + + /** + * Parse attribute-override. + */ + private boolean startAttributeOverride(Attributes attr) { + _override = attr.getValue("name"); + return true; + } + + /** + * Set attribute override into proper mapping. + */ + private void endAttributeOverride() + throws SAXException { + Object elem = currentElement(); + FieldMapping fm; + if (elem instanceof ClassMapping) + fm = getAttributeOverride((ClassMapping) elem); + else + fm = getAttributeOverride((FieldMapping) elem); + if (_cols != null) { + fm.getValueInfo().setColumns(_cols); + if (_colTable != null) + fm.getMappingInfo().setTableName(_colTable); + setUnique(fm); + } + clearColumnInfo(); + _override = null; + } + + /** + * Return the proper override. + */ + private FieldMapping getAttributeOverride(ClassMapping cm) { + FieldMapping sup = (FieldMapping) cm.getDefinedSuperclassField + (_override); + if (sup == null) + sup = (FieldMapping) cm.addDefinedSuperclassField(_override, + Object.class, Object.class); + return sup; + } + + /** + * Return the proper override. + */ + private FieldMapping getAttributeOverride(FieldMapping fm) + throws SAXException { + ClassMapping embed = fm.getEmbeddedMapping(); + if (embed == null) + throw getException(_loc.get("not-embedded", fm)); + + FieldMapping efm = embed.getFieldMapping(_override); + if (efm == null) + throw getException(_loc.get("embed-override-name", + fm, _override)); + return efm; + } + + /** + * Parse table. + */ + private boolean startTable(Attributes attrs) + throws SAXException { + String table = toTableName(attrs.getValue("schema"), + attrs.getValue("name")); + if (table != null) + ((ClassMapping) currentElement()).getMappingInfo().setTableName + (table); + return true; + } + + /** + * Parse join-table. + */ + private boolean startJoinTable(Attributes attrs) + throws SAXException { + String table = toTableName(attrs.getValue("schema"), + attrs.getValue("name")); + if (table != null) + ((FieldMapping) currentElement()).getMappingInfo().setTableName + (table); + return true; + } + + /** + * Set the join table information back. + */ + private void endJoinTable() { + FieldMapping fm = (FieldMapping) currentElement(); + if (_joinCols != null) + fm.getMappingInfo().setColumns(_joinCols); + if (_cols != null) + fm.getElementMapping().getValueInfo().setColumns(_cols); + clearColumnInfo(); + } + + /** + * Parse primary-key-join-column. + */ + private boolean startPrimaryKeyJoinColumn(Attributes attrs) + throws SAXException { + Column col = parseColumn(attrs); + col.setFlag(Column.FLAG_PK_JOIN, true); + // pk join columns on fields act as field cols + if (currentElement() instanceof FieldMapping) { + if (_cols == null) + _cols = new ArrayList(3); + _cols.add(col); + } else if (currentParent() == SECONDARY_TABLE) { + // pk join columns in secondary table acts as join cols + if (_joinCols == null) + _joinCols = new ArrayList(3); + _joinCols.add(col); + } else { + // must be pk join cols from this class to superclass + if (_supJoinCols == null) + _supJoinCols = new ArrayList(3); + _supJoinCols.add(col); + } + return true; + } + + /** + * Parse join-column. + */ + private boolean startJoinColumn(Attributes attrs) + throws SAXException { + // only join cols in a join table join field table to class table; + // others act as data fk cols + if (currentParent() != JOIN_TABLE) + return startColumn(attrs); + + if (_joinCols == null) + _joinCols = new ArrayList(3); + _joinCols.add(parseColumn(attrs)); + return true; + } + + /** + * Parse column. + */ + private boolean startColumn(Attributes attrs) + throws SAXException { + if (_cols == null) + _cols = new ArrayList(3); + _cols.add(parseColumn(attrs)); + return true; + } + + /** + * Create a column with the given attributes. + */ + private Column parseColumn(Attributes attrs) + throws SAXException { + Column col = new Column(); + String val = attrs.getValue("name"); + if (val != null) + col.setName(val); + val = attrs.getValue("referenced-column-name"); + if (val != null) + col.setTarget(val); + val = attrs.getValue("column-definition"); + if (val != null) + col.setTypeName(val); + val = attrs.getValue("precision"); + if (val != null) + col.setSize(Integer.parseInt(val)); + val = attrs.getValue("length"); + if (val != null) + col.setSize(Integer.parseInt(val)); + val = attrs.getValue("scale"); + if (val != null) + col.setDecimalDigits(Integer.parseInt(val)); + val = attrs.getValue("nullable"); + if (val != null) + col.setNotNull("false".equals(val)); + val = attrs.getValue("insertable"); + if (val != null) + col.setFlag(Column.FLAG_UNINSERTABLE, "false".equals(val)); + val = attrs.getValue("updatable"); + if (val != null) + col.setFlag(Column.FLAG_UNUPDATABLE, "false".equals(val)); + + val = attrs.getValue("unique"); + if (val != null) + _unique.add(Enum.valueOf(UniqueFlag.class, val.toUpperCase())); + val = attrs.getValue("table"); + if (val != null) { + if (_colTable != null && !_colTable.equals(val)) + throw getException(_loc.get("second-inconsist", + currentElement())); + _colTable = val; + } + return col; + } + + /** + * Return a table name for the given attributes. + */ + private String toTableName(String schema, String table) { + if (StringUtils.isEmpty(table)) + return null; + schema = StringUtils.isEmpty(schema) ? _schema : schema; + if (StringUtils.isEmpty(schema)) + return table; + return schema + "." + table; + } + + /** + * Start processing sql-result-set-mapping node. + * Pushes the {@link QueryResultMapping} onto the stack as current element. + */ + private boolean startSQLResultSetMapping(Attributes attrs) { + String name = attrs.getValue("name"); + Log log = getLog(); + if (log.isInfoEnabled()) + log.info(_loc.get("parse-sqlrsmapping", name)); + + MappingRepository repos = (MappingRepository) getRepository(); + QueryResultMapping result = repos.getCachedQueryResultMapping + (null, name); + if (result != null && log.isWarnEnabled()) + log.warn(_loc.get("override-sqlrsmapping", name, + currentLocation())); + + result = repos.addQueryResultMapping(null, name); + result.setListingIndex(_resultIdx++); + addComments(result); + + Object cur = currentElement(); + Object scope = (cur instanceof ClassMetaData) + ? ((ClassMetaData) cur).getDescribedType() : null; + result.setSource(getSourceFile(), scope, result.SRC_XML); + + pushElement(result); + return true; + } + + private void endSQLResultSetMapping() + throws SAXException { + popElement(); + } + + /** + * Start processing entity-result node. + * Pushes the {@link QueryResultMapping.PCResult} + * onto the stack as current element. + */ + private boolean startEntityResult(Attributes attrs) + throws SAXException { + Class entityClass = classForName(attrs.getValue("entity-class")); + String discriminator = attrs.getValue("discriminator-column"); + + QueryResultMapping parent = (QueryResultMapping) currentElement(); + QueryResultMapping.PCResult result = parent.addPCResult(entityClass); + if (!StringUtils.isEmpty(discriminator)) + result.addMapping(result.DISCRIMINATOR, discriminator); + pushElement(result); + return true; + } + + private void endEntityResult() + throws SAXException { + popElement(); + } + + /** + * Process a field-result node. + */ + private boolean startFieldResult(Attributes attrs) + throws SAXException { + String fieldName = attrs.getValue("name"); + String columnName = attrs.getValue("column"); + + QueryResultMapping.PCResult parent = (QueryResultMapping.PCResult) + currentElement(); + parent.addMapping(fieldName, columnName); + return true; + } + + /** + * Process a column-result node. + */ + private boolean startColumnResult(Attributes attrs) + throws SAXException { + QueryResultMapping parent = (QueryResultMapping) currentElement(); + parent.addColumnResult(attrs.getValue("name")); + return true; + } + + /** + * Track unique column settings. + */ + private static enum UniqueFlag + { + TRUE, + FALSE + } +} Propchange: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/XMLPersistenceMappingParser.java ------------------------------------------------------------------------------ svn:executable = *