You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2006/08/12 03:17:49 UTC

svn commit: r430936 [1/5] - in /db/ojb/trunk/proposals/jdo: ./ java/ java/org/ java/org/apache/ java/org/apache/ojb/ java/org/apache/ojb/jdo/ java/org/apache/ojb/jdo/jdoql/ java/org/apache/ojb/jdo/spi/ test/ test/org/ test/org/apache/ test/org/apache/o...

Author: arminw
Date: Fri Aug 11 18:17:46 2006
New Revision: 430936

URL: http://svn.apache.org/viewvc?rev=430936&view=rev
Log:
move alpha jdo2.0 source to proposals

Added:
    db/ojb/trunk/proposals/jdo/
    db/ojb/trunk/proposals/jdo/java/
    db/ojb/trunk/proposals/jdo/java/org/
    db/ojb/trunk/proposals/jdo/java/org/apache/
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/ExtentImpl.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/JDOConstants.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerFactoryImpl.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerImpl.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/QueryImpl.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/TransactionImpl.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/ASTWithPositionInfo.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Acceptor.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/BinaryExpression.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Expression.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/FieldAccess.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Import.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLLexer.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLParser.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLParserTokenTypes.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLParserTokenTypes.txt
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLTokenTypes.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLTokenTypes.txt
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLTreeParser.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLTreeParserTokenTypes.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/JDOQLTreeParserTokenTypes.txt
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Literal.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/LocalVariable.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/LocalVariableAccess.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/MethodInvocation.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/NameExpression.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/NullLiteral.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Ordering.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/PostfixExpression.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/QueryParsingHelper.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/QueryTreeNode.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/QueryTreeResolver.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/ThisExpression.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Type.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/TypeAccess.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/UnaryExpression.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Visitor.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/VisitorBase.java
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/jdoql-ojb-lexer.g
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/jdoql-ojb-parser.g
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/jdoql-ojb-treeparser.g
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/spi/
    db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/spi/StateManagerImpl.java
    db/ojb/trunk/proposals/jdo/test/
    db/ojb/trunk/proposals/jdo/test/org/
    db/ojb/trunk/proposals/jdo/test/org/apache/
    db/ojb/trunk/proposals/jdo/test/org/apache/ojb/
    db/ojb/trunk/proposals/jdo/test/org/apache/ojb/jdo/
    db/ojb/trunk/proposals/jdo/test/org/apache/ojb/jdo/TestJDOQL.java
    db/ojb/trunk/proposals/jdo/test/org/apache/ojb/jdo/TestPersistenceManager.java
    db/ojb/trunk/proposals/jdo/test/org/apache/ojb/jdo/TestQueries.java
    db/ojb/trunk/proposals/jdo/test/org/apache/ojb/jdo/TestTransactions.java

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/ExtentImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/ExtentImpl.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/ExtentImpl.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/ExtentImpl.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,149 @@
+package org.apache.ojb.jdo;
+
+/* Copyright 2003-2004 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.
+ */
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import javax.jdo.Extent;
+import javax.jdo.PersistenceManager;
+
+import org.apache.ojb.broker.accesslayer.OJBIterator;
+import org.apache.ojb.broker.accesslayer.RsIterator;
+import org.apache.ojb.broker.metadata.ClassDescriptor;
+import org.apache.ojb.broker.query.Criteria;
+import org.apache.ojb.broker.query.QueryByCriteria;
+import org.apache.ojb.broker.query.QueryFactory;
+import org.apache.ojb.otm.OTMConnection;
+
+/**
+ * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
+ * @author <a href="mailto:brianm@apache.org">Brian McCallister</a>
+ * @version $Id: ExtentImpl.java 363720 2004-05-22 13:28:47 +0200 (Sa, 22 Mai 2004) brj $
+ */
+public class ExtentImpl implements Extent
+{
+	private Class m_clazz;
+	private OTMConnection m_conn;
+	private PersistenceManager m_pm;
+    private HashSet m_iterators = new HashSet();
+    private Criteria m_criteria;
+
+    /**
+	 * Constructor for ExtentImpl.
+     * @param subclasses is ignored
+	 */
+	public ExtentImpl(Class pClazz, OTMConnection conn, PersistenceManager pm, boolean subclasses)
+	{
+		m_clazz = pClazz;
+		m_conn = conn;
+		m_pm = pm;
+        m_criteria = new Criteria();
+	}
+
+    Class ojbGetClass()
+    {
+        return m_clazz;
+    }
+
+    /**
+     * @todo is this supposed to operate outside of a user specified tx? Right now it obtains one if needed
+     */
+	public Iterator iterator()
+	{
+        QueryByCriteria q = QueryFactory.newQuery(m_clazz, m_criteria);
+        ExtentIterator itty = new ExtentIterator((OJBIterator) m_conn.getIteratorByQuery(q));
+        m_iterators.add(itty);
+		return itty;
+	}
+
+	public boolean hasSubclasses()
+	{
+		ClassDescriptor cld = m_conn.getDescriptorFor(m_clazz);
+		return cld.isExtent();
+	}
+
+	public Class getCandidateClass()
+	{
+		return m_clazz;
+	}
+
+	public PersistenceManager getPersistenceManager()
+	{
+		return m_pm;
+	}
+
+	public void closeAll()
+	{
+		for (Iterator iterator = m_iterators.iterator(); iterator.hasNext();)
+        {
+            ExtentIterator itty = (ExtentIterator) iterator.next();
+            itty.close();
+            iterator.remove();
+        }
+	}
+
+	public void close(Iterator iterator)
+	{
+		if (iterator instanceof ExtentIterator && m_iterators.contains(iterator))
+        {
+            m_iterators.remove(iterator);
+            ((ExtentIterator)iterator).close();
+        }
+	}
+
+    private class ExtentIterator implements Iterator
+    {
+        private OJBIterator itty;
+        private boolean closed = false;
+
+        ExtentIterator(OJBIterator itty)
+        {
+            this.itty = itty;
+        }
+
+        public boolean hasNext()
+        {
+            if (closed) return false;
+            return itty.hasNext();
+        }
+
+        public Object next()
+        {
+            if (closed) throw new NoSuchElementException("Calling next() on closed JDO iterator");
+            try
+            {
+            return itty.next();
+            }
+            catch (RsIterator.ResourceClosedException e)
+            {
+                throw new NoSuchElementException("Calling next() on closed JDO iterator");
+            }
+        }
+
+        public void remove()
+        {
+            throw new UnsupportedOperationException("Operation Not Allowd");
+        }
+
+        private void close()
+        {
+            itty.releaseDbResources();
+            closed = true;
+        }
+    }
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/JDOConstants.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/JDOConstants.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/JDOConstants.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/JDOConstants.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,38 @@
+/* Copyright 2003-2004 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.ojb.jdo;
+
+/**
+ * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
+ */
+
+public interface JDOConstants
+{
+	public static final String PERSISTENCE_MANAGER_FACTORY_CLASS = "javax.jdo.PersistenceManagerFactoryClass";
+	public static final String OPTIMISTIC = "javax.jdo.option.Optimistic";
+	public static final String RETAIN_VALUES = "javax.jdo.option.RetainValues";
+	public static final String RESTORE_VALUES = "javax.jdo.option.RestoreValues";
+	public static final String IGNORE_CACHE = "javax.jdo.option.IgnoreCache";
+	public static final String NON_TRANSACTIONAL_READ = "javax.jdo.option.NontransactionalRead";
+	public static final String NON_TRANSACTIONAL_WRITE = "javax.jdo.option.NontransactionalWrite";
+	public static final String MULTI_THREADED = "javax.jdo.option.Multithreaded";
+	public static final String CONNECTION_USER_NAME = "javax.jdo.option.ConnectionUserName";
+	public static final String CONNECTION_PASSWORD = "javax.jdo.option.ConnectionPassword";
+	public static final String CONNECTION_URL = "javax.jdo.option.ConnectionURL";
+	public static final String CONNECTION_FACTORY_NAME = "javax.jdo.option.ConnectionFactoryName";
+	public static final String CONNECTION_FACTORY_2_NAME ="javax.jdo.option.ConnectionFactory2Name";
+	public static final String ALIAS ="javax.jdo.option.OjbAlias";
+
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerFactoryImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerFactoryImpl.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerFactoryImpl.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerFactoryImpl.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,409 @@
+package org.apache.ojb.jdo;
+
+/* Copyright 2003-2004 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.
+ */
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.PersistenceManagerFactory;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Properties;
+
+import org.apache.commons.lang.BooleanUtils;
+
+/**
+ * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
+ */
+
+public class PersistenceManagerFactoryImpl implements PersistenceManagerFactory
+{
+	/**
+	 * flags
+	 */
+	private boolean m_optimistic = true;
+	private boolean m_retainValues = true;
+	private boolean m_restoreValues = true;
+	private boolean m_nonTransactionalRead = true;
+	private boolean m_nonTransactionalWrite = false;
+	private boolean m_ignoreCache = true;
+	private boolean m_multiThreaded = false;
+
+	/**
+	 * pool information
+	 */
+	private int m_minPool = 1;
+	private int m_maxPool = 1;
+	private int m_msWait = 0;
+
+	/**
+	 * connection factory information
+	 */
+	private Object m_connectionFactory;
+	private String m_connectionFactoryName;
+
+	private Object m_connectionFactory2;
+	private String m_connectionFactory2Name;
+
+	private String m_connectionDriverName;
+	private String m_connectionURL;
+
+	private String m_connectionPassword;
+	private String m_connectionName;
+
+	private String m_alias;
+
+	/**
+	 * support options
+	 */
+	private final String[] m_implementedOptions = new String[]{
+		"javax.jdo.option.TransientTransactional",
+		"javax.jdo.option.NontransactionalRead",
+		"javax.jdo.option.NontransactionalWrite",
+		"javax.jdo.option.RetainValues",
+		"javax.jdo.option.RestoreValues",
+		"javax.jdo.option.Optimistic",
+		"javax.jdo.option.ApplicationIdentity",
+		"javax.jdo.option.DatastoreIdentity",
+		"javax.jdo.option.NonDatastoreIdentity",
+		"javax.jdo.option.ArrayList",
+		"javax.jdo.option.HashMap",
+		"javax.jdo.option.Hashtable",
+		"javax.jdo.option.LinkedList",
+		"javax.jdo.option.TreeMap",
+		"javax.jdo.option.TreeSet",
+		"javax.jdo.option.Vector",
+		"javax.jdo.option.Map",
+		"javax.jdo.option.List",
+		"javax.jdo.option.Array",
+		"javax.jdo.option.NullCollection",
+		"javax.jdo.query.JDOQL"
+	};
+
+	/**
+	 * properties
+	 */
+	private static Properties PROPERTIES = new Properties();
+
+	static
+	{
+		PROPERTIES.put("VendorName", "Apache ObjectRelationalBridge");
+		PROPERTIES.put("VersionNumber", "1.0");
+	}
+
+	/**
+	 * This method returns an instance of PersistenceManagerFactory based on the properties
+	 * in the parameter. It is used by JDOHelper to construct an instance of PersistenceManagerFactory
+	 * based on user-specified properties.
+	 * The following are standard key values for the Properties:
+	 * Java Data Objects1.0
+	 * javax.jdo.PersistenceManagerFactoryClass --> Ignored, we only have one and that is PersistenceManagerFactoryImpl
+	 * javax.jdo.option.Optimistic
+	 * javax.jdo.option.RetainValues
+	 * javax.jdo.option.RestoreValues
+	 * javax.jdo.option.IgnoreCache
+	 * javax.jdo.option.NontransactionalRead
+	 * javax.jdo.option.NontransactionalWrite
+	 * javax.jdo.option.Multithreaded
+	 *
+	 * javax.jdo.option.ConnectionUserName
+	 * javax.jdo.option.ConnectionPassword
+	 * javax.jdo.option.ConnectionURL
+	 * javax.jdo.option.ConnectionFactoryName
+	 * javax.jdo.option.ConnectionFactory2Name
+	 * @see JDOConstants
+	 * @param props
+	 * @return the PersistenceManagerFactory instance with the appropriate Properties.
+	 */
+	public static PersistenceManagerFactory getPersistenceManagerFactory(Properties props)
+	{
+		PersistenceManagerFactoryImpl retval = new PersistenceManagerFactoryImpl();
+		// parse and set the properties
+		// boolean props
+		retval.setOptimistic(Boolean.getBoolean(props.getProperty(JDOConstants.OPTIMISTIC, BooleanUtils.toStringTrueFalse(retval.getOptimistic()))));
+		retval.setRetainValues(Boolean.getBoolean(props.getProperty(JDOConstants.RETAIN_VALUES, BooleanUtils.toStringTrueFalse(retval.getRetainValues()))));
+		retval.setRestoreValues(Boolean.getBoolean(props.getProperty(JDOConstants.RESTORE_VALUES, BooleanUtils.toStringTrueFalse(retval.getRestoreValues()))));
+		retval.setIgnoreCache(Boolean.getBoolean(props.getProperty(JDOConstants.IGNORE_CACHE, BooleanUtils.toStringTrueFalse(retval.getIgnoreCache()))));
+		retval.setNontransactionalRead(Boolean.getBoolean(props.getProperty(JDOConstants.NON_TRANSACTIONAL_READ, BooleanUtils.toStringTrueFalse(retval.getNontransactionalRead()))));
+		retval.setMultithreaded(Boolean.getBoolean(props.getProperty(JDOConstants.MULTI_THREADED, BooleanUtils.toStringTrueFalse(retval.getMultithreaded()))));
+		retval.setOptimistic(Boolean.getBoolean(props.getProperty(JDOConstants.OPTIMISTIC, BooleanUtils.toStringTrueFalse(retval.getOptimistic()))));
+		retval.setOptimistic(Boolean.getBoolean(props.getProperty(JDOConstants.OPTIMISTIC, BooleanUtils.toStringTrueFalse(retval.getOptimistic()))));
+
+		// string props
+		retval.setConnectionUserName(props.getProperty(JDOConstants.CONNECTION_USER_NAME, retval.getConnectionUserName()));
+		retval.setConnectionPassword(props.getProperty(JDOConstants.CONNECTION_PASSWORD, null));
+		retval.setConnectionURL(props.getProperty(JDOConstants.CONNECTION_URL, retval.getConnectionURL()));
+		retval.setConnectionFactoryName(props.getProperty(JDOConstants.CONNECTION_FACTORY_NAME, retval.getConnectionFactoryName()));
+		retval.setConnectionFactory2Name(props.getProperty(JDOConstants.CONNECTION_FACTORY_2_NAME, retval.getConnectionFactory2Name()));
+		retval.setAlias(props.getProperty(JDOConstants.ALIAS, retval.getAlias()));
+		return retval;
+	}
+
+	public PersistenceManager getPersistenceManager()
+	{
+		return getPersistenceManager(null, null, null);
+	}
+
+	public PersistenceManager getPersistenceManager(String userid, String password)
+	{
+		return getPersistenceManager(null, userid, password);
+	}
+
+	public PersistenceManager getPersistenceManager(String alias, String userid, String password)
+	{
+		return new PersistenceManagerImpl(this, alias, userid, password);
+	}
+
+	public String getAlias()
+	{
+		return m_alias;
+	}
+
+	public void setAlias(String alias)
+	{
+		m_alias = alias;
+	}
+
+	public void setConnectionUserName(String s)
+	{
+		m_connectionName = s;
+	}
+
+	public String getConnectionUserName()
+	{
+		return m_connectionName;
+	}
+
+	public void setConnectionPassword(String s)
+	{
+		m_connectionPassword = s;
+	}
+
+	public void setConnectionURL(String s)
+	{
+		m_connectionURL = s;
+	}
+
+	public String getConnectionURL()
+	{
+		return m_connectionURL;
+	}
+
+	public void setConnectionDriverName(String s)
+	{
+		m_connectionDriverName = s;
+	}
+
+	public String getConnectionDriverName()
+	{
+		return m_connectionDriverName;
+	}
+
+	public void setConnectionFactoryName(String s)
+	{
+		m_connectionFactoryName = s;
+	}
+
+	public String getConnectionFactoryName()
+	{
+		return m_connectionFactoryName;
+	}
+
+	public void setConnectionFactory(Object o)
+	{
+		m_connectionFactory = o;
+	}
+
+	public Object getConnectionFactory()
+	{
+		return m_connectionFactory;
+	}
+
+	public void setConnectionFactory2Name(String s)
+	{
+		m_connectionFactory2Name = s;
+	}
+
+	public String getConnectionFactory2Name()
+	{
+		return m_connectionFactory2Name;
+	}
+
+	public void setConnectionFactory2(Object o)
+	{
+		m_connectionFactory2 = o;
+	}
+
+	public Object getConnectionFactory2()
+	{
+		return m_connectionFactory2;
+	}
+
+	public void setMultithreaded(boolean b)
+	{
+		m_multiThreaded = b;
+	}
+
+	public boolean getMultithreaded()
+	{
+		return m_multiThreaded;
+	}
+
+	public void setOptimistic(boolean b)
+	{
+		m_optimistic = b;
+	}
+
+	public boolean getOptimistic()
+	{
+		return m_optimistic;
+	}
+
+	public void setRetainValues(boolean b)
+	{
+		m_retainValues = b;
+	}
+
+	public boolean getRetainValues()
+	{
+		return m_retainValues;
+	}
+
+	public void setRestoreValues(boolean b)
+	{
+		m_restoreValues = b;
+	}
+
+	public boolean getRestoreValues()
+	{
+		return m_restoreValues;
+	}
+
+	public void setNontransactionalRead(boolean b)
+	{
+		m_nonTransactionalRead = b;
+	}
+
+	public boolean getNontransactionalRead()
+	{
+		return m_nonTransactionalRead;
+	}
+
+	public void setNontransactionalWrite(boolean b)
+	{
+		m_nonTransactionalWrite = b;
+	}
+
+	public boolean getNontransactionalWrite()
+	{
+		return m_nonTransactionalWrite;
+	}
+
+	public void setIgnoreCache(boolean b)
+	{
+		m_ignoreCache = b;
+	}
+
+	public boolean getIgnoreCache()
+	{
+		return m_ignoreCache;
+	}
+
+	public int getMaxPool()
+	{
+		return m_maxPool;
+	}
+
+	public void setMaxPool(int i)
+	{
+		m_maxPool = i;
+	}
+
+	public int getMinPool()
+	{
+		return m_minPool;
+	}
+
+	public void setMinPool(int i)
+	{
+		m_minPool = i;
+	}
+
+	public int getMsWait()
+	{
+		return m_msWait;
+	}
+
+	public void setMsWait(int i)
+	{
+		m_msWait = i;
+	}
+
+	/**
+	 * Return "static" properties of this PersistenceManagerFactory.
+	 * Properties with keys VendorName and VersionNumber are required.  Other
+	 * keys are optional.
+	 * @return the non-operational properties of this PersistenceManagerFactory.
+	 */
+	public Properties getProperties()
+	{
+		return PROPERTIES;
+	}
+
+	/** The application can determine from the results of this
+	 * method which optional features are supported by the
+	 * JDO implementation.
+	 * <P>Each supported JDO optional feature is represented by a
+	 * String with one of the following values:
+	 *
+	 * <P>javax.jdo.option.TransientTransactional
+	 * <P>javax.jdo.option.NontransactionalRead
+	 * <P>javax.jdo.option.NontransactionalWrite
+	 * <P>javax.jdo.option.RetainValues
+	 * <P>javax.jdo.option.RestoreValues
+	 * <P>javax.jdo.option.Optimistic
+	 * <P>javax.jdo.option.ApplicationIdentity
+	 * <P>javax.jdo.option.DatastoreIdentity
+	 * <P>javax.jdo.option.NonDatastoreIdentity
+	 * <P>javax.jdo.option.ArrayList
+	 * <P>javax.jdo.option.HashMap
+	 * <P>javax.jdo.option.Hashtable
+	 * <P>javax.jdo.option.LinkedList
+	 * <P>javax.jdo.option.TreeMap
+	 * <P>javax.jdo.option.TreeSet
+	 * <P>javax.jdo.option.Vector
+	 * <P>javax.jdo.option.Map
+	 * <P>javax.jdo.option.List
+	 * <P>javax.jdo.option.Array
+	 * <P>javax.jdo.option.NullCollection
+	 *
+	 *<P>The standard JDO query language is represented by a String:
+	 *<P>javax.jdo.query.JDOQL
+	 * @return the Set of String representing the supported Options
+	 */
+	public Collection supportedOptions()
+	{
+		return Collections.unmodifiableCollection(Arrays.asList(m_implementedOptions));
+	}
+	/* (non-Javadoc)
+	 * @see javax.jdo.PersistenceManagerFactory#close()
+	 */
+	public void close()
+	{
+		// TODO Auto-generated method stub
+
+	}
+
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerImpl.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerImpl.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/PersistenceManagerImpl.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,877 @@
+/* Copyright 2003-2004 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.ojb.jdo;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.jdo.Extent;
+import javax.jdo.InstanceCallbacks;
+import javax.jdo.JDOFatalUserException;
+import javax.jdo.PersistenceManager;
+import javax.jdo.PersistenceManagerFactory;
+import javax.jdo.Query;
+import javax.jdo.Transaction;
+
+import org.apache.ojb.broker.Identity;
+import org.apache.ojb.broker.OJB;
+import org.apache.ojb.broker.PBKey;
+import org.apache.ojb.broker.core.proxy.CollectionProxy;
+import org.apache.ojb.otm.EditingContext;
+import org.apache.ojb.otm.OTMConnection;
+import org.apache.ojb.otm.OTMKit;
+import org.apache.ojb.otm.kit.SimpleKit;
+import org.apache.ojb.otm.lock.LockType;
+import org.apache.ojb.otm.lock.LockingException;
+import org.apache.ojb.otm.states.State;
+
+/**
+ * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
+ * @author <a href="mailto:brianm@apache.org">Brian McCallister</a>
+ */
+
+public class PersistenceManagerImpl implements PersistenceManager
+{
+    private OTMConnection m_conn;
+    private OTMKit m_kit;
+    private boolean m_multiThreaded = false;
+    private boolean m_ignoreCache = false;
+    private PersistenceManagerFactory m_factory;
+    private String m_userID;
+    private String m_password;
+    private String m_alias;
+    private Object m_usersObject;
+    private TransactionImpl m_tx;
+    private OJB ojb;
+
+    public PersistenceManagerImpl(PersistenceManagerFactory factory, String alias, String userid, String password)
+    {
+        m_factory = factory;
+        m_userID = userid;
+        m_password = password;
+        m_alias = alias;
+        m_kit = SimpleKit.getInstance();
+
+        ojb = new OJB();
+        
+        /**
+         * if the alias is null, use the default.
+         */
+        if (null == m_alias)
+        {
+            m_conn = m_kit.acquireConnection(ojb.getDefaultConfiguration());
+        }
+        else
+        {
+            PBKey key = new PBKey(m_alias, m_userID, m_password);
+            m_conn = m_kit.acquireConnection(ojb.getConfiguration(key));
+        }
+        m_tx = new TransactionImpl(this, m_kit, m_conn);
+    }
+
+    OTMConnection getConnection()
+    {
+        return this.m_conn;
+    }
+
+    OTMKit getKit()
+    {
+        return this.m_kit;
+    }
+
+    public boolean isClosed()
+    {
+        return m_conn.isClosed();
+    }
+
+    /**
+     * Close database resources and
+     * Rollback transaction if there is one in progress
+     */
+    public void close()
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("close()"));
+        }
+        if (m_tx.isActive()) m_tx.rollback();
+        m_conn.close();
+    }
+
+    public Transaction currentTransaction()
+    {
+        return m_tx;
+    }
+
+    /**
+     * evict all persistent-clean instances from the editing context cache
+     *
+     * @param o
+     */
+    public void evict(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("evict(Object)"));
+        }
+        if (null != o)
+        {
+            try
+            {
+                Identity oid = m_conn.getIdentity(o);
+                State state = m_conn.getEditingContext().lookupState(oid);
+                /**
+                 * if the object is PersistentClean or non transactional, evict it.
+                 */
+                if (State.PERSISTENT_CLEAN == state)
+                {
+                    /**
+                     * spec says call the jdoPreClear if it's InstanceCallbacks aware
+                     */
+                    if (o instanceof InstanceCallbacks)
+                    {
+                        ((InstanceCallbacks) o).jdoPreClear();
+                    }
+                    m_conn.invalidate(m_conn.getIdentity(o));
+                    /**
+                     * set all fields to their default values
+                     */
+
+                    /**
+                     * set state to hollow
+                     */
+                }
+                if (null == state)
+                {
+                    /**
+                     * not in the editing context, evict it from the global cache
+                     */
+                    m_conn.serviceObjectCache().remove(m_conn.getIdentity(o));
+                }
+            }
+            catch (LockingException e)
+            {
+                /**
+                 * shouldn't happen, we're only dealing with persistentClean and non transactional (aka non-locked)
+                 * objects.
+                 */
+            }
+        }
+    }
+
+    public void evictAll(Object[] objects)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("evictAll(Object[])"));
+        }
+        if (null == objects)
+        {
+            throw new NullPointerException("evictAll(Object[]) was passed a null Array.");
+        }
+        int length = objects.length;
+        for (int i = 0; i < length; i++)
+        {
+            evict(objects[i]);
+        }
+    }
+
+    public void evictAll(Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("evictAll(Collection)"));
+        }
+        if (null == collection)
+        {
+            throw new NullPointerException("evictAll(Collection) was passed a null Collection.");
+        }
+        Iterator it = collection.iterator();
+        while (it.hasNext())
+        {
+            evict(it.next());
+        }
+    }
+
+    public void evictAll()
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("evictAll()"));
+        }
+        EditingContext ctx = m_conn.getEditingContext();
+        if (ctx != null)
+        {
+            for (Iterator i = ctx.getAllObjectsInContext().iterator(); i.hasNext();)
+            {
+                evict(i.next());
+            }
+        }
+        /**
+         * clear the rest of the global cache
+         */
+        m_conn.serviceObjectCache().clear();
+    }
+
+    public void refresh(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("refresh(Object)"));
+        }
+        m_conn.refresh(o);
+        if (o instanceof InstanceCallbacks)
+        {
+            ((InstanceCallbacks) o).jdoPostLoad();
+        }
+    }
+
+    public void refreshAll(Object[] objects)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("refreshAll(Object[])"));
+        }
+        if (null == objects)
+        {
+            throw new NullPointerException("refreshAll(Object[]) was passed a null Array.");
+        }
+        int length = objects.length;
+        for (int i = 0; i < length; i++)
+        {
+            refresh(objects[i]);
+        }
+    }
+
+    public void refreshAll(Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("refreshAll(Collection)"));
+        }
+        if (null == collection)
+        {
+            throw new NullPointerException("refreshAll(Collection) was passed a null Collection.");
+        }
+        Iterator it = collection.iterator();
+        while (it.hasNext())
+        {
+            refresh(it.next());
+        }
+    }
+
+    public void refreshAll()
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("refreshAll()"));
+        }
+        if (currentTransaction().isActive())
+        {
+            Collection collection = m_conn.getEditingContext().getAllObjectsInContext();
+            Iterator it = collection.iterator();
+            while (it.hasNext())
+            {
+                refresh(it.next());
+            }
+        }
+    }
+
+    public Query newQuery()
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery()"));
+        }
+
+        return new QueryImpl(this);
+    }
+
+    public Query newQuery(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery(Object)"));
+        }
+        try
+        {
+            return ((QueryImpl) o).ojbClone();
+        }
+        catch (ClassCastException e)
+        {
+            throw new IllegalArgumentException("newQuery(Object) must be passed a Query instance");
+        }
+    }
+
+    public Query newQuery(String s, Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery(String, Object)"));
+        }
+
+        throw new UnsupportedOperationException("Not yet implemented!");
+    }
+
+    public Query newQuery(Class aClass)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery(Class)"));
+        }
+        Query query = new QueryImpl(this);
+        query.setClass(aClass);
+        return query;
+    }
+
+    public Query newQuery(Extent extent)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery(Extent)"));
+        }
+
+        Query query = new QueryImpl(this);
+        query.setCandidates(extent);
+        return query;
+    }
+
+    public Query newQuery(Class aClass, Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery(Class, Collection)"));
+        }
+        Query query = new QueryImpl(this);
+        query.setCandidates(collection);
+        query.setClass(aClass);
+        return query;
+    }
+
+    public Query newQuery(Class aClass, String s)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery(Class, String)"));
+        }
+        Query query = new QueryImpl(this);
+        query.setClass(aClass);
+        query.setFilter(s);
+        return query;
+    }
+
+    public Query newQuery(Class aClass, Collection collection, String s)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery(Class, Collection, String)"));
+        }
+        Query query = new QueryImpl(this);
+        query.setCandidates(collection);
+        query.setClass(aClass);
+        query.setFilter(s);
+        return query;
+    }
+
+    public Query newQuery(Extent extent, String s)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newQuery(Extent, String)"));
+        }
+        Query query = new QueryImpl(this);
+        query.setCandidates(extent);
+        query.setFilter(s);
+        return query;
+    }
+
+    /**
+     * @param aClass top level class
+     * @param include_extent      include subclasses, presently ignored
+     * @return
+     * @todo figure out how to implement, may have to query all and filter objects
+     */
+    public Extent getExtent(Class aClass, boolean include_extent)
+    {
+        if (!include_extent) throw new UnsupportedOperationException("Not yet implemented!");
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getExtent(Class, boolean)"));
+        }
+        return new ExtentImpl(aClass, m_conn, this, include_extent);
+    }
+
+    public Object getObjectById(Object o, boolean validate)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getObjectById(Object, boolean)"));
+        }
+        Object retval = null;
+        try
+        {
+            retval = m_conn.getObjectByIdentity((Identity) o);
+        }
+        catch (LockingException e)
+        {
+            e.printStackTrace();  //To change body of catch statement use Options | File Templates.
+        }
+        catch (ClassCastException e)
+        {
+            throw new IllegalArgumentException("Object passed as id is not an id: " + o);
+        }
+        return retval;
+    }
+
+    /**
+     * @todo verify that Identity meets the requirements of the JDO spec
+     */
+    public Object getObjectId(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getObjectId(Object)"));
+        }
+        return m_conn.getIdentity(o);
+    }
+
+    public Object getTransactionalObjectId(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getTransactionalObjectId(Object)"));
+        }
+        return m_conn.getIdentity(o);
+    }
+
+    public Object newObjectIdInstance(Class aClass, String s)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("newObjectIdInstance(Class, String)"));
+        }
+        return null;
+    }
+
+    public void makePersistent(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makePersistent(Object)"));
+        }
+        try
+        {
+            m_conn.makePersistent(o);
+        }
+        catch (LockingException e)
+        {
+            // throw runtime exception
+        }
+    }
+
+    public void makePersistentAll(Object[] objects)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makePersistentAll(Object[])"));
+        }
+        if (null == objects)
+        {
+            throw new NullPointerException("makePersistentAll(Object[]) was passed a null Array.");
+        }
+        int length = objects.length;
+        for (int i = 0; i < length; i++)
+        {
+            makePersistent(objects[i]);
+        }
+    }
+
+    public void makePersistentAll(Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makePersistentAll(Collection)"));
+        }
+        if (null == collection)
+        {
+            throw new NullPointerException("makePersistentAll(Collection) was passed a null Collection.");
+        }
+        Iterator it = collection.iterator();
+        while (it.hasNext())
+        {
+            makePersistent(it.next());
+        }
+    }
+
+    public void deletePersistent(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("deletePersistent(Object)"));
+        }
+        try
+        {
+            m_conn.deletePersistent(o);
+        }
+        catch (LockingException e)
+        {
+            handleLockingException(e);
+        }
+    }
+
+    public void deletePersistentAll(Object[] objects)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("deletePersistentAll(Object[])"));
+        }
+        if (null == objects)
+        {
+            throw new NullPointerException("deletePersistentAll(Object[]) was passed a null Array.");
+        }
+        int length = objects.length;
+        for (int i = 0; i < length; i++)
+        {
+            deletePersistent(objects[i]);
+        }
+    }
+
+    public void deletePersistentAll(Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("deletePersistentAll(Collection)"));
+        }
+        if (null == collection)
+        {
+            throw new NullPointerException("deletePersistentAll(Collection) was passed a null Collection.");
+        }
+        Iterator it = collection.iterator();
+        while (it.hasNext())
+        {
+            deletePersistent(it.next());
+        }
+    }
+
+    /**
+     * Right now this makes the object non-transactional.
+     *
+     * @todo figure out what this is supposed to really do
+     */
+    public void makeTransient(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeTransient(Object)"));
+        }
+        m_conn.getEditingContext().remove(m_conn.getIdentity(o));
+        m_conn.serviceObjectCache().remove(m_conn.getIdentity(o));
+    }
+
+    public void makeTransientAll(Object[] objects)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeTransientAll(Object[])"));
+        }
+        if (null == objects)
+        {
+            throw new NullPointerException("makeTransientAll(Object[]) was passed a null Array.");
+        }
+        for (int i = 0; i < objects.length; i++)
+        {
+            this.makeTransient(objects[i]);
+        }
+    }
+
+    public void makeTransientAll(Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeTransientAll(Collection)"));
+        }
+        if (null == collection)
+        {
+            throw new NullPointerException("makeTransientAll(Collection) was passed a null Collection.");
+        }
+        for (Iterator iterator = collection.iterator(); iterator.hasNext();)
+        {
+            this.makeTransient(iterator.next());
+        }
+    }
+
+    public void makeTransactional(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeTransactional(Object)"));
+        }
+        try
+        {
+            m_conn.getEditingContext().insert(m_conn.getIdentity(o), o, LockType.READ_LOCK);
+        }
+        catch (LockingException e)
+        {
+            handleLockingException(e);
+        }
+    }
+
+    public void makeTransactionalAll(Object[] objects)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeTransactionalAll(Object[])"));
+        }
+        if (null == objects)
+        {
+            throw new NullPointerException("makeTransactionalAll(Object[]) was passed a null Array.");
+        }
+        for (int i = 0; i < objects.length; i++)
+        {
+            this.makeTransactional(objects[i]);
+        }
+    }
+
+    public void makeTransactionalAll(Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeTransactionalAll(Collection)"));
+        }
+        if (null == collection)
+        {
+            throw new NullPointerException("makeTransactionalAll(Collection) was passed a null Collection.");
+        }
+        for (Iterator iterator = collection.iterator(); iterator.hasNext();)
+        {
+            this.makeTransactional(iterator.next());
+        }
+    }
+
+    /**
+     * @todo What is the difference between this and makeTransient?
+     */
+    public void makeNontransactional(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeNontransactional(Object)"));
+        }
+        this.makeTransient(o);
+    }
+
+    public void makeNontransactionalAll(Object[] objects)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeNontransactionalAll(Object[])"));
+        }
+        if (null == objects)
+        {
+            throw new NullPointerException("makeNontransactionalAll(Object[]) was passed a null Array.");
+        }
+        for (int i = 0; i < objects.length; i++)
+        {
+            this.makeNontransactional(objects[i]);
+        }
+    }
+
+    public void makeNontransactionalAll(Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("makeNontransactionalAll(Collection)"));
+        }
+        if (null == collection)
+        {
+            throw new NullPointerException("makeNontransactionalAll(Collection) was passed a null Collection.");
+        }
+        for (Iterator iterator = collection.iterator(); iterator.hasNext();)
+        {
+            this.makeNontransactional(iterator.next());
+        }
+    }
+
+    /**
+     * Force materialization of real object
+     * @param o
+     */
+    public void retrieve(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("retrieve(Object)"));
+        }
+        ojb.getProxyFactory().getRealObject(o);
+    }
+
+    /**
+     * Force materialization of all items in collection
+     * @param collection
+     */
+    public void retrieveAll(Collection collection)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("retrieveAll(Collection)"));
+        }
+        if (null == collection)
+        {
+            throw new NullPointerException("retrieveAll(Collection) was passed a null Collection.");
+        }
+
+        /* @todo I consider this a hack as CPDI is configurable now! */
+        if (ojb.getProxyFactory().isCollectionProxy(collection))
+        {
+            CollectionProxy cp = (CollectionProxy) collection;
+            cp.load();
+        }
+    }
+
+    public void retrieveAll(Object[] objects)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("retrieveAll(Object[])"));
+        }
+        if (null == objects)
+        {
+            throw new NullPointerException("retrieveAll(Object[]) was passed a null Array.");
+        }
+        // We don't proxy arrays
+    }
+
+    public void setUserObject(Object o)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("setUserObject(Object)"));
+        }
+        m_usersObject = o;
+    }
+
+    public Object getUserObject()
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getUserObject()"));
+        }
+        return m_usersObject;
+    }
+
+    public PersistenceManagerFactory getPersistenceManagerFactory()
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getPersistenceManagerFactory()"));
+        }
+        return this.m_factory;
+    }
+
+    /**
+     * @todo This will need to change when we have a JDO compliant Identity implementation
+     */
+    public Class getObjectIdClass(Class aClass)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getObjectIdClass(Class)"));
+        }
+        return Identity.class;
+    }
+
+    public void setMultithreaded(boolean b)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("setMultithreaded(boolean)"));
+        }
+        m_multiThreaded = b;
+    }
+
+    public boolean getMultithreaded()
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getMultithreaded()"));
+        }
+        return m_multiThreaded;
+    }
+
+    public void setIgnoreCache(boolean b)
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("setIgnoreCache(boolean)"));
+        }
+        m_ignoreCache = b;
+    }
+
+    public boolean getIgnoreCache()
+    {
+        if (isClosed())
+        {
+            throw new JDOFatalUserException(generateIsClosedErrorMessage("getIgnoreCache()"));
+        }
+        return m_ignoreCache;
+    }
+
+    /**
+     * TODO i18n these messages
+     *
+     * @param methodSignature
+     * @return
+     */
+    private static final String generateIsClosedErrorMessage(String methodSignature)
+    {
+        return "PersistenceManager already closed, cannot call '" + methodSignature + "'. Obtain a new PersistenceBroker and retry.";
+    }
+
+    private void handleLockingException(LockingException e)
+    {
+        throw new UnsupportedOperationException("Not yet implemented!");
+    }
+
+    /**
+     * TODO i18n these messages
+     *
+     * @param methodSignature
+     * @param type
+     * @return
+     */
+    private static final String generateNullParameterErrorMessage(String methodSignature, String type)
+    {
+        return methodSignature + " was passed a null " + type + ".";
+    }
+
+    /**
+     * @todo what does this do?
+     * @see javax.jdo.PersistenceManager#retrieveAll(java.util.Collection, boolean)
+     */
+    public void retrieveAll(Collection arg0, boolean arg1)
+    {
+        // TODO Auto-generated method stub
+
+    }
+
+    /**
+     * @todo what does this do?
+     * @see javax.jdo.PersistenceManager#retrieveAll(java.lang.Object[], boolean)
+     */
+    public void retrieveAll(Object[] arg0, boolean arg1)
+    {
+        // TODO Auto-generated method stub
+    }
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/QueryImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/QueryImpl.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/QueryImpl.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/QueryImpl.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,387 @@
+package org.apache.ojb.jdo;
+
+/* Copyright 2003-2004 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.
+ */
+
+import javax.jdo.Extent;
+import javax.jdo.JDOUserException;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Query;
+
+import org.apache.ojb.jdo.jdoql.Expression;
+import org.apache.ojb.jdo.jdoql.LocalVariable;
+import org.apache.ojb.jdo.jdoql.QueryParsingHelper;
+import org.apache.ojb.jdo.jdoql.QueryTreeResolver;
+
+import java.util.*;
+
+/**
+ * Not Really Functional Yet:
+ * <p>
+ * Consider making this a front end for a State system where the
+ * compiled query is a different State The big list of args should/could
+ * be collected into something that knows how to compile and and
+ * apply the arguments passed at execute time.
+ * <p>
+ * Consider also, if do above, clone returns compiled query. Compiled
+ * probably needs to be able to uncompile itself if this the case,
+ * so continuing to return uncompiled may be best
+ *
+ * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
+ * @author <a href="mailto:brianm@apache.org">Brian McCallister</a>
+ * @author <a href="mailto:tomdz@apache.org">Thomas Dudziak</a>
+ */
+
+public class QueryImpl implements Query
+{
+    /** The persistence manager this query is bound to */
+    private PersistenceManagerImpl _persistenceManager;
+    /** The searched class */
+    private Class _searchedClass;
+    /** Candidate instances */
+    private Collection _candidateInstances;
+    /** The original filter string */
+    private String _filterString;
+    /** The parsed filter expression */
+    private Expression _filterExpression;
+    /** The original imports string */
+    private String _importString;
+    /** The imports */
+    private Collection _imports;
+    /** The original parameter string */
+    private String _parameterString;
+    /** The parameters */
+    private Map _parameters;
+    /** The original variables string */
+    private String _variableString;
+    /** The variables */
+    private Map _variables;
+    /** The original ordering string */
+    private String _orderingString;
+    /** The orderings */
+    private Collection _orderings;
+    /** Whether to ignore the cache while processing this query */
+    private boolean _ignoreCache;
+    /** Whether this query must be resolved and compiled first */
+    private boolean _needsCompilation = true;
+
+    /**
+     * Creates a new query that uses the given persistence manager.
+     * 
+     * @param pm The persistence manager to use
+     */
+    public QueryImpl(PersistenceManagerImpl pm)
+    {
+        _persistenceManager = pm;
+        _candidateInstances = null;
+    }
+
+    /**
+     * Returns the persistence manager that this query uses.
+     * 
+     * @return The persistence manager
+     */
+    public PersistenceManager getPersistenceManager()
+    {
+        return _persistenceManager;
+    }
+
+    /**
+     * Sets the class whose objects this query searches for.
+     * 
+     * @param searchedClass The class of the searched objects
+     */
+    public void setClass(Class searchedClass)
+    {
+        _searchedClass    = searchedClass;
+        _needsCompilation = true;
+    }
+
+    /**
+     * Returns the class of the searched objects.
+     * 
+     * @return The class of the searched objects
+     */
+    public Class getSearchedClass()
+    {
+        return _searchedClass;
+    }
+    
+    /**
+     * Simply ovewrites the setClass(..) value
+     */
+    public void setCandidates(Extent extent)
+    {
+        _searchedClass    = ((ExtentImpl)extent).ojbGetClass();
+        _needsCompilation = true;
+    }
+
+    public void setCandidates(Collection candidates)
+    {
+        _candidateInstances = candidates;
+        _needsCompilation   = true;
+    }
+
+    /**
+     * Sets the filter of this query.
+     * 
+     * @param filter The filter expression
+     */
+    public void setFilter(String filter) throws JDOUserException
+    {
+        _filterString     = filter;
+        _filterExpression = new QueryParsingHelper().parseFilter(filter);
+        _needsCompilation = true;
+    }
+
+    /**
+     * Returns the filter expression.
+     * 
+     * @return The filter expression
+     */
+    public Expression getFilterExpression()
+    {
+        return _filterExpression;
+    }
+
+    /**
+     * Specifies the classes/packages imported by this query for use in the filter
+     * and ordering expressions.
+     * 
+     * @param imports The import declarations
+     */
+    public void declareImports(String imports) throws JDOUserException
+    {
+        _importString     = imports;
+        _imports          = new QueryParsingHelper().parseImports(imports);
+        _needsCompilation = true;
+    }
+
+    /**
+     * Returns the imports of this query.
+     * 
+     * @return The imports, a collection of {@link org.apache.ojb.jdo.jdoql.Import} objects
+     */
+    public Collection getImports()
+    {
+        return _imports;
+    }
+
+    /**
+     * Sets the parameters of this query.
+     * 
+     * @param params The parameter declarations
+     */
+    public void declareParameters(String params) throws JDOUserException
+    {
+        _parameterString  = params;
+        _parameters       = new QueryParsingHelper().parseParameters(params);
+        _needsCompilation = true;
+    }
+
+    /**
+     * Returns the parameters of this query.
+     * 
+     * @return The parameters, a map of {@link org.apache.ojb.jdo.jdoql.LocalVariable} objects
+     *         indexed by their names
+     */
+    public Map getParameters()
+    {
+        return _parameters;
+    }
+
+    /**
+     * Returns the parameter of the given name if it exists.
+     * 
+     * @param name The parameter name
+     * @return The parameter
+     */
+    public LocalVariable getParameter(String name)
+    {
+        return (LocalVariable)_variables.get(name);
+    }
+
+    /**
+     * Declares the variables used in the filter expression of this query.
+     * 
+     * @param variables The variable declarations
+     */
+    public void declareVariables(String variables) throws JDOUserException
+    {
+        _variableString   = variables;
+        _variables        = new QueryParsingHelper().parseVariables(variables);
+        _needsCompilation = true;
+    }
+
+    /**
+     * Returns the variables of this query.
+     * 
+     * @return The variables, a map of {@link org.apache.ojb.jdo.jdoql.LocalVariable} objects
+     *         indexed by their names
+     */
+    public Map getVariables()
+    {
+        return _variables;
+    }
+
+    /**
+     * Returns the variable of the given name if it exists.
+     * 
+     * @param name The variable name
+     * @return The variable
+     */
+    public LocalVariable getVariable(String name)
+    {
+        return (LocalVariable)_variables.get(name);
+    }
+    
+    /**
+     * Defines the ordering of this query.
+     * 
+     * @param orderings The ordering specifications
+     */
+    public void setOrdering(String orderings) throws JDOUserException
+    {
+        _orderingString   = orderings;
+        _orderings        = new QueryParsingHelper().parseOrderings(orderings);
+        _needsCompilation = true;
+    }
+
+    /**
+     * Returns the orderings of this query.
+     * 
+     * @return The orderings, a collection of {@link org.apache.ojb.jdo.jdoql.Ordering} objects
+     */
+    public Collection getOrderings()
+    {
+        return _orderings;
+    }
+
+    /**
+     * Specifies whether the query should ignore any objects in the cache.
+     * 
+     * @param shouldIgnoreCache Whether to ignore the cache
+     */
+    public void setIgnoreCache(boolean shouldIgnoreCache)
+    {
+        _ignoreCache = shouldIgnoreCache;
+    }
+
+    /**
+     * Determines whether this query ignores objects in the cache.
+     * 
+     * @return <code>true</code> if this query ignores cached objects
+     */
+    public boolean getIgnoreCache()
+    {
+        return _ignoreCache;
+    }
+
+    /**
+     * Compiles the query. In effect this resolves the various expressions and
+     * declarations against each other, checks that they are valid, and enhances
+     * the filter and ordering expressions with executable ojb queries.
+     */
+    public void compile()
+    {
+        if (_needsCompilation)
+        {
+            // first we resolve this query 
+            new QueryTreeResolver().resolveAndCheck(this);
+            // TODO: next the filter and ordering expressions are enhanced with
+            //       actual database queries, e.g. like this:
+            // new QueryCompiler().compile(this);
+            //       which adds ojb queries to the filter expressions
+            //       (including the ordering) 
+            throw new UnsupportedOperationException("Not yet implemented");
+
+            // _needsCompilation = false;
+        }
+    }
+
+    /**
+     * Performs this query.
+     * 
+     * @return The query result
+     */
+    public Object execute()
+    {
+        if (_needsCompilation)
+        {
+            compile();
+        }
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    /**
+     * @todo implement
+     */
+    public Object execute(Object o)
+    {
+        throw new UnsupportedOperationException("Not yet implemented!");
+    }
+
+    public Object execute(Object o, Object o1)
+    {
+        throw new UnsupportedOperationException("Not yet implemented!");
+    }
+
+    public Object execute(Object o, Object o1, Object o2)
+    {
+        throw new UnsupportedOperationException("Not yet implemented!");
+    }
+
+    public Object executeWithMap(Map map)
+    {
+        throw new UnsupportedOperationException("Not yet implemented!");
+    }
+
+    public Object executeWithArray(Object[] objects)
+    {
+        throw new UnsupportedOperationException("Not yet implemented!");
+    }
+
+    /**
+     * @param o is a Collection returned from execute()
+     */
+    public void close(Object o)
+    {
+    }
+
+    public void closeAll()
+    {
+    }
+
+    /**
+     * Creates an uncompiled deep clone of this query.
+     * 
+     * @return The clone
+     */
+    QueryImpl ojbClone()
+    {
+        QueryImpl query = new QueryImpl(_persistenceManager);
+
+        query.setClass(_searchedClass);
+        query.setCandidates(_candidateInstances);
+        query.declareImports(_importString);
+        query.declareParameters(_parameterString);
+        query.declareVariables(_variableString);
+        query.setFilter(_filterString);
+        query.setOrdering(_orderingString);
+
+        return query;
+    }
+
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/TransactionImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/TransactionImpl.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/TransactionImpl.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/TransactionImpl.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,163 @@
+
+/* Copyright 2003-2004 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.ojb.jdo;
+
+import org.apache.ojb.otm.OTMKit;
+import org.apache.ojb.otm.OTMConnection;
+
+import javax.jdo.Transaction;
+import javax.jdo.PersistenceManager;
+import javax.jdo.JDOUserException;
+import javax.jdo.JDOUnsupportedOptionException;
+import javax.transaction.Synchronization;
+
+/**
+ * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
+ * @author <a href="mailto:brianm@apache.org">Brian McCallister</a>
+ */
+
+public class TransactionImpl implements Transaction
+{
+	private PersistenceManager m_pm;
+    private OTMKit m_kit;
+    private OTMConnection m_conn;
+
+	public TransactionImpl(PersistenceManager pm, OTMKit kit, OTMConnection conn)
+	{
+		m_pm = pm;
+        m_conn = conn;
+        m_kit = kit;
+	}
+
+	public void begin()
+	{
+        if (m_kit.getTransaction(m_conn).isInProgress())
+        {
+            throw new JDOUserException("Transaction already in progress");
+        }
+        m_kit.getTransaction(m_conn).begin();
+	}
+
+	public void commit()
+	{
+        if (!m_kit.getTransaction(m_conn).isInProgress())
+        {
+            throw new JDOUserException("Transaction not in progress");
+        }
+        m_kit.getTransaction(m_conn).commit();
+	}
+
+	public void rollback()
+	{
+		if (!m_kit.getTransaction(m_conn).isInProgress())
+        {
+            throw new JDOUserException("Transaction not in progress");
+        }
+        m_kit.getTransaction(m_conn).rollback();
+	}
+
+	public boolean isActive()
+	{
+		return m_kit.getTransaction(m_conn).isInProgress();
+	}
+
+	public void setNontransactionalRead(boolean b)
+	{
+        throw new javax.jdo.JDOUnsupportedOptionException("Unsupported");
+	}
+
+	public boolean getNontransactionalRead()
+	{
+		return false;
+	}
+
+	public void setNontransactionalWrite(boolean b)
+	{
+        throw new javax.jdo.JDOUnsupportedOptionException("Unsupported");
+	}
+
+	public boolean getNontransactionalWrite()
+	{
+		return false;
+	}
+
+    /**
+     * @todo figure out what to do if someone doesn't want this!
+     */
+	public void setRetainValues(boolean b)
+	{
+        // umh, this is always true.
+	}
+
+	public boolean getRetainValues()
+	{
+		return true;
+	}
+
+    /**
+     * @todo implement
+     */
+	public void setRestoreValues(boolean b)
+	{
+        throw new JDOUnsupportedOptionException("Not Yet Implemented");
+	}
+
+    /**
+     * @todo implement
+     */
+	public boolean getRestoreValues()
+	{
+		return false;
+	}
+
+    /**
+     * @todo implement
+     */
+	public void setOptimistic(boolean b)
+	{
+        throw new JDOUnsupportedOptionException("Not yet implemented");
+	}
+
+    /**
+     * @todo implement
+     */
+	public boolean getOptimistic()
+	{
+		return false;
+	}
+
+    /**
+     * @todo figure out how to implement
+     * @param synchronization
+     */
+	public void setSynchronization(Synchronization synchronization)
+	{
+        throw new JDOUnsupportedOptionException("Not Yet Implemented");
+	}
+
+    /**
+     * @todo figure out how to implement
+     */
+	public Synchronization getSynchronization()
+	{
+		throw new JDOUnsupportedOptionException("Not Yet Implemented");
+	}
+
+	public PersistenceManager getPersistenceManager()
+	{
+		return m_pm;
+	}
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/ASTWithPositionInfo.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/ASTWithPositionInfo.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/ASTWithPositionInfo.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/ASTWithPositionInfo.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,119 @@
+package org.apache.ojb.jdo.jdoql;
+
+/* Copyright 2003-2004 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.
+ */
+
+import antlr.CommonAST;
+import antlr.Token;
+import antlr.collections.AST;
+
+/**
+ * An AST node that also contains position info (for error handling).
+ * 
+ * @author <a href="mailto:tomdz@apache.org">Thomas Dudziak</a>
+ */
+public class ASTWithPositionInfo extends CommonAST
+{
+    /** The line where the source of this node started. */
+    private int _line   = 0;
+    /** The column where the source of this node started. */
+    private int _column = 0;
+
+    /**
+     * Creates a new node.
+     */
+    public ASTWithPositionInfo()
+    {
+        super();
+    }
+
+    /**
+     * Creates a new node for the given token.
+     * 
+     * @param tok The token
+     */
+    public ASTWithPositionInfo(Token tok)
+    {
+        super(tok);
+    }
+
+    /**
+     * Returns the column where the source of this node started.
+     * 
+     * @return The column
+     * @see antlr.collections.AST#getColumn()
+     */
+    public int getColumn()
+    {
+        return _column;
+    }
+
+    /**
+     * Returns the line where the source of this node started.
+     * 
+     * @return The line
+     * @see antlr.collections.AST#getLine()
+     */
+    public int getLine()
+    {
+        return _line;
+    }
+
+    /* (non-Javadoc)
+     * @see antlr.collections.AST#initialize(antlr.collections.AST)
+     */
+    public void initialize(AST ast)
+    {
+        super.initialize(ast);
+        _line   = ast.getLine();
+        _column = ast.getColumn();
+    }
+
+    /* (non-Javadoc)
+     * @see antlr.collections.AST#initialize(antlr.Token)
+     */
+    public void initialize(Token tok)
+    {
+        super.initialize(tok);
+        _line   = tok.getLine();
+        _column = tok.getColumn();
+    }
+
+    /* (non-Javadoc)
+     * @see antlr.collections.AST#addChild(antlr.collections.AST)
+     */
+    public void addChild(AST ast)
+    {
+        if ((ast != null) && (down == null) && (_line == 0) && (_column == 0))
+        {
+            _line   = ast.getLine();
+            _column = ast.getColumn();
+        }
+        super.addChild(ast);
+    }
+
+    /* (non-Javadoc)
+     * @see antlr.collections.AST#setFirstChild(antlr.collections.AST)
+     */
+    public void setFirstChild(AST ast)
+    {
+        if ((ast != null) && (_line == 0) && (_column == 0))
+        {
+            _line   = ast.getLine();
+            _column = ast.getColumn();
+        }
+        super.setFirstChild(ast);
+    }
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Acceptor.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Acceptor.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Acceptor.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Acceptor.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,26 @@
+package org.apache.ojb.jdo.jdoql;
+
+/* Copyright 2003-2004 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.
+ */
+
+/**
+ * Denotes types that accept a visitor object.
+ * 
+ * @author <a href="mailto:tomdz@apache.org">Thomas Dudziak</a>
+ */
+public interface Acceptor
+{
+    void accept(Visitor visitor);
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/BinaryExpression.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/BinaryExpression.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/BinaryExpression.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/BinaryExpression.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,201 @@
+package org.apache.ojb.jdo.jdoql;
+
+/* Copyright 2003-2004 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.
+ */
+
+/**
+ * A binary expression (arithmetic or logical).
+ * 
+ * @author <a href="mailto:tomdz@apache.org">Thomas Dudziak</a>
+ */
+public class BinaryExpression extends Expression
+{
+    public static final int OPERATOR_MULTIPLY        = 0;
+    public static final int OPERATOR_DIVIDE          = 1;
+    public static final int OPERATOR_PLUS            = 2;
+    public static final int OPERATOR_MINUS           = 3;
+    public static final int OPERATOR_LOWER           = 4;
+    public static final int OPERATOR_GREATER         = 5;
+    public static final int OPERATOR_LOWER_OR_EQUAL  = 6;
+    public static final int OPERATOR_GREATER_OR_EQUAL = 7;
+    public static final int OPERATOR_EQUAL           = 8;
+    public static final int OPERATOR_NOT_EQUAL       = 9;
+    public static final int OPERATOR_BITWISE_AND     = 10;
+    public static final int OPERATOR_BITWISE_XOR     = 11;
+    public static final int OPERATOR_BITWISE_OR      = 12;
+    public static final int OPERATOR_AND             = 13;
+    public static final int OPERATOR_OR              = 14;
+
+    /** The left side expression */
+    private Expression _left;
+    /** The binary operator (one of the above constants) */
+    private int        _operator;
+    /** The right side expression */
+    private Expression _right;
+    /** The type of this expression */
+    private Class      _type;
+
+    /**
+     * Creates a new binary expression object.
+     * 
+     * @param left     The left side of the expression
+     * @param operator The binary operator
+     * @param right    The right side of the expression
+     */
+    public BinaryExpression(Expression left, int operator, Expression right)
+    {
+        _left     = left;
+        _operator = operator;
+        _right    = right;
+    }
+
+    /**
+     * Returns the left side expression.
+     * 
+     * @return The left expression 
+     */
+    public Expression getLeftSide()
+    {
+        return _left;
+    }
+
+    /**
+     * Returns the operator.
+     * 
+     * @return The operator
+     */
+    public int getOperator()
+    {
+        return _operator;
+    }
+
+    /**
+     * Returns the right side expression.
+     * 
+     * @return The right expression 
+     */
+    public Expression getRightSide()
+    {
+        return _right;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.ojb.jdo.jdoql.Expression#replaceChild(org.apache.ojb.jdo.jdoql.Expression, org.apache.ojb.jdo.jdoql.Expression)
+     */
+    public void replaceChild(Expression oldChild, Expression newChild)
+    {
+        if (oldChild == _left)
+        {
+            _left.setParent(null);
+            _left = newChild;
+            _left.setParent(this);
+        }
+        else if (oldChild == _right)
+        {
+            _right.setParent(null);
+            _right = newChild;
+            _right.setParent(this);
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.ojb.jdo.jdoql.Acceptor#accept(org.apache.ojb.jdo.jdoql.Visitor)
+     */
+    public void accept(Visitor visitor)
+    {
+        visitor.visit(this);
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        StringBuffer result = new StringBuffer();
+
+        result.append("(");
+        result.append(_left.toString());
+        result.append(" ");
+        switch (_operator)
+        {
+            case OPERATOR_MULTIPLY :
+                result.append("* ");
+                break;
+            case OPERATOR_DIVIDE :
+                result.append("/ ");
+                break;
+            case OPERATOR_PLUS :
+                result.append("+ ");
+                break;
+            case OPERATOR_MINUS :
+                result.append("- ");
+                break;
+            case OPERATOR_LOWER :
+                result.append("< ");
+                break;
+            case OPERATOR_GREATER :
+                result.append("> ");
+                break;
+            case OPERATOR_LOWER_OR_EQUAL :
+                result.append("<= ");
+                break;
+            case OPERATOR_GREATER_OR_EQUAL :
+                result.append(">= ");
+                break;
+            case OPERATOR_EQUAL :
+                result.append("== ");
+                break;
+            case OPERATOR_NOT_EQUAL :
+                result.append("!= ");
+                break;
+            case OPERATOR_BITWISE_AND :
+                result.append("& ");
+                break;
+            case OPERATOR_BITWISE_XOR :
+                result.append("^ ");
+                break;
+            case OPERATOR_BITWISE_OR :
+                result.append("| ");
+                break;
+            case OPERATOR_AND :
+                result.append("&& ");
+                break;
+            case OPERATOR_OR :
+                result.append("|| ");
+                break;
+        }
+        result.append(_right.toString());
+        result.append(")");
+        return result.toString();
+    }
+
+    /**
+     * Sets the type of this binary expression.
+     * 
+     * @param type The type
+     */
+    public void setType(Class type)
+    {
+        _type = type;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.ojb.jdo.jdoql.Expression#getType()
+     */
+    public Class getType()
+    {
+        return _type;
+    }
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Expression.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Expression.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Expression.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Expression.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,80 @@
+package org.apache.ojb.jdo.jdoql;
+
+/* Copyright 2003-2004 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.
+ */
+
+/**
+ * Common base class for all JDOQL expressions.
+ * 
+ * @author <a href="mailto:tomdz@apache.org">Thomas Dudziak</a>
+ */
+public abstract class Expression extends QueryTreeNode
+{
+    /** The parent expression if any */
+    private Expression _parent;
+
+    /**
+     * Determines whether this expression has a parent expression
+     * (i.e. an expression where this expression is an inner or base expression).
+     * 
+     * @return <code>true</code> if this expression has a parent expression
+     */
+    public boolean hasParent()
+    {
+        return _parent != null;
+    }
+
+    /**
+     * Returns the parent expression of this expression if it exists.
+     * 
+     * @return The parent expression or <code>null</code> if this expression
+     *         has no parent
+     */
+    public Expression getParent()
+    {
+        return _parent;
+    }
+
+    /**
+     * Sets the parent expression of this expression. Note that this method
+     * does not remove this expression from the parent.
+     * 
+     * @param parent The new parent expression
+     */
+    public void setParent(Expression parent)
+    {
+        _parent = parent;
+    }
+
+    /**
+     * Replaces the given old child expression with the new one. This also sets this
+     * expression as the parent of the new child and removes it from the old child.
+     * 
+     * @param oldChild The old child to be replaced
+     * @param newChild The new child
+     */
+    public void replaceChild(Expression oldChild, Expression newChild)
+    {}
+
+    /**
+     * Returns the type of this expression. Note that in the case of primitives, 
+     * the type only declares the general kind, not the actual data type. For instance,
+     * a literal of type {@link Long} can be a <code>byte</code>, <code>short</code>,
+     * <code>int</code>, <code>long</code>, or {@link java.math.BigInteger} value.
+     * 
+     * @return The type
+     */
+    public abstract Class getType();
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/FieldAccess.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/FieldAccess.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/FieldAccess.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/FieldAccess.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,86 @@
+package org.apache.ojb.jdo.jdoql;
+
+/* Copyright 2003-2004 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.
+ */
+
+import org.apache.ojb.broker.metadata.*;
+
+/**
+ * A field access expression. Note that this expression type can only be
+ * present in a query tree after resolving it.
+ * 
+ * @author <a href="mailto:tomdz@apache.org">Thomas Dudziak</a>
+ */
+public class FieldAccess extends NameExpression
+{
+    /** The descriptor for the accessed field, either a field or a reference descriptor */
+    private AttributeDescriptorBase _descriptor;
+
+    /**
+     * Creates a new field access object.
+     * 
+     * @param base The base expression (can be <code>null</code>)
+     * @param name The field's name
+     */
+    public FieldAccess(Expression base, String name)
+    {
+        super(base, name);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.ojb.jdo.jdoql.Acceptor#accept(org.apache.ojb.jdo.jdoql.Visitor)
+     */
+    public void accept(Visitor visitor)
+    {
+        visitor.visit(this);
+    }
+
+    /**
+     * Sets the descriptor of the field accessed by this field access expression.
+     * Must be either a reference or a field descriptor.
+     *  
+     * @param descriptor The descriptor of the field
+     */
+    public void setFieldDescriptor(AttributeDescriptorBase descriptor)
+    {
+        _descriptor = descriptor;
+    }
+
+    /**
+     * Returns the descriptor of the field accessed by this field access expression.
+     * 
+     * @return The descriptor which is either a reference or field descriptor
+     */
+    public AttributeDescriptorBase getFieldDescriptor()
+    {
+        return _descriptor;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.ojb.jdo.jdoql.Expression#getType()
+     */
+    public Class getType()
+    {
+        if (_descriptor instanceof FieldDescriptor)
+        {
+            return ((FieldDescriptor)_descriptor).getPersistentField().getType();
+        }
+        else
+        {
+            // this also covers collections
+            return ((ObjectReferenceDescriptor)_descriptor).getItemClass();
+        }
+    }
+}

Added: db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Import.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Import.java?rev=430936&view=auto
==============================================================================
--- db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Import.java (added)
+++ db/ojb/trunk/proposals/jdo/java/org/apache/ojb/jdo/jdoql/Import.java Fri Aug 11 18:17:46 2006
@@ -0,0 +1,80 @@
+package org.apache.ojb.jdo.jdoql;
+
+/* Copyright 2003-2004 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.
+ */
+
+/**
+ * Represents a direct or on-demand import within a JDOQL query.
+ * 
+ * @author <a href="mailto:tomdz@apache.org">Thomas Dudziak</a>
+ */
+public class Import extends QueryTreeNode
+{
+    /** The import spec, either a fully qualified class name or a qualified package name */
+    private String _spec;
+    /** Whether this import is direct (class) or on-demand (package) */
+    private boolean _isOnDemand;
+    /** If an direct import, this is the resolved class */
+    private Class   _importedClass;
+
+    /**
+     * Creates a new import object.
+     * 
+     * @param spec       The import spec
+     * @param isOnDemand Whether the import is on-demand or direct
+     */
+    public Import(String spec, boolean isOnDemand)
+    {
+        _spec       = spec;
+        _isOnDemand = isOnDemand;
+    }
+
+    /**
+     * Returns whether this import is direct (class) or on-demand (package).
+     * 
+     * @return <code>true</code> if this import is on-demand
+     */
+    public boolean isOnDemand()
+    {
+        return _isOnDemand;
+    }
+
+    /**
+     * Returns the import spec which is either a fully qualified class name or
+     * a package.
+     * 
+     * @return The spec
+     */
+    public String getSpec()
+    {
+        return _spec;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.ojb.jdo.jdoql.Acceptor#accept(org.apache.ojb.jdo.jdoql.Visitor)
+     */
+    public void accept(Visitor visitor)
+    {
+        visitor.visit(this);
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        return _isOnDemand ? _spec + ".*" : _spec;
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org