You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pc...@apache.org on 2006/07/19 23:35:07 UTC

svn commit: r423615 [19/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/...

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractValueHandler.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractValueHandler.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractValueHandler.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractValueHandler.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.jdbc.meta.strats;
+
+import java.sql.SQLException;
+
+import org.apache.openjpa.jdbc.kernel.JDBCFetchState;
+import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.ValueHandler;
+import org.apache.openjpa.jdbc.meta.ValueMapping;
+import org.apache.openjpa.kernel.OpenJPAStateManager;
+
+/**
+ * No-op implementations of {@link ValueHandler} interface methods.
+ */
+public abstract class AbstractValueHandler
+    implements ValueHandler {
+
+    public boolean isVersionable(ValueMapping vm) {
+        return false;
+    }
+
+    public boolean objectValueRequiresLoad(ValueMapping vm) {
+        return false;
+    }
+
+    public Object getResultArgument(ValueMapping vm) {
+        return null;
+    }
+
+    public Object toDataStoreValue(ValueMapping vm, Object val,
+        JDBCStore store) {
+        return val;
+    }
+
+    public Object toObjectValue(ValueMapping vm, Object val) {
+        return val;
+    }
+
+    public Object toObjectValue(ValueMapping vm, Object val,
+        OpenJPAStateManager sm, JDBCStore store, JDBCFetchState fetchState)
+        throws SQLException {
+        return val;
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractValueHandler.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractVersionStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractVersionStrategy.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractVersionStrategy.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractVersionStrategy.java Wed Jul 19 14:34:44 2006
@@ -0,0 +1,67 @@
+/*
+ * 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.jdbc.meta.strats;
+
+import java.sql.SQLException;
+
+import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.meta.Version;
+import org.apache.openjpa.jdbc.meta.VersionStrategy;
+import org.apache.openjpa.jdbc.sql.Result;
+import org.apache.openjpa.jdbc.sql.Select;
+import org.apache.openjpa.kernel.OpenJPAStateManager;
+import org.apache.openjpa.kernel.StoreManager;
+
+/**
+ * No-op strategy for easy extension.
+ *
+ * @author Abe White
+ */
+public abstract class AbstractVersionStrategy
+    extends AbstractStrategy
+    implements VersionStrategy {
+
+    /**
+     * The owning version.
+     */
+    protected Version vers = null;
+
+    public void setVersion(Version owner) {
+        vers = owner;
+    }
+
+    public boolean select(Select sel, ClassMapping mapping) {
+        return false;
+    }
+
+    public void load(OpenJPAStateManager sm, JDBCStore store, Result res)
+        throws SQLException {
+    }
+
+    public void afterLoad(OpenJPAStateManager sm, JDBCStore store) {
+    }
+
+    public boolean checkVersion(OpenJPAStateManager sm, JDBCStore store,
+        boolean updateVersion)
+        throws SQLException {
+        return false;
+    }
+
+    public int compareVersion(Object v1, Object v2) {
+        return StoreManager.VERSION_SAME;
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractVersionStrategy.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/BlobValueHandler.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/BlobValueHandler.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/BlobValueHandler.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/BlobValueHandler.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.jdbc.meta.strats;
+
+import org.apache.openjpa.jdbc.meta.ValueMapping;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ColumnIO;
+import org.apache.openjpa.meta.JavaTypes;
+
+/**
+ * Handler for blob values.
+ *
+ * @nojavadoc
+ */
+public class BlobValueHandler
+    extends AbstractValueHandler {
+
+    private static final BlobValueHandler _instance = new BlobValueHandler();
+
+    /**
+     * Singleton instance.
+     */
+    public static BlobValueHandler getInstance() {
+        return _instance;
+    }
+
+    public Column[] map(ValueMapping vm, String name, ColumnIO io,
+        boolean adapt) {
+        Column col = new Column();
+        col.setName(name);
+        col.setJavaType(JavaTypes.OBJECT);
+        col.setSize(-1);
+        return new Column[]{ col };
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/BlobValueHandler.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ByteArrayValueHandler.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ByteArrayValueHandler.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ByteArrayValueHandler.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ByteArrayValueHandler.java Wed Jul 19 14:34:44 2006
@@ -0,0 +1,59 @@
+/*
+ * 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.jdbc.meta.strats;
+
+import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
+import org.apache.openjpa.jdbc.meta.ValueMapping;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ColumnIO;
+
+/**
+ * Handler for byte array values.
+ *
+ * @nojavadoc
+ */
+public class ByteArrayValueHandler
+    extends AbstractValueHandler {
+
+    private static final ByteArrayValueHandler _instance =
+        new ByteArrayValueHandler();
+
+    /**
+     * Singleton instance.
+     */
+    public static ByteArrayValueHandler getInstance() {
+        return _instance;
+    }
+
+    public Column[] map(ValueMapping vm, String name, ColumnIO io,
+        boolean adapt) {
+        Column col = new Column();
+        col.setName(name);
+        col.setJavaType(JavaSQLTypes.BYTES);
+        col.setSize(-1);
+        return new Column[]{ col };
+    }
+
+    public Object toDataStoreValue(ValueMapping vm, Object val,
+        JDBCStore store) {
+        return PrimitiveWrapperArrays.toByteArray(val);
+    }
+
+    public Object toObjectValue(ValueMapping vm, Object val) {
+        return PrimitiveWrapperArrays.toObjectValue(vm, (byte[]) val);
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ByteArrayValueHandler.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayStreamValueHandler.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayStreamValueHandler.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayStreamValueHandler.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayStreamValueHandler.java Wed Jul 19 14:34:44 2006
@@ -0,0 +1,80 @@
+/*
+ * 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.jdbc.meta.strats;
+
+import java.io.CharArrayReader;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.Reader;
+
+import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
+import org.apache.openjpa.jdbc.meta.ValueMapping;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ColumnIO;
+import org.apache.openjpa.jdbc.sql.Sized;
+import org.apache.openjpa.util.StoreException;
+
+/**
+ * Handler for char array values.
+ *
+ * @nojavadoc
+ */
+public class CharArrayStreamValueHandler
+    extends AbstractValueHandler {
+
+    private static final CharArrayStreamValueHandler _instance =
+        new CharArrayStreamValueHandler();
+
+    /**
+     * Singleton instance.
+     */
+    public static CharArrayStreamValueHandler getInstance() {
+        return _instance;
+    }
+
+    public Column[] map(ValueMapping vm, String name, ColumnIO io,
+        boolean adapt) {
+        Column col = new Column();
+        col.setName(name);
+        col.setJavaType(JavaSQLTypes.CHAR_STREAM);
+        col.setSize(-1);
+        return new Column[]{ col };
+    }
+
+    public Object toDataStoreValue(ValueMapping vm, Object val,
+        JDBCStore store) {
+        if (val == null)
+            return null;
+        char[] chars = PrimitiveWrapperArrays.toCharArray(val);
+        return new Sized(new CharArrayReader(chars), chars.length);
+    }
+
+    public Object toObjectValue(ValueMapping vm, Object val) {
+        if (val == null)
+            return null;
+
+        Reader reader = (Reader) val;
+        CharArrayWriter writer = new CharArrayWriter();
+        try {
+            for (int c; (c = reader.read()) != -1;)
+                writer.write(c);
+        } catch (IOException ioe) {
+            throw new StoreException(ioe);
+        }
+        return PrimitiveWrapperArrays.toObjectValue(vm, writer.toCharArray());
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayStreamValueHandler.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayValueHandler.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayValueHandler.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayValueHandler.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayValueHandler.java Wed Jul 19 14:34:44 2006
@@ -0,0 +1,63 @@
+/*
+ * 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.jdbc.meta.strats;
+
+import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.ValueMapping;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ColumnIO;
+import org.apache.openjpa.meta.JavaTypes;
+
+/**
+ * Handler for char array values.
+ *
+ * @nojavadoc
+ */
+public class CharArrayValueHandler
+    extends AbstractValueHandler {
+
+    private static final CharArrayValueHandler _instance =
+        new CharArrayValueHandler();
+
+    /**
+     * Singleton instance.
+     */
+    public static CharArrayValueHandler getInstance() {
+        return _instance;
+    }
+
+    public Column[] map(ValueMapping vm, String name, ColumnIO io,
+        boolean adapt) {
+        Column col = new Column();
+        col.setName(name);
+        col.setJavaType(JavaTypes.STRING);
+        return new Column[]{ col };
+    }
+
+    public Object toDataStoreValue(ValueMapping vm, Object val,
+        JDBCStore store) {
+        return (val == null) ? null
+            : String.valueOf(PrimitiveWrapperArrays.toCharArray(val));
+    }
+
+    public Object toObjectValue(ValueMapping vm, Object val) {
+        if (val == null)
+            return null;
+
+        char[] array = ((String) val).toCharArray();
+        return PrimitiveWrapperArrays.toObjectValue(vm, array);
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/CharArrayValueHandler.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java Wed Jul 19 14:34:44 2006
@@ -0,0 +1,123 @@
+/*
+ * 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.jdbc.meta.strats;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.SQLBuffer;
+import org.apache.openjpa.lib.log.Log;
+import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.meta.JavaTypes;
+
+/**
+ * Stores the class name along with each database object record.
+ *
+ * @author Abe White
+ */
+public class ClassNameDiscriminatorStrategy
+    extends InValueDiscriminatorStrategy {
+
+    private static final Localizer _loc = Localizer.forPackage
+        (ClassNameDiscriminatorStrategy.class);
+
+    public static final String ALIAS = "class-name";
+
+    public String getAlias() {
+        return ALIAS;
+    }
+
+    protected int getJavaType() {
+        return JavaTypes.STRING;
+    }
+
+    protected Object getDiscriminatorValue(ClassMapping cls) {
+        return cls.getDescribedType().getName();
+    }
+
+    protected Class getClass(Object val, JDBCStore store)
+        throws ClassNotFoundException {
+        ClassLoader loader = getClassLoader(store);
+        return Class.forName((String) val, true, loader);
+    }
+
+    public void loadSubclasses(JDBCStore store)
+        throws SQLException, ClassNotFoundException {
+        if (isFinal) {
+            disc.setSubclassesLoaded(true);
+            return;
+        }
+
+        Column col = disc.getColumns()[0];
+        DBDictionary dict = store.getDBDictionary();
+        SQLBuffer select = dict.toSelect(new SQLBuffer(dict).append(col),
+            store.getFetchConfiguration(),
+            new SQLBuffer(dict).append(col.getTable()), null, null,
+            null, null, true, false, 0, Long.MAX_VALUE);
+
+        Log log = disc.getMappingRepository().getLog();
+        if (log.isTraceEnabled())
+            log.trace(_loc.get("load-subs", col.getTable().getFullName()));
+
+        ClassLoader loader = getClassLoader(store);
+        Connection conn = store.getConnection();
+        PreparedStatement stmnt = null;
+        ResultSet rs = null;
+        try {
+            stmnt = select.prepareStatement(conn);
+            rs = stmnt.executeQuery();
+            String className;
+            while (rs.next()) {
+                className = dict.getString(rs, 1);
+                if (className == null || className.length() == 0)
+                    throw new ClassNotFoundException(_loc.get("no-class-name",
+                        disc.getClassMapping(), col));
+                Class.forName(className, true, loader);
+            }
+            disc.setSubclassesLoaded(true);
+        } finally {
+            if (rs != null)
+                try {
+                    rs.close();
+                } catch (SQLException se) {
+                }
+            if (stmnt != null)
+                try {
+                    stmnt.close();
+                } catch (SQLException se) {
+                }
+            try {
+                conn.close();
+            } catch (SQLException se) {
+            }
+        }
+    }
+
+    /**
+     * Return the class loader to use for loading class names.
+     */
+    private ClassLoader getClassLoader(JDBCStore store) {
+        return store.getConfiguration().getClassResolverInstance().
+            getClassLoader(disc.getClassMapping().getDescribedType(),
+                store.getContext().getClassLoader());
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClobValueHandler.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClobValueHandler.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClobValueHandler.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClobValueHandler.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.jdbc.meta.strats;
+
+import org.apache.openjpa.jdbc.meta.ValueMapping;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ColumnIO;
+import org.apache.openjpa.meta.JavaTypes;
+
+/**
+ * Handler for clob values.
+ *
+ * @nojavadoc
+ */
+public class ClobValueHandler
+    extends AbstractValueHandler {
+
+    private static final ClobValueHandler _instance = new ClobValueHandler();
+
+    /**
+     * Singleton instance.
+     */
+    public static ClobValueHandler getInstance() {
+        return _instance;
+    }
+
+    public Column[] map(ValueMapping vm, String name, ColumnIO io,
+        boolean adapt) {
+        Column col = new Column();
+        col.setName(name);
+        col.setJavaType(JavaTypes.STRING);
+        col.setSize(-1);
+        return new Column[]{ col };
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClobValueHandler.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java Wed Jul 19 14:34:44 2006
@@ -0,0 +1,262 @@
+/*
+ * 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.jdbc.meta.strats;
+
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.util.Comparator;
+
+import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.meta.VersionMappingInfo;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ColumnIO;
+import org.apache.openjpa.jdbc.schema.Index;
+import org.apache.openjpa.jdbc.sql.Result;
+import org.apache.openjpa.jdbc.sql.Row;
+import org.apache.openjpa.jdbc.sql.RowManager;
+import org.apache.openjpa.jdbc.sql.Select;
+import org.apache.openjpa.kernel.OpenJPAStateManager;
+import org.apache.openjpa.kernel.StoreManager;
+import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.meta.JavaTypes;
+import org.apache.openjpa.util.MetaDataException;
+
+/**
+ * Uses a single column and corresponding version object.
+ *
+ * @author Marc Prud'hommeaux
+ */
+public abstract class ColumnVersionStrategy
+    extends AbstractVersionStrategy {
+
+    private static final Localizer _loc = Localizer.forPackage
+        (ColumnVersionStrategy.class);
+
+    /**
+     * Return the code from {@link JavaTypes} for the version values this
+     * strategy uses. This method is only used during mapping installation.
+     */
+    protected abstract int getJavaType();
+
+    /**
+     * Return the next version given the current one, which may be null.
+     */
+    protected abstract Object nextVersion(Object version);
+
+    /**
+     * Compare the two versions. Defaults to assuming the version objects
+     * implement {@link Comparable}.
+     *
+     * @see Comparator#compare
+     */
+    protected int compare(Object v1, Object v2) {
+        if (v1 == v2)
+            return 0;
+        if (v1 == null)
+            return -1;
+        if (v2 == null)
+            return 1;
+
+        if (v1.getClass() != v2.getClass()) {
+            if (v1 instanceof Number && !(v1 instanceof BigDecimal))
+                v1 = new BigDecimal(((Number) v1).doubleValue());
+
+            if (v2 instanceof Number && !(v2 instanceof BigDecimal))
+                v2 = new BigDecimal(((Number) v2).doubleValue());
+        }
+
+        return ((Comparable) v1).compareTo(v2);
+    }
+
+    public void map(boolean adapt) {
+        ClassMapping cls = vers.getClassMapping();
+        if (cls.getJoinablePCSuperclassMapping() != null
+            || cls.getEmbeddingMetaData() != null)
+            throw new MetaDataException(_loc.get("not-base-vers", cls));
+
+        VersionMappingInfo info = vers.getMappingInfo();
+        info.assertNoJoin(vers, true);
+        info.assertNoForeignKey(vers, !adapt);
+        info.assertNoUnique(vers, false);
+
+        Column tmplate = new Column();
+        tmplate.setJavaType(getJavaType());
+        tmplate.setName("versn");
+
+        Column[] cols = info.getColumns(vers, new Column[]{ tmplate }, adapt);
+        vers.setColumns(cols);
+        vers.setColumnIO(info.getColumnIO());
+
+        Index idx = info.getIndex(vers, cols, adapt);
+        vers.setIndex(idx);
+    }
+
+    public void insert(OpenJPAStateManager sm, JDBCStore store, RowManager rm)
+        throws SQLException {
+        Column[] cols = vers.getColumns();
+        ColumnIO io = vers.getColumnIO();
+        Object initial = nextVersion(null);
+        Row row = rm.getRow(vers.getClassMapping().getTable(),
+            Row.ACTION_INSERT, sm, true);
+        for (int i = 0; i < cols.length; i++)
+            if (io.isInsertable(i, initial == null))
+                row.setObject(cols[i], initial);
+
+        // set initial version into state manager
+        Object nextVersion;
+        nextVersion = initial;
+        sm.setNextVersion(nextVersion);
+    }
+
+    public void update(OpenJPAStateManager sm, JDBCStore store, RowManager rm)
+        throws SQLException {
+        Column[] cols = vers.getColumns();
+        if (cols == null || cols.length == 0 ||
+            !sm.isDirty() && !sm.isVersionUpdateRequired())
+            return;
+
+        Object curVersion = sm.getVersion();
+        Object nextVersion = nextVersion(curVersion);
+
+        Row row = rm.getRow(vers.getClassMapping().getTable(),
+            Row.ACTION_UPDATE, sm, true);
+        row.setFailedObject(sm.getManagedInstance());
+
+        // set where and update conditions on row
+        for (int i = 0; i < cols.length; i++) {
+            if (curVersion != null)
+                row.whereObject(cols[i], curVersion);
+            if (vers.getColumnIO().isUpdatable(i, nextVersion == null))
+                row.setObject(cols[i], nextVersion);
+        }
+
+        if (nextVersion != null)
+            sm.setNextVersion(nextVersion);
+    }
+
+    public void delete(OpenJPAStateManager sm, JDBCStore store, RowManager rm)
+        throws SQLException {
+        Row row = rm.getRow(vers.getClassMapping().getTable(),
+            Row.ACTION_DELETE, sm, true);
+        row.setFailedObject(sm.getManagedInstance());
+        Column[] cols = vers.getColumns();
+
+        Object curVersion = sm.getVersion();
+        Object cur;
+        for (int i = 0; i < cols.length; i++) {
+            if (cols.length == 1 || curVersion == null)
+                cur = curVersion;
+            else
+                cur = ((Object[]) curVersion)[i];
+
+            // set where and update conditions on row
+            if (cur != null)
+                row.whereObject(cols[i], cur);
+        }
+    }
+
+    public boolean select(Select sel, ClassMapping mapping) {
+        sel.select(vers.getColumns());
+        return true;
+    }
+
+    public void load(OpenJPAStateManager sm, JDBCStore store, Result res)
+        throws SQLException {
+        // typically if one version column is in the result, they all are, so
+        // optimize by checking for the first one before doing any real work
+        Column[] cols = vers.getColumns();
+        if (!res.contains(cols[0]))
+            return;
+
+        Object version = null;
+        if (cols.length > 0)
+            version = new Object[cols.length];
+        Object cur;
+        for (int i = 0; i < cols.length; i++) {
+            if (i > 0 && !res.contains(cols[i]))
+                return;
+            cur = res.getObject(cols[i], -1, null);
+            if (cols.length == 1)
+                version = cur;
+            else
+                ((Object[]) version)[i] = cur;
+        }
+        sm.setVersion(version);
+    }
+
+    public boolean checkVersion(OpenJPAStateManager sm, JDBCStore store,
+        boolean updateVersion)
+        throws SQLException {
+        Column[] cols = vers.getColumns();
+        Select sel = store.getSQLFactory().newSelect();
+        sel.select(cols);
+        sel.wherePrimaryKey(sm.getObjectId(), vers.getClassMapping(), store);
+
+        Result res = sel.execute(store, null);
+        try {
+            if (!res.next())
+                return false;
+
+            Object memVersion = sm.getVersion();
+            Object dbVersion = null;
+            if (cols.length > 1)
+                dbVersion = new Object[cols.length];
+
+            boolean refresh = false;
+            Object mem, db;
+            for (int i = 0; i < cols.length; i++) {
+                db = res.getObject(cols[i], -1, null);
+                if (cols.length == 1)
+                    dbVersion = db;
+                else
+                    ((Object[]) dbVersion)[i] = db;
+
+                // if we haven't already determined that we need a refresh,
+                // check if the mem version is earlier than the db one
+                if (!refresh) {
+                    if (cols.length == 1 || memVersion == null)
+                        mem = memVersion;
+                    else
+                        mem = ((Object[]) memVersion)[i];
+
+                    if (mem == null || (db != null && compare(mem, db) < 0))
+                        refresh = true;
+                }
+            }
+
+            if (updateVersion)
+                sm.setVersion(dbVersion);
+            return !refresh;
+        } finally {
+            res.close();
+        }
+    }
+
+    public int compareVersion(Object v1, Object v2) {
+        if (v1 == v2)
+            return StoreManager.VERSION_SAME;
+        if (v1 == null || v2 == null)
+            return StoreManager.VERSION_DIFFERENT;
+
+        int cmp = compare(v1, v2);
+        if (cmp < 0)
+            return StoreManager.VERSION_EARLIER;
+        if (cmp > 0)
+            return StoreManager.VERSION_LATER;
+        return StoreManager.VERSION_SAME;
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ContainerFieldStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ContainerFieldStrategy.java?rev=423615&view=auto
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ContainerFieldStrategy.java (added)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ContainerFieldStrategy.java Wed Jul 19 14:34:44 2006
@@ -0,0 +1,124 @@
+/*
+ * 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.jdbc.meta.strats;
+
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.meta.FieldMapping;
+import org.apache.openjpa.jdbc.meta.ValueMapping;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ForeignKey;
+import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.Joins;
+import org.apache.openjpa.jdbc.sql.SQLBuffer;
+import org.apache.openjpa.jdbc.sql.Select;
+
+/**
+ * An abstract container mapping that handles traversing the
+ * join to examine the size of the relation.
+ *
+ * @author <a href="mailto:mprudhom@bea.com">Marc Prud'hommeaux</a>
+ */
+public abstract class ContainerFieldStrategy
+    extends AbstractFieldStrategy {
+
+    /**
+     * Return all independent mappings to which this strategy must join in
+     * order to access collection elements, or empty array if none.
+     *
+     * @param traverse whether we're traversing through to the related type
+     * @see ValueMapping#getIndependentTypeMappings
+     * @see ClassMapping#EMPTY_MAPPINGS
+     */
+    protected abstract ClassMapping[] getIndependentElementMappings
+        (boolean traverse);
+
+    public void appendIsEmpty(SQLBuffer sql, Select sel, Joins joins) {
+        testEmpty(sql, sel, joins, true);
+    }
+
+    public void appendIsNotEmpty(SQLBuffer sql, Select sel, Joins joins) {
+        testEmpty(sql, sel, joins, false);
+    }
+
+    public void appendIsNull(SQLBuffer sql, Select sel, Joins joins) {
+        testEmpty(sql, sel, joins, true);
+    }
+
+    public void appendIsNotNull(SQLBuffer sql, Select sel, Joins joins) {
+        testEmpty(sql, sel, joins, false);
+    }
+
+    /**
+     * Appends SQL for a sub-select testing whether the container is empty.
+     */
+    private void testEmpty(SQLBuffer sql, Select sel, Joins joins,
+        boolean empty) {
+        if (empty)
+            sql.append("0 = ");
+        else
+            sql.append("0 < ");
+
+        appendSize(sql, sel, joins);
+    }
+
+    protected abstract ForeignKey getJoinForeignKey();
+
+    public void appendSize(SQLBuffer sql, Select sel, Joins joins) {
+        DBDictionary dict = field.getMappingRepository().getDBDictionary();
+        dict.assertSupport(dict.supportsSubselect, "SupportsSubselect");
+
+        ClassMapping[] ind = getIndependentElementMappings(false);
+        if (ind != null && ind.length > 1)
+            throw RelationStrategies.unjoinable(field);
+
+        ForeignKey fk = getJoinForeignKey();
+        appendJoinCount(sql, sel, joins, dict, field, fk);
+    }
+
+    protected static void appendJoinCount(SQLBuffer sql, Select sel,
+        Joins joins, DBDictionary dict, FieldMapping field, ForeignKey fk) {
+        String fullTable = dict.getFullName(fk.getTable(), false);
+        sql.append("(SELECT COUNT(*) FROM ").append(fullTable).
+            append(" WHERE ");
+
+        Column[] cols = fk.getColumns();
+        Column[] pks = fk.getPrimaryKeyColumns();
+        int count = 0;
+        for (int i = 0; i < cols.length; i++, count++) {
+            if (count > 0)
+                sql.append(" AND ");
+            sql.append(fullTable).append(".").append(cols[i]).append(" = ").
+                append(sel.getColumnAlias(pks[i], joins));
+        }
+
+        cols = fk.getConstantColumns();
+        for (int i = 0; i < cols.length; i++, count++) {
+            if (count > 0)
+                sql.append(" AND ");
+            sql.append(fullTable).append(".").append(cols[i]).append(" = ").
+                appendValue(fk.getConstant(cols[i]), cols[i]);
+        }
+
+        pks = fk.getConstantPrimaryKeyColumns();
+        for (int i = 0; i < pks.length; i++, count++) {
+            if (count > 0)
+                sql.append(" AND ");
+            sql.append(sel.getColumnAlias(pks[i], joins)).append(" = ").
+                appendValue(fk.getPrimaryKeyConstant(pks[i]), pks[i]);
+        }
+        sql.append(")");
+    }
+}

Propchange: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ContainerFieldStrategy.java
------------------------------------------------------------------------------
    svn:executable = *