/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License.
 */

public interface javax.jdo.Constants {
    static String JAVAX_JDO = "javax.jdo";
    static String JAVAX_JDO_PREFIX = "javax.jdo.";
    static String SERVICE_LOOKUP_PMF_RESOURCE_NAME
        = "META-INF/services/javax.jdo.PersistenceManagerFactory";
    static String SERVICE_LOOKUP_ENHANCER_RESOURCE_NAME
        = "META-INF/services/javax.jdo.JDOEnhancer";
    static String JDOCONFIG_RESOURCE_NAME
        = "META-INF/jdoconfig.xml";
    static String JDOCONFIG_XSD_NS
        = "https://db.apache.org/jdo/xmlns/jdoconfig";
    static String JDO_XSD_NS
        = "https://db.apache.org/jdo/xmlns/jdo";
    static String ORM_XSD_NS
        = "https://db.apache.org/jdo/xmlns/orm";
    static String JDOQUERY_XSD_NS
        = "https://db.apache.org/jdo/xmlns/jdoquery";
    static String ELEMENT_PERSISTENCE_MANAGER_FACTORY
        = "persistence-manager-factory";
    static String PMF_ATTRIBUTE_CLASS
        = "class";
    static String PMF_ATTRIBUTE_NAME
        = "name";
    static String PMF_ATTRIBUTE_PERSISTENCE_UNIT_NAME
        = "persistence-unit-name";
    static String PMF_ATTRIBUTE_OPTIMISTIC
        = "optimistic";
    static String PMF_ATTRIBUTE_READONLY
        = "readonly";
    static String PMF_ATTRIBUTE_RETAIN_VALUES
        = "retain-values";
    static String PMF_ATTRIBUTE_RESTORE_VALUES
        = "restore-values";
    static String PMF_ATTRIBUTE_IGNORE_CACHE
        = "ignore-cache";
    static String PMF_ATTRIBUTE_NONTRANSACTIONAL_READ
        = "nontransactional-read";
    static String PMF_ATTRIBUTE_NONTRANSACTIONAL_WRITE
        = "nontransactional-write";
    static String PMF_ATTRIBUTE_MULTITHREADED
        = "multithreaded";
    static String PMF_ATTRIBUTE_CONNECTION_DRIVER_NAME
        = "connection-driver-name";
    static String PMF_ATTRIBUTE_CONNECTION_USER_NAME
        = "connection-user-name";
    static String PMF_ATTRIBUTE_CONNECTION_PASSWORD
        = "connection-password";
    static String PMF_ATTRIBUTE_CONNECTION_URL
        = "connection-url";
    static String PMF_ATTRIBUTE_CONNECTION_FACTORY_NAME
        = "connection-factory-name";
    static String PMF_ATTRIBUTE_CONNECTION_FACTORY2_NAME
        = "connection-factory2-name";
    static String PMF_ATTRIBUTE_DETACH_ALL_ON_COMMIT
        = "detach-all-on-commit";
    static String PMF_ATTRIBUTE_COPY_ON_ATTACH
        = "copy-on-attach";
    static String PMF_ATTRIBUTE_MAPPING
        = "mapping";
    static String PMF_ATTRIBUTE_SERVER_TIME_ZONE_ID
        = "server-time-zone-id";
    static String PMF_ATTRIBUTE_DATASTORE_READ_TIMEOUT_MILLIS
        = "datastore-read-timeout-millis";
    static String PMF_ATTRIBUTE_DATASTORE_WRITE_TIMEOUT_MILLIS
        = "datastore-write-timeout-millis";
    static String ELEMENT_PROPERTY
        = "property";
    static String PROPERTY_ATTRIBUTE_NAME
        = "name";
    static String PROPERTY_ATTRIBUTE_VALUE
        = "value";
    static String ELEMENT_INSTANCE_LIFECYCLE_LISTENER
        = "instance-lifecycle-listener";
    static String INSTANCE_LIFECYCLE_LISTENER_ATTRIBUTE_LISTENER
        = "listener";
    static String INSTANCE_LIFECYCLE_LISTENER_ATTRIBUTE_CLASSES
        = "classes";
    static String OPTION_TRANSACTIONAL_TRANSIENT
        = "javax.jdo.option.TransientTransactional";
    static String OPTION_NONTRANSACTIONAL_READ
        = "javax.jdo.option.NontransactionalRead";
    static String OPTION_NONTRANSACTIONAL_WRITE
        = "javax.jdo.option.NontransactionalWrite";
    static String OPTION_RETAIN_VALUES
        = "javax.jdo.option.RetainValues";
    static String OPTION_OPTIMISTIC
        = "javax.jdo.option.Optimistic";
    static String OPTION_APPLICATION_IDENTITY
        = "javax.jdo.option.ApplicationIdentity";
    static String OPTION_DATASTORE_IDENTITY
        = "javax.jdo.option.DatastoreIdentity";
    static String OPTION_NONDURABLE_IDENTITY
        = "javax.jdo.option.NonDurableIdentity";
    static String OPTION_ARRAYLIST
        = "javax.jdo.option.ArrayList";
    static String OPTION_LINKEDLIST
        = "javax.jdo.option.LinkedList";
    static String OPTION_TREEMAP
        = "javax.jdo.option.TreeMap";
    static String OPTION_TREESET
        = "javax.jdo.option.TreeSet";
    static String OPTION_VECTOR
        = "javax.jdo.option.Vector";
    static String OPTION_ARRAY
        = "javax.jdo.option.Array";
    static String OPTION_NULL_COLLECTION
        = "javax.jdo.option.NullCollection";
    static String OPTION_CHANGE_APPLICATION_IDENTITY
        = "javax.jdo.option.ChangeApplicationIdentity";
    static String OPTION_BINARY_COMPATIBILITY
        = "javax.jdo.option.BinaryCompatibility";
    static String OPTION_GET_DATASTORE_CONNECTION
        = "javax.jdo.option.GetDataStoreConnection";
    static String OPTION_GET_JDBC_CONNECTION
        = "javax.jdo.option.GetJDBCConnection";
    static String OPTION_DATASTORE_TIMEOUT
        = "javax.jdo.option.DatastoreTimeout";
    static String OPTION_QUERY_SQL
        = "javax.jdo.query.SQL";
    static String OPTION_QUERY_CANCEL
        = "javax.jdo.option.QueryCancel";
    static String OPTION_UNCONSTRAINED_QUERY_VARIABLES
        = "javax.jdo.query.JDOQL.UnconstrainedQueryVariables";
    static String OPTION_QUERY_JDOQL_BITWISE_OPERATIONS
        = "javax.jdo.query.JDOQL.BitwiseOperations";
    static String OPTION_VERSION_DATETIME
        = "javax.jdo.option.version.DateTime";
    static String OPTION_VERSION_STATE_IMAGE
        = "javax.jdo.option.version.StateImage";
    static String OPTION_PREDIRTY_EVENT
        = "javax.jdo.option.PreDirtyEvent";
    static String OPTION_MAPPING_HETEROGENEOUS_OBJECT_TYPE
        = "javax.jdo.option.mapping.HeterogeneousObjectType";
    static String OPTION_MAPPING_HETEROGENEOUS_INTERFACE_TYPE
        = "javax.jdo.option.mapping.HeterogeneousInterfaceType";
    static String OPTION_MAPPING_JOINED_TABLE_PER_CLASS
        = "javax.jdo.option.mapping.JoinedTablePerClass";
    static String OPTION_MAPPING_JOINED_TABLE_PER_CONCRETE_CLASS
        = "javax.jdo.option.mapping.JoinedTablePerConcreteClass";
    static String OPTION_MAPPING_NON_JOINED_TABLE_PER_CONCRETE_CLASS
        = "javax.jdo.option.mapping.NonJoinedTablePerConcreteClass";
    static String OPTION_MAPPING_RELATION_SUBCLASS_TABLE
        = "javax.jdo.option.mapping.RelationSubclassTable";
    static String PROPERTY_PERSISTENCE_MANAGER_FACTORY_CLASS
        = "javax.jdo.PersistenceManagerFactoryClass";
    static String PROPERTY_OPTIMISTIC
        = "javax.jdo.option.Optimistic";
    static String PROPERTY_READONLY
        = "javax.jdo.option.ReadOnly";
    static String PROPERTY_RETAIN_VALUES
        = "javax.jdo.option.RetainValues";
    static String PROPERTY_RESTORE_VALUES
        = "javax.jdo.option.RestoreValues";
    static String PROPERTY_IGNORE_CACHE
        = "javax.jdo.option.IgnoreCache";
    static String PROPERTY_NONTRANSACTIONAL_READ
        = "javax.jdo.option.NontransactionalRead";
    static String PROPERTY_NONTRANSACTIONAL_WRITE
        = "javax.jdo.option.NontransactionalWrite";
    static String PROPERTY_MULTITHREADED
        = "javax.jdo.option.Multithreaded";
    static String PROPERTY_TRANSACTION_ISOLATION_LEVEL
        = "javax.jdo.option.TransactionIsolationLevel";
    static String PROPERTY_TRANSACTION_ISOLATION_LEVEL_READ_UNCOMMITTED
        = "javax.jdo.option.TransactionIsolationLevel.read-uncommitted";
    static String PROPERTY_TRANSACTION_ISOLATION_LEVEL_READ_COMMITTED
        = "javax.jdo.option.TransactionIsolationLevel.read-committed";
    static String PROPERTY_TRANSACTION_ISOLATION_LEVEL_REPEATABLE_READ
        = "javax.jdo.option.TransactionIsolationLevel.repeatable-read";
    static String PROPERTY_TRANSACTION_ISOLATION_LEVEL_SNAPSHOT
        = "javax.jdo.option.TransactionIsolationLevel.snapshot";
    static String PROPERTY_TRANSACTION_ISOLATION_LEVEL_SERIALIZABLE
        = "javax.jdo.option.TransactionIsolationLevel.serializable";
    static String PROPERTY_DETACH_ALL_ON_COMMIT
        = "javax.jdo.option.DetachAllOnCommit";
    static String PROPERTY_COPY_ON_ATTACH
        = "javax.jdo.option.CopyOnAttach";
    static String PROPERTY_CONNECTION_DRIVER_NAME
        = "javax.jdo.option.ConnectionDriverName";
    static String PROPERTY_CONNECTION_USER_NAME
        = "javax.jdo.option.ConnectionUserName";
    static String PROPERTY_CONNECTION_PASSWORD
        = "javax.jdo.option.ConnectionPassword";
    static String PROPERTY_CONNECTION_URL
        = "javax.jdo.option.ConnectionURL";
    static String PROPERTY_CONNECTION_FACTORY_NAME
        = "javax.jdo.option.ConnectionFactoryName";
    static String PROPERTY_CONNECTION_FACTORY2_NAME
        = "javax.jdo.option.ConnectionFactory2Name";
    static String PROPERTY_MAPPING
        = "javax.jdo.option.Mapping";
    static String PROPERTY_NAME
        = "javax.jdo.option.Name";
    static String PROPERTY_SPI_PROPERTIES_FILE_NAME
        = "javax.jdo.spi.PropertiesFileName";
    static String PROPERTY_SPI_RESOURCE_NAME
        = "javax.jdo.option.spi.ResourceName";
    static String PROPERTY_PERSISTENCE_UNIT_NAME
        = "javax.jdo.option.PersistenceUnitName";
    static String PROPERTY_INSTANCE_LIFECYCLE_LISTENER
        = "javax.jdo.listener.InstanceLifecycleListener";
    static String PROPERTY_PREFIX_INSTANCE_LIFECYCLE_LISTENER
        = "javax.jdo.listener.InstanceLifecycleListener.";
    static String PROPERTY_MAPPING_CATALOG
        = "javax.jdo.mapping.Catalog";
    static String PROPERTY_MAPPING_SCHEMA
        = "javax.jdo.mapping.Schema";
    static String PROPERTY_SERVER_TIME_ZONE_ID
        = "javax.jdo.option.ServerTimeZoneID";
    static String PROPERTY_DATASTORE_READ_TIMEOUT_MILLIS
        = "javax.jdo.option.DatastoreReadTimeoutMillis";
    static String PROPERTY_DATASTORE_WRITE_TIMEOUT_MILLIS
        = "javax.jdo.option.DatastoreWriteTimeoutMillis";
    static String NONCONFIGURABLE_PROPERTY_VENDOR_NAME
        = "VendorName";
    static String NONCONFIGURABLE_PROPERTY_VERSION_NUMBER
        = "VersionNumber";
    static String JTA
        = "JTA";
    static String RESOURCE_LOCAL
        = "RESOURCE_LOCAL";
    static String JDOCONFIG_DTD_RESOURCE
        = "javax/jdo/jdoconfig_3_0.dtd";
    static String JDOCONFIG_XSD_RESOURCE
        = "javax/jdo/jdoconfig_3_0.xsd";
    static String JDO_DTD_RESOURCE
        = "javax/jdo/jdo_3_0.dtd";
    static String JDO_XSD_RESOURCE
        = "javax/jdo/jdo_3_0.xsd";
    static String ORM_DTD_RESOURCE
        = "javax/jdo/orm_3_0.dtd";
    static String ORM_XSD_RESOURCE
        = "javax/jdo/orm_3_0.xsd";
    static String JDOQUERY_DTD_RESOURCE
        = "javax/jdo/jdoquery_3_0.dtd";
    static String JDOQUERY_XSD_RESOURCE
        = "javax/jdo/jdoquery_3_0.xsd";
    static String ANONYMOUS_PERSISTENCE_MANAGER_FACTORY_NAME
        = "";
    public static final String TX_READ_UNCOMMITTED = "read-uncommitted"; 
    public static final String TX_READ_COMMITTED = "read-committed"; 
    public static final String TX_REPEATABLE_READ = "repeatable-read"; 
    public static final String TX_SNAPSHOT = "snapshot"; 
    public static final String TX_SERIALIZABLE = "serializable"; 
    public static final String PROPERTY_ENHANCER_VENDOR_NAME = "VendorName";
    public static final String PROPERTY_ENHANCER_VERSION_NUMBER = "VersionNumber";
    public static final String PROPERTY_TRANSACTION_TYPE = "javax.jdo.option.TransactionType";
    public static final int ENHANCER_EXCEPTION = 1;
    public static final int ENHANCER_NO_JDO_ENHANCER_FOUND = 2;
    public static final int ENHANCER_USAGE_ERROR = 3;
}

public interface javax.jdo.datastore.DataStoreCache {
    abstract void evict(Object oid);
    abstract void evictAll();
    abstract varargs void evictAll(Object[] oids);
    abstract void evictAll(java.util.Collection oids);
    abstract void evictAll(boolean subclasses, Class pcClass);
    abstract void pin(Object oid);
    abstract void pinAll(java.util.Collection oids);
    abstract varargs void pinAll(Object[] oids);
    abstract void pinAll(boolean subclasses, Class pcClass);
    abstract void unpin(Object oid);
    abstract void unpinAll(java.util.Collection oids);
    abstract varargs void unpinAll(Object[] oids);
    abstract void unpinAll(boolean subclasses, Class pcClass);
}

public interface javax.jdo.datastore.JDOConnection {
    abstract Object getNativeConnection();
    abstract void close();
}

public interface javax.jdo.datastore.Sequence {
    abstract String getName();
    abstract Object next();
    abstract void allocate(int additional);
    abstract Object current();
    abstract long nextValue();
    abstract long currentValue();
}

public interface javax.jdo.Extent extends java.lang.Iterable, java.lang.AutoCloseable {
    abstract java.util.Iterator iterator();
    abstract boolean hasSubclasses();
    abstract Class getCandidateClass();
    abstract javax.jdo.PersistenceManager getPersistenceManager();
    abstract void closeAll();
    abstract void close(java.util.Iterator it);
    abstract void close();
    abstract javax.jdo.FetchPlan getFetchPlan();
}

public interface javax.jdo.FetchPlan {
    public static final String DEFAULT = "default";
    public static final String ALL = "all";
    public static final int DETACH_UNLOAD_FIELDS = 2;
    public static final int DETACH_LOAD_FIELDS = 1;
    public static final int FETCH_SIZE_GREEDY = -1;
    public static final int FETCH_SIZE_OPTIMAL = 0;
    abstract javax.jdo.FetchPlan addGroup(String fetchGroupName);
    abstract javax.jdo.FetchPlan removeGroup(String fetchGroupName);
    abstract javax.jdo.FetchPlan clearGroups();
    abstract java.util.Set getGroups();
    abstract javax.jdo.FetchPlan setGroups(java.util.Collection fetchGroupNames);
    abstract varargs javax.jdo.FetchPlan setGroups(String[]fetchGroupNames);
    abstract javax.jdo.FetchPlan setGroup(String fetchGroupName);
    abstract javax.jdo.FetchPlan setMaxFetchDepth(int fetchDepth);
    abstract int getMaxFetchDepth();
    abstract javax.jdo.FetchPlan setDetachmentRoots(java.util.Collection roots);
    abstract java.util.Collection getDetachmentRoots();
    abstract varargs javax.jdo.FetchPlan setDetachmentRootClasses(Class[] rootClasses);
    abstract Class[] getDetachmentRootClasses();
    abstract javax.jdo.FetchPlan setFetchSize(int fetchSize);
    abstract int getFetchSize();
    abstract javax.jdo.FetchPlan setDetachmentOptions(int options);
    abstract int getDetachmentOptions();
}

public class javax.jdo.identity.ByteIdentity extends javax.jdo.identity.SingleFieldIdentity {
    public ByteIdentity(Class pcClass, byte key);
    public ByteIdentity(Class pcClass, Byte key);
    public ByteIdentity(Class pcClass, String str);
    public ByteIdentity();
    public byte getKey();
    public String toString();
    public boolean equals(Object obj);
    public volatile int compareTo(Object);
    public int compareTo(javax.jdo.identity.ByteIdentity obj);
    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException;
    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException;
}

public class javax.jdo.identity.CharIdentity extends javax.jdo.identity.SingleFieldIdentity {
    public CharIdentity(Class pcClass, char key);
    public CharIdentity(Class pcClass, Character key);
    public CharIdentity(Class pcClass, String str);
    public CharIdentity();
    public char getKey();
    public String toString();
    public boolean equals(Object obj);
    public volatile int compareTo(Object);
    public int compareTo(javax.jdo.identity.CharIdentity obj);
    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException;
    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException;
}

public class javax.jdo.identity.IntIdentity extends javax.jdo.identity.SingleFieldIdentity {
    public IntIdentity(Class pcClass, int key);
    public IntIdentity(Class pcClass, Integer key);
    public IntIdentity(Class pcClass, String str);
    public IntIdentity();
    public int getKey();
    public String toString();
    public boolean equals(Object obj);
    public volatile int compareTo(Object);
    public int compareTo(javax.jdo.identity.IntIdentity obj);
    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException;
    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException;
}

public class javax.jdo.identity.LongIdentity extends javax.jdo.identity.SingleFieldIdentity {
    public LongIdentity(Class pcClass, long key);
    public LongIdentity(Class pcClass, Long key);
    public LongIdentity(Class pcClass, String str);
    public LongIdentity();
    public long getKey();
    public String toString();
    public boolean equals(Object obj);
    public volatile int compareTo(Object);
    public int compareTo(javax.jdo.identity.LongIdentity obj);
    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException;
    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException;
}

public class javax.jdo.identity.ObjectIdentity extends javax.jdo.identity.SingleFieldIdentity {
    public ObjectIdentity(Class pcClass, Object param);
    public ObjectIdentity();
    public Object getKey();
    public String toString();
    public boolean equals(Object obj);
    public int hashCode();
    public volatile int compareTo(Object);
    public int compareTo(javax.jdo.identity.ObjectIdentity obj);
    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException;
    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException;
}

public class javax.jdo.identity.ShortIdentity extends javax.jdo.identity.SingleFieldIdentity {
    public ShortIdentity(Class pcClass, short key);
    public ShortIdentity(Class pcClass, Short key);
    public ShortIdentity(Class pcClass, String str);
    public ShortIdentity();
    public short getKey();
    public String toString();
    public boolean equals(Object obj);
    public volatile int compareTo(Object);
    public int compareTo(javax.jdo.identity.ShortIdentity obj);
    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException;
    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException;
}

public abstract class javax.jdo.identity.SingleFieldIdentity implements java.io.Externalizable, java.lang.Comparable {
    public SingleFieldIdentity();
    public Class getTargetClass();
    public String getTargetClassName();
    public synchronized Object getKeyAsObject();
    public boolean equals(Object obj);
    public int hashCode();
    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException;
    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException;
}

public class javax.jdo.identity.StringIdentity extends javax.jdo.identity.SingleFieldIdentity {
    public StringIdentity(Class pcClass, String key);
    public StringIdentity();
    public String getKey();
    public String toString();
    public boolean equals(Object obj);
    public volatile int compareTo(Object);
    public int compareTo(javax.jdo.identity.StringIdentity obj);
    public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException;
    public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException;
}

public interface javax.jdo.InstanceCallbacks extends javax.jdo.listener.ClearCallback, javax.jdo.listener.DeleteCallback, javax.jdo.listener.LoadCallback, javax.jdo.listener.StoreCallback {
}

public class javax.jdo.JDOCanRetryException extends javax.jdo.JDOException {
    public JDOCanRetryException();
    public JDOCanRetryException(String msg);
    public JDOCanRetryException(String msg, Throwable[] nested);
    public JDOCanRetryException(String msg, Throwable nested);
    public JDOCanRetryException(String msg, Object failed);
    public JDOCanRetryException(String msg, Throwable[] nested, Object failed);
    public JDOCanRetryException(String msg, Throwable nested, Object failed);
}

public class javax.jdo.JDODataStoreException extends javax.jdo.JDOCanRetryException {
    public JDODataStoreException();
    public JDODataStoreException(String msg);
    public JDODataStoreException(String msg, Throwable[] nested);
    public JDODataStoreException(String msg, Throwable nested);
    public JDODataStoreException(String msg, Object failed);
    public JDODataStoreException(String msg, Throwable[] nested, Object failed);
    public JDODataStoreException(String msg, Throwable nested, Object failed);
}

public class javax.jdo.JDODetachedFieldAccessException extends javax.jdo.JDOUserException {
    public JDODetachedFieldAccessException();
    public JDODetachedFieldAccessException(String msg);
    public JDODetachedFieldAccessException(String, Object);
    public JDODetachedFieldAccessException(String msg, Throwable[] nested);
    public JDODetachedFieldAccessException(String msg, Throwable nested);
}

public class javax.jdo.JDOException extends RuntimeException {
    public JDOException();
    public JDOException(String msg);
    public JDOException(String msg, Throwable[] nested);
    public JDOException(String msg, Throwable nested);
    public JDOException(String msg, Object failed);
    public JDOException(String msg, Throwable[] nested, Object failed);
    public JDOException(String msg, Throwable nested, Object failed);
    public Object getFailedObject();
    public Throwable[] getNestedExceptions();
    public synchronized Throwable getCause();
    public Throwable initCause(Throwable cause);
    public synchronized String toString();
    public void printStackTrace();
    public synchronized void printStackTrace(java.io.PrintStream s);
    public synchronized void printStackTrace(java.io.PrintWriter s);
}

public class javax.jdo.JDOFatalDataStoreException extends javax.jdo.JDOFatalException {
    public JDOFatalDataStoreException();
    public JDOFatalDataStoreException(String msg);
    public JDOFatalDataStoreException(String msg, Object failed);
    public JDOFatalDataStoreException(String msg, Throwable[] nested);
    public JDOFatalDataStoreException(String msg, Throwable nested);
    public JDOFatalDataStoreException(String msg, Throwable[] nested, Object failed);
    public JDOFatalDataStoreException(String msg, Throwable nested, Object failed);
}

public class javax.jdo.JDOFatalException extends javax.jdo.JDOException {
    public JDOFatalException();
    public JDOFatalException(String msg);
    public JDOFatalException(String msg, Throwable[] nested);
    public JDOFatalException(String msg, Throwable nested);
    public JDOFatalException(String msg, Object failed);
    public JDOFatalException(String msg, Throwable[] nested, Object failed);
    public JDOFatalException(String msg, Throwable nested, Object failed);
}

public class javax.jdo.JDOFatalInternalException extends javax.jdo.JDOFatalException {
    public JDOFatalInternalException();
    public JDOFatalInternalException(String msg);
    public JDOFatalInternalException(String msg, Throwable[] nested);
    public JDOFatalInternalException(String msg, Throwable nested);
    public JDOFatalInternalException(String msg, Object failed);
    public JDOFatalInternalException(String msg, Throwable[] nested, Object failed);
    public JDOFatalInternalException(String msg, Throwable nested, Object failed);
}

public class javax.jdo.JDOFatalUserException extends javax.jdo.JDOFatalException {
    public JDOFatalUserException();
    public JDOFatalUserException(String msg);
    public JDOFatalUserException(String msg, Throwable[] nested);
    public JDOFatalUserException(String msg, Throwable nested);
    public JDOFatalUserException(String msg, Object failed);
    public JDOFatalUserException(String msg, Throwable[] nested, Object failed);
    public JDOFatalUserException(String msg, Throwable nested, Object failed);
}

public class javax.jdo.JDOHelper implements javax.jdo.Constants {
    public JDOHelper();
    public static javax.jdo.JDOHelper getInstance();
    public static javax.jdo.PersistenceManager getPersistenceManager(Object pc);
    public static void makeDirty(Object pc, String fieldName);
    public static Object getObjectId(Object pc);
    public static java.util.Collection getObjectIds(java.util.Collection pcs);
    public static Object[] getObjectIds(Object[] pcs);
    public static Object getTransactionalObjectId(Object pc);
    public static Object getVersion(Object pc);
    public static boolean isDirty(Object pc);
    public static boolean isTransactional(Object pc);
    public static boolean isPersistent(Object pc);
    public static boolean isNew(Object pc);
    public static boolean isDeleted(Object pc);
    public static boolean isDetached(Object pc);
    public static enum javax.jdo.ObjectState getObjectState(Object pc);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory();
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.util.Map props);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.util.Map props, ClassLoader cl);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.util.Map props, java.lang.String name, ClassLoader propsloader, ClassLoader pmfloader);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.util.Map props, java.lang.String name, ClassLoader pmfloader);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.util.Map props, java.lang.String name);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(String propsResource);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(String propsResource, ClassLoader loader);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(String propsResource, ClassLoader propsLoader, ClassLoader pmfLoader);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(ClassLoader pmfLoader);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.io.File propsFile);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.io.File propsFile, ClassLoader loader);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(String jndiLocation, javax.naming.Context context);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(String jndiLocation, javax.naming.Context context, ClassLoader loader);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.io.InputStream stream);
    public static javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory(java.io.InputStream stream, ClassLoader loader);
    public static javax.jdo.JDOEnhancer getEnhancer();
    public static javax.jdo.JDOEnhancer getEnhancer(ClassLoader loader);
}

public class javax.jdo.JDONullIdentityException extends javax.jdo.JDOUserException {
    public JDONullIdentityException();
    public JDONullIdentityException(String msg);
    public JDONullIdentityException(String msg, Object failed);
    public JDONullIdentityException(String msg, Throwable[] nested);
    public JDONullIdentityException(String msg, Throwable nested);
}

public class javax.jdo.JDOObjectNotFoundException extends javax.jdo.JDODataStoreException {
    public JDOObjectNotFoundException();
    public JDOObjectNotFoundException(String msg);
    public JDOObjectNotFoundException(String msg, Object failed);
    public JDOObjectNotFoundException(String msg, Throwable nested);
    public JDOObjectNotFoundException(String msg, Throwable nested, Object failed);
    public JDOObjectNotFoundException(String msg, Throwable[] nested);
    public JDOObjectNotFoundException(String msg, Throwable[] nested, Object failed);
}

public class javax.jdo.JDOOptimisticVerificationException extends javax.jdo.JDOFatalDataStoreException {
    public JDOOptimisticVerificationException();
    public JDOOptimisticVerificationException(String msg);
    public JDOOptimisticVerificationException(String msg, Object failed);
    public JDOOptimisticVerificationException(String msg, Throwable[] nested);
    public JDOOptimisticVerificationException(String msg, Throwable nested, Object failed);
    public JDOOptimisticVerificationException(String msg, Throwable[] nested, Object failed);
}

public class javax.jdo.JDOUnsupportedOptionException extends javax.jdo.JDOUserException {
    public JDOUnsupportedOptionException();
    public JDOUnsupportedOptionException(String msg);
    public JDOUnsupportedOptionException(String msg, Throwable[] nested);
    public JDOUnsupportedOptionException(String msg, Throwable nested);
}

public class javax.jdo.JDOUserCallbackException extends javax.jdo.JDOUserException {
    public JDOUserCallbackException();
    public JDOUserCallbackException(String msg);
    public JDOUserCallbackException(String msg, Throwable[] nested);
    public JDOUserCallbackException(String msg, Throwable nested);
    public JDOUserCallbackException(String msg, Object failed);
    public JDOUserCallbackException(String msg, Throwable[] nested, Object failed);
    public JDOUserCallbackException(String msg, Throwable nested, Object failed);
}

public class javax.jdo.JDOUserException extends javax.jdo.JDOCanRetryException {
    public JDOUserException();
    public JDOUserException(String msg);
    public JDOUserException(String msg, Throwable[] nested);
    public JDOUserException(String msg, Throwable nested);
    public JDOUserException(String msg, Object failed);
    public JDOUserException(String msg, Throwable[] nested, Object failed);
    public JDOUserException(String msg, Throwable nested, Object failed);
}

public interface javax.jdo.listener.AttachCallback {
    abstract void jdoPreAttach();
    abstract void jdoPostAttach(Object attached);
}

public interface javax.jdo.listener.AttachLifecycleListener extends javax.jdo.listener.InstanceLifecycleListener {
    abstract void preAttach(javax.jdo.listener.InstanceLifecycleEvent event);
    abstract void postAttach(javax.jdo.listener.InstanceLifecycleEvent event);
}

public interface javax.jdo.listener.ClearCallback {
    abstract void jdoPreClear();
}

public interface javax.jdo.listener.ClearLifecycleListener extends javax.jdo.listener.InstanceLifecycleListener {
    abstract void preClear(javax.jdo.listener.InstanceLifecycleEvent event);
    abstract void postClear(javax.jdo.listener.InstanceLifecycleEvent event);
}

public interface javax.jdo.listener.CreateLifecycleListener extends javax.jdo.listener.InstanceLifecycleListener {
    abstract void postCreate(javax.jdo.listener.InstanceLifecycleEvent event);
}

public interface javax.jdo.listener.DeleteCallback {
    abstract void jdoPreDelete();
}

public interface javax.jdo.listener.DeleteLifecycleListener extends javax.jdo.listener.InstanceLifecycleListener {
    abstract void preDelete(javax.jdo.listener.InstanceLifecycleEvent event);
    abstract void postDelete(javax.jdo.listener.InstanceLifecycleEvent event);
}

public interface javax.jdo.listener.DetachCallback {
    abstract void jdoPreDetach();
    abstract void jdoPostDetach(Object detached);
}

public interface javax.jdo.listener.DetachLifecycleListener extends javax.jdo.listener.InstanceLifecycleListener {
    abstract void preDetach(javax.jdo.listener.InstanceLifecycleEvent event);
    abstract void postDetach(javax.jdo.listener.InstanceLifecycleEvent event);
}

public interface javax.jdo.listener.DirtyLifecycleListener extends javax.jdo.listener.InstanceLifecycleListener {
    abstract void preDirty(javax.jdo.listener.InstanceLifecycleEvent event);
    abstract void postDirty(javax.jdo.listener.InstanceLifecycleEvent event);
}

public class javax.jdo.listener.InstanceLifecycleEvent extends java.util.EventObject {
    public static final int CREATE = 0;
    public static final int LOAD = 1;
    public static final int STORE = 2;
    public static final int CLEAR = 3;
    public static final int DELETE = 4;
    public static final int DIRTY = 5;
    public static final int DETACH = 6;
    public static final int ATTACH = 7;
    public InstanceLifecycleEvent(Object source, int type);
    public InstanceLifecycleEvent(Object source, int type, Object target);
    public int getEventType();
    public Object getSource();
    public Object getTarget();
    public Object getPersistentInstance();
    public Object getDetachedInstance();
}

public interface javax.jdo.listener.InstanceLifecycleListener {
}

public interface javax.jdo.listener.LoadCallback {
    abstract void jdoPostLoad();
}

public interface javax.jdo.listener.LoadLifecycleListener extends javax.jdo.listener.InstanceLifecycleListener {
    abstract void postLoad(javax.jdo.listener.InstanceLifecycleEvent event);
}

public interface javax.jdo.listener.StoreCallback {
    abstract void jdoPreStore();
}

public interface javax.jdo.listener.StoreLifecycleListener extends javax.jdo.listener.InstanceLifecycleListener {
    abstract void preStore(javax.jdo.listener.InstanceLifecycleEvent event);
    abstract void postStore(javax.jdo.listener.InstanceLifecycleEvent event);
}

public interface javax.jdo.PersistenceManager extends java.lang.AutoCloseable {
    abstract boolean isClosed();
    abstract void close();
    abstract javax.jdo.Transaction currentTransaction();
    abstract void evict(Object pc);
    abstract varargs void evictAll(Object[] pcs);
    abstract void evictAll(java.util.Collection pcs);
    abstract void evictAll(boolean, Class);
    abstract void evictAll();
    abstract void refresh(Object pc);
    abstract varargs void refreshAll(Object[] pcs);
    abstract void refreshAll(java.util.Collection pcs);
    abstract void refreshAll();
    abstract void refreshAll(javax.jdo.JDOException jdoe);
    abstract javax.jdo.Query newQuery();
    abstract javax.jdo.Query newQuery(Object compiled);
    abstract javax.jdo.Query newQuery(String query);
    abstract javax.jdo.Query newQuery(String language, Object query);
    abstract javax.jdo.Query newQuery(Class cls);
    abstract javax.jdo.Query newQuery(javax.jdo.Extent cln);
    abstract javax.jdo.Query newQuery(Class cls, java.util.Collection cln);
    abstract javax.jdo.Query newQuery(Class cls, String filter);
    abstract javax.jdo.Query newQuery(Class cls, java.util.Collection cln, String filter);
    abstract javax.jdo.Query newQuery(javax.jdo.Extent cln, String filter);
    abstract javax.jdo.Query newNamedQuery(Class cls, String queryName);
    abstract javax.jdo.JDOQLTypedQuery newJDOQLTypedQuery(Class cls);
    abstract javax.jdo.Extent getExtent(Class persistenceCapableClass, boolean subclasses);
    abstract javax.jdo.Extent getExtent(Class persistenceCapableClass);
    abstract Object getObjectById(Object oid, boolean validate);
    abstract Object getObjectById(Class cls, Object key);
    abstract Object getObjectById(Object oid);
    abstract Object getObjectId(Object pc);
    abstract Object getTransactionalObjectId(Object pc);
    abstract Object newObjectIdInstance(Class pcClass, Object key);
    abstract java.util.Collection getObjectsById(java.util.Collection oids, boolean validate);
    abstract java.util.Collection getObjectsById(java.util.Collection oids);
    abstract varargs Object[] getObjectsById(boolean validate,Object[] oids);
    abstract varargs Object[] getObjectsById(Object[] oids);
    abstract Object makePersistent(Object pc);
    abstract varargs Object[] makePersistentAll(Object[] pcs);
    abstract java.util.Collection makePersistentAll(java.util.Collection pcs);
    abstract void deletePersistent(Object pc);
    abstract varargs void deletePersistentAll(Object[] pcs);
    abstract void deletePersistentAll(java.util.Collection pcs);
    abstract void makeTransient(Object pc);
    abstract varargs void makeTransientAll(Object[] pcs);
    abstract void makeTransientAll(java.util.Collection pcs);
    abstract void makeTransient(Object pc, boolean useFetchPlan);
    abstract varargs void makeTransientAll(boolean useFetchPlan, Object[] pcs);
    abstract void makeTransientAll(java.util.Collection pcs, boolean useFetchPlan);
    abstract void makeTransactional(Object pc);
    abstract varargs void makeTransactionalAll(Object[] pcs);
    abstract void makeTransactionalAll(java.util.Collection pcs);
    abstract void makeNontransactional(Object pc);
    abstract varargs void makeNontransactionalAll(Object[] pcs);
    abstract void makeNontransactionalAll(java.util.Collection pcs);
    abstract void retrieve(Object pc);
    abstract void retrieve(Object pc, boolean FGOnly);
    abstract void retrieveAll(java.util.Collection pcs);
    abstract void retrieveAll(java.util.Collection pcs, boolean FGOnly);
    abstract varargs void retrieveAll(Object[] pcs);
    abstract varargs void retrieveAll(boolean FGOnly, Object[] pcs);
    abstract void setUserObject(Object o);
    abstract Object getUserObject();
    abstract javax.jdo.PersistenceManagerFactory getPersistenceManagerFactory();
    abstract Class getObjectIdClass(Class cls);
    abstract void setMultithreaded(boolean flag);
    abstract boolean getMultithreaded();
    abstract void setIgnoreCache(boolean flag);
    abstract boolean getIgnoreCache();
    abstract boolean getDetachAllOnCommit();
    abstract void setDetachAllOnCommit(boolean flag);
    abstract boolean getCopyOnAttach();
    abstract void setCopyOnAttach(boolean flag);
    abstract Object detachCopy(Object pc);
    abstract java.util.Collection detachCopyAll(java.util.Collection pcs);
    abstract varargs Object[] detachCopyAll(Object [] pcs);
    abstract Object putUserObject(Object key, Object val);
    abstract Object getUserObject(Object key);
    abstract Object removeUserObject(Object key);
    abstract void flush();
    abstract void checkConsistency();
    abstract javax.jdo.FetchPlan getFetchPlan();
    abstract Object newInstance(Class pcClass);
    abstract java.util.Date getServerDate();
    abstract javax.jdo.datastore.Sequence getSequence(String name);
    abstract javax.jdo.datastore.JDOConnection getDataStoreConnection();
    abstract varargs void addInstanceLifecycleListener(javax.jdo.listener.InstanceLifecycleListener listener, Class[] classes);
    abstract void removeInstanceLifecycleListener(javax.jdo.listener.InstanceLifecycleListener listener);
    abstract java.util.Set getManagedObjects();
    abstract java.util.Set getManagedObjects(java.util.EnumSet states);
    abstract varargs java.util.Set getManagedObjects(Class[] classes);
    abstract varargs java.util.Set getManagedObjects(java.util.EnumSet states, Class[] classes);
    abstract javax.jdo.FetchGroup getFetchGroup(Class cls, String name);
    abstract void setDatastoreReadTimeoutMillis(Integer interval);
    abstract Integer getDatastoreReadTimeoutMillis();
    abstract void setDatastoreWriteTimeoutMillis(Integer interval);
    abstract Integer getDatastoreWriteTimeoutMillis();
    abstract void setProperty(String propertyName, Object value);
    abstract java.util.Map getProperties();
    abstract java.util.Set getSupportedProperties();
}

public interface javax.jdo.PersistenceManagerFactory extends java.io.Serializable {
    abstract void close();
    abstract boolean isClosed();
    abstract javax.jdo.PersistenceManager getPersistenceManager();
    abstract javax.jdo.PersistenceManager getPersistenceManagerProxy();
    abstract javax.jdo.PersistenceManager getPersistenceManager(String userid, String password);
    abstract void setConnectionUserName(String userName);
    abstract String getConnectionUserName();
    abstract void setConnectionPassword(String password);
    abstract void setConnectionURL(String URL);
    abstract String getConnectionURL();
    abstract void setConnectionDriverName(String driverName);
    abstract String getConnectionDriverName();
    abstract void setConnectionFactoryName(String connectionFactoryName);
    abstract String getConnectionFactoryName();
    abstract void setConnectionFactory(Object connectionFactory);
    abstract Object getConnectionFactory();
    abstract void setConnectionFactory2Name(String connectionFactoryName);
    abstract String getConnectionFactory2Name();
    abstract void setConnectionFactory2(Object connectionFactory);
    abstract Object getConnectionFactory2();
    abstract void setMultithreaded(boolean flag);
    abstract boolean getMultithreaded();
    abstract void setMapping(String mapping);
    abstract String getMapping();
    abstract void setOptimistic(boolean flag);
    abstract boolean getOptimistic();
    abstract void setRetainValues(boolean flag);
    abstract boolean getRetainValues();
    abstract void setRestoreValues(boolean restoreValues);
    abstract boolean getRestoreValues();
    abstract void setNontransactionalRead(boolean flag);
    abstract boolean getNontransactionalRead();
    abstract void setNontransactionalWrite(boolean flag);
    abstract boolean getNontransactionalWrite();
    abstract void setIgnoreCache(boolean flag);
    abstract boolean getIgnoreCache();
    abstract boolean getDetachAllOnCommit();
    abstract void setDetachAllOnCommit(boolean flag);
    abstract boolean getCopyOnAttach();
    abstract void setCopyOnAttach(boolean flag);
    abstract java.lang.String getName();
    abstract void setName(java.lang.String);
    abstract java.lang.String getPersistenceUnitName();
    abstract void setPersistenceUnitName(java.lang.String);
    abstract java.lang.String getServerTimeZoneID();
    abstract void setServerTimeZoneID(java.lang.String);
    abstract java.lang.String getTransactionType();
    abstract void setTransactionType(java.lang.String);
    abstract void setReadOnly(boolean flag);
    abstract boolean getReadOnly();
    abstract void setTransactionIsolationLevel(String);
    abstract String getTransactionIsolationLevel();
    abstract java.util.Properties getProperties();
    abstract java.util.Collection supportedOptions();
    abstract javax.jdo.datastore.DataStoreCache getDataStoreCache();
    abstract void addInstanceLifecycleListener(javax.jdo.listener.InstanceLifecycleListener listener, Class[] classes);
    abstract void removeInstanceLifecycleListener(javax.jdo.listener.InstanceLifecycleListener listener);
    abstract varargs void addFetchGroups(javax.jdo.FetchGroup[] groups);
    abstract varargs void removeFetchGroups(javax.jdo.FetchGroup[] groups);
    abstract void removeAllFetchGroups();
    abstract javax.jdo.FetchGroup getFetchGroup(Class cls, String name);
    abstract java.util.Set getFetchGroups();
    abstract void registerMetadata(javax.jdo.metadata.JDOMetadata metadata);
    abstract javax.jdo.metadata.JDOMetadata newMetadata();
    abstract javax.jdo.metadata.TypeMetadata getMetadata(String className);
    abstract void setDatastoreReadTimeoutMillis(Integer interval);
    abstract Integer getDatastoreReadTimeoutMillis();
    abstract void setDatastoreWriteTimeoutMillis(Integer interval);
    abstract Integer getDatastoreWriteTimeoutMillis();
    abstract java.util.Collection getManagedClasses();
}

public interface javax.jdo.Query extends java.lang.AutoCloseable, java.io.Serializable {
    public static final String JDOQL = "javax.jdo.query.JDOQL";
    public static final String SQL = "javax.jdo.query.SQL";
    abstract void setClass(Class cls);
    abstract void setCandidates(javax.jdo.Extent pcs);
    abstract void setCandidates(java.util.Collection pcs);
    abstract void setFilter(String filter);
    abstract void declareImports(String imports);
    abstract void declareParameters(String parameters);
    abstract void declareVariables(String variables);
    abstract void setOrdering(String ordering);
    abstract void setIgnoreCache(boolean ignoreCache);
    abstract void addSubquery(javax.jdo.Query, java.lang.String, java.lang.String);
    abstract void addSubquery(javax.jdo.Query, java.lang.String, java.lang.String, java.lang.String);
    abstract varargs void addSubquery(javax.jdo.Query, java.lang.String, java.lang.String, java.lang.String[]);
    abstract void addSubquery(javax.jdo.Query, java.lang.String, java.lang.String, java.util.Map);
    abstract boolean getIgnoreCache();
    abstract void compile();
    abstract Object execute();
    abstract Object execute(Object p1);
    abstract Object execute(Object p1, Object p2);
    abstract Object execute(Object p1, Object p2, Object p3);
    abstract Object executeWithMap(java.util.Map parameters);
    abstract varargs Object executeWithArray(Object[] parameters);
    abstract javax.jdo.PersistenceManager getPersistenceManager();
    abstract void close(Object queryResult);
    abstract void closeAll();
    abstract void close();
    abstract void setGrouping(String group);
    abstract void setUnique(boolean unique);
    abstract void setResult(String data);
    abstract void setResultClass(Class cls);
    abstract void setRange(long fromIncl, long toExcl);
    abstract void setRange(String fromInclToExcl);
    abstract void addExtension(String key, Object value);
    abstract void setExtensions(java.util.Map extensions);
    abstract javax.jdo.FetchPlan getFetchPlan();
    abstract varargs long deletePersistentAll(Object[] parameters);
    abstract long deletePersistentAll(java.util.Map parameters);
    abstract long deletePersistentAll();
    abstract void setUnmodifiable();
    abstract boolean isUnmodifiable();
    abstract void cancelAll();
    abstract void cancel(Thread);
    abstract Boolean getSerializeRead();
    abstract void setSerializeRead(Boolean);
    abstract void setDatastoreReadTimeoutMillis(Integer interval);
    abstract Integer getDatastoreReadTimeoutMillis();
    abstract void setDatastoreWriteTimeoutMillis(Integer interval);
    abstract Integer getDatastoreWriteTimeoutMillis();
    abstract javax.jdo.Query saveAsNamedQuery(String);
    abstract javax.jdo.Query filter(String filter);
    abstract javax.jdo.Query orderBy(String ordering);
    abstract javax.jdo.Query groupBy(String group);
    abstract javax.jdo.Query result(String result);
    abstract javax.jdo.Query range(long fromIncl, long toExcl);
    abstract javax.jdo.Query range(String fromInclToExcl);
    abstract javax.jdo.Query subquery(javax.jdo.Query sub, String variableDeclaration, String candidateCollectionExpression);
    abstract javax.jdo.Query subquery(javax.jdo.Query sub, String variableDeclaration, String candidateCollectionExpression, String parameter);
    abstract varargs javax.jdo.Query subquery(javax.jdo.Query sub, String variableDeclaration, String candidateCollectionExpression, String[] parameters);
    abstract javax.jdo.Query subquery(javax.jdo.Query sub, String variableDeclaration, String candidateCollectionExpression, java.util.Map parameters);
    abstract javax.jdo.Query imports(String imports);
    abstract javax.jdo.Query parameters(String parameters);
    abstract javax.jdo.Query variables(String variables);
    abstract javax.jdo.Query datastoreReadTimeoutMillis(Integer interval);
    abstract javax.jdo.Query datastoreWriteTimeoutMillis(Integer interval);
    abstract javax.jdo.Query serializeRead(Boolean serialize);
    abstract javax.jdo.Query unmodifiable();
    abstract javax.jdo.Query ignoreCache(boolean flag);
    abstract javax.jdo.Query extension(String key, Object value);
    abstract javax.jdo.Query extensions(java.util.Map values);
    abstract javax.jdo.Query setNamedParameters(java.util.Map namedParamMap);
    abstract varargs javax.jdo.Query setParameters(Object[] paramValues);
    abstract java.util.List executeList();
    abstract Object executeUnique();
    abstract java.util.List executeResultList(Class resultCls);
    abstract Object executeResultUnique(Class resultCls);
    abstract java.util.List executeResultList();
    abstract Object executeResultUnique();
}

public interface javax.jdo.spi.Detachable {
    abstract void jdoReplaceDetachedState();
}

public class javax.jdo.spi.JDOImplHelper extends Object {
    public static javax.jdo.spi.JDOImplHelper getInstance() throws SecurityException;
    public String[] getFieldNames(Class pcClass);
    public Class[] getFieldTypes(Class pcClass);
    public byte[] getFieldFlags(Class pcClass);
    public Class getPersistenceCapableSuperclass(Class pcClass);
    public javax.jdo.spi.PersistenceCapable newInstance(Class pcClass, javax.jdo.spi.StateManager sm);
    public javax.jdo.spi.PersistenceCapable newInstance(Class pcClass, javax.jdo.spi.StateManager sm, Object oid);
    public Object newObjectIdInstance(Class pcClass);
    public Object newObjectIdInstance(Class pcClass, Object obj);
    public void copyKeyFieldsToObjectId(Class pcClass, javax.jdo.spi.PersistenceCapable$ObjectIdFieldSupplier fm, Object oid);
    public void copyKeyFieldsFromObjectId(Class pcClass, javax.jdo.spi.PersistenceCapable$ObjectIdFieldConsumer fm, Object oid);
    public static void registerClass(Class pcClass, String[] fieldNames, Class[] fieldTypes, byte[] fieldFlags, Class persistenceCapableSuperclass, javax.jdo.spi.PersistenceCapable pc);
    public void unregisterClasses(ClassLoader cl);
    public void unregisterClass(Class pcClass);
    public void addRegisterClassListener(javax.jdo.spi.RegisterClassListener crl);
    public void removeRegisterClassListener(javax.jdo.spi.RegisterClassListener crl);
    public java.util.Collection getRegisteredClasses();
    public static void registerAuthorizedStateManagerClass(Class smClass) throws SecurityException;
    public static void registerAuthorizedStateManagerClasses(java.util.Collection smClasses) throws SecurityException;
    public static void checkAuthorizedStateManager(javax.jdo.spi.StateManager sm);
    public static void checkAuthorizedStateManagerClass(Class smClass);
    public Object registerStringConstructor(Class cls, javax.jdo.spi.JDOImplHelper$StringConstructor sc);
    public static Object construct(String className, String keyString);
    public synchronized void registerDateFormat(java.text.DateFormat df);
    public synchronized void registerErrorHandler(org.xml.sax.ErrorHandler);
    public static org.xml.sax.ErrorHandler getRegisteredErrorHandler();
    public synchronized void registerDocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory);
    public static javax.xml.parsers.DocumentBuilderFactory getRegisteredDocumentBuilderFactory();
    public synchronized void addStateInterrogation(javax.jdo.spi.StateInterrogation si);
    public synchronized void removeStateInterrogation(javax.jdo.spi.StateInterrogation si);
    public void nonBinaryCompatibleMakeDirty(Object pc, String fieldName);
    public boolean nonBinaryCompatibleIs(Object pc, javax.jdo.spi.JDOImplHelper$StateInterrogationBooleanReturn sibr);
    public Object nonBinaryCompatibleGet(Object pc, javax.jdo.spi.JDOImplHelper$StateInterrogationObjectReturn sibr);
    public static void assertOnlyKnownStandardProperties(java.util.Map properties);
    public static final java.util.Set USER_CONFIGURABLE_STANDARD_PROPERTIES;
}

static public interface javax.jdo.spi.JDOImplHelper$StringConstructor {
    abstract Object construct(String s);
}

static public interface javax.jdo.spi.JDOImplHelper$StateInterrogationBooleanReturn {
    abstract Boolean is(Object pc, javax.jdo.spi.StateInterrogation si);
}

static public interface javax.jdo.spi.JDOImplHelper$StateInterrogationObjectReturn {
    abstract Object get(Object pc, javax.jdo.spi.StateInterrogation si);
}

public final class javax.jdo.spi.JDOPermission extends java.security.BasicPermission {
    public JDOPermission(String name);
    public JDOPermission(String name, String actions);
    public static final javax.jdo.spi.JDOPermission GET_METADATA;
    public static final javax.jdo.spi.JDOPermission MANAGE_METADATA;
    public static final javax.jdo.spi.JDOPermission SET_STATE_MANAGER;
    public static final javax.jdo.spi.JDOPermission CLOSE_PERSISTENCE_MANAGER_FACTORY;
}

public interface javax.jdo.spi.PersistenceCapable {
    public static final byte READ_WRITE_OK = 0;
    public static final byte LOAD_REQUIRED = 1;
    public static final byte READ_OK = -1;
    public static final byte CHECK_READ = 1;
    public static final byte MEDIATE_READ = 2;
    public static final byte CHECK_WRITE = 4;
    public static final byte MEDIATE_WRITE = 8;
    public static final byte SERIALIZABLE = 16;
    abstract javax.jdo.PersistenceManager jdoGetPersistenceManager();
    abstract void jdoReplaceStateManager(javax.jdo.spi.StateManager sm) throws SecurityException;
    abstract void jdoProvideField(int fieldNumber);
    abstract void jdoProvideFields(int[] fieldNumbers);
    abstract void jdoReplaceField(int fieldNumber);
    abstract void jdoReplaceFields(int[] fieldNumbers);
    abstract void jdoReplaceFlags();
    abstract void jdoCopyFields(Object other, int[] fieldNumbers);
    abstract void jdoMakeDirty(String fieldName);
    abstract Object jdoGetObjectId();
    abstract Object jdoGetTransactionalObjectId();
    abstract Object jdoGetVersion();
    abstract boolean jdoIsDirty();
    abstract boolean jdoIsTransactional();
    abstract boolean jdoIsPersistent();
    abstract boolean jdoIsNew();
    abstract boolean jdoIsDeleted();
    abstract boolean jdoIsDetached();
    abstract javax.jdo.spi.PersistenceCapable jdoNewInstance(javax.jdo.spi.StateManager sm);
    abstract javax.jdo.spi.PersistenceCapable jdoNewInstance(javax.jdo.spi.StateManager sm, Object oid);
    abstract Object jdoNewObjectIdInstance();
    abstract Object jdoNewObjectIdInstance(Object o);
    abstract void jdoCopyKeyFieldsToObjectId(Object oid);
    abstract void jdoCopyKeyFieldsToObjectId(javax.jdo.spi.PersistenceCapable$ObjectIdFieldSupplier fm, Object oid);
    abstract void jdoCopyKeyFieldsFromObjectId(javax.jdo.spi.PersistenceCapable$ObjectIdFieldConsumer fm, Object oid);
}

static public interface javax.jdo.spi.PersistenceCapable$ObjectIdFieldManager extends javax.jdo.spi.PersistenceCapable$ObjectIdFieldConsumer, javax.jdo.spi.PersistenceCapable$ObjectIdFieldSupplier {
}

static public interface javax.jdo.spi.PersistenceCapable$ObjectIdFieldSupplier {
    abstract boolean fetchBooleanField(int fieldNumber);
    abstract char fetchCharField(int fieldNumber);
    abstract byte fetchByteField(int fieldNumber);
    abstract short fetchShortField(int fieldNumber);
    abstract int fetchIntField(int fieldNumber);
    abstract long fetchLongField(int fieldNumber);
    abstract float fetchFloatField(int fieldNumber);
    abstract double fetchDoubleField(int fieldNumber);
    abstract String fetchStringField(int fieldNumber);
    abstract Object fetchObjectField(int fieldNumber);
}

static public interface javax.jdo.spi.PersistenceCapable$ObjectIdFieldConsumer {
    abstract void storeBooleanField(int fieldNumber, boolean value);
    abstract void storeCharField(int fieldNumber, char value);
    abstract void storeByteField(int fieldNumber, byte value);
    abstract void storeShortField(int fieldNumber, short value);
    abstract void storeIntField(int fieldNumber, int value);
    abstract void storeLongField(int fieldNumber, long value);
    abstract void storeFloatField(int fieldNumber, float value);
    abstract void storeDoubleField(int fieldNumber, double value);
    abstract void storeStringField(int fieldNumber, String value);
    abstract void storeObjectField(int fieldNumber, Object value);
}

public class javax.jdo.spi.RegisterClassEvent extends java.util.EventObject {
    public RegisterClassEvent(javax.jdo.spi.JDOImplHelper helper, Class registeredClass, String[] fieldNames, Class[] fieldTypes, byte[] fieldFlags, Class persistenceCapableSuperclass);
    public Class getRegisteredClass();
    public String[] getFieldNames();
    public Class[] getFieldTypes();
    public byte[] getFieldFlags();
    public Class getPersistenceCapableSuperclass();
}

public interface javax.jdo.spi.RegisterClassListener extends java.util.EventListener {
    abstract void registerClass(javax.jdo.spi.RegisterClassEvent event);
}

public interface javax.jdo.spi.StateInterrogation {
    abstract Boolean isPersistent(Object pc);
    abstract Boolean isTransactional(Object pc);
    abstract Boolean isDirty(Object pc);
    abstract Boolean isNew(Object pc);
    abstract Boolean isDeleted(Object pc);
    abstract Boolean isDetached(Object pc);
    abstract javax.jdo.PersistenceManager getPersistenceManager(Object pc);
    abstract Object getObjectId(Object pc);
    abstract Object getTransactionalObjectId(Object pc);
    abstract Object getVersion(Object pc);
    abstract boolean makeDirty(Object pc, String fieldName);
}

public interface javax.jdo.spi.StateManager {
    abstract byte replacingFlags(javax.jdo.spi.PersistenceCapable pc);
    abstract javax.jdo.spi.StateManager replacingStateManager(javax.jdo.spi.PersistenceCapable pc, javax.jdo.spi.StateManager sm);
    abstract boolean isDirty(javax.jdo.spi.PersistenceCapable pc);
    abstract boolean isTransactional(javax.jdo.spi.PersistenceCapable pc);
    abstract boolean isPersistent(javax.jdo.spi.PersistenceCapable pc);
    abstract boolean isNew(javax.jdo.spi.PersistenceCapable pc);
    abstract boolean isDeleted(javax.jdo.spi.PersistenceCapable pc);
    abstract javax.jdo.PersistenceManager getPersistenceManager(javax.jdo.spi.PersistenceCapable pc);
    abstract void makeDirty(javax.jdo.spi.PersistenceCapable pc, String fieldName);
    abstract Object getObjectId(javax.jdo.spi.PersistenceCapable pc);
    abstract Object getTransactionalObjectId(javax.jdo.spi.PersistenceCapable pc);
    abstract Object getVersion(javax.jdo.spi.PersistenceCapable pc);
    abstract boolean isLoaded(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract void preSerialize(javax.jdo.spi.PersistenceCapable pc);
    abstract boolean getBooleanField(javax.jdo.spi.PersistenceCapable pc, int field, boolean currentValue);
    abstract char getCharField(javax.jdo.spi.PersistenceCapable pc, int field, char currentValue);
    abstract byte getByteField(javax.jdo.spi.PersistenceCapable pc, int field, byte currentValue);
    abstract short getShortField(javax.jdo.spi.PersistenceCapable pc, int field, short currentValue);
    abstract int getIntField(javax.jdo.spi.PersistenceCapable pc, int field, int currentValue);
    abstract long getLongField(javax.jdo.spi.PersistenceCapable pc, int field, long currentValue);
    abstract float getFloatField(javax.jdo.spi.PersistenceCapable pc, int field, float currentValue);
    abstract double getDoubleField(javax.jdo.spi.PersistenceCapable pc, int field, double currentValue);
    abstract String getStringField(javax.jdo.spi.PersistenceCapable pc, int field, String currentValue);
    abstract Object getObjectField(javax.jdo.spi.PersistenceCapable pc, int field, Object currentValue);
    abstract void setBooleanField(javax.jdo.spi.PersistenceCapable pc, int field, boolean currentValue, boolean newValue);
    abstract void setCharField(javax.jdo.spi.PersistenceCapable pc, int field, char currentValue, char newValue);
    abstract void setByteField(javax.jdo.spi.PersistenceCapable pc, int field, byte currentValue, byte newValue);
    abstract void setShortField(javax.jdo.spi.PersistenceCapable pc, int field, short currentValue, short newValue);
    abstract void setIntField(javax.jdo.spi.PersistenceCapable pc, int field, int currentValue, int newValue);
    abstract void setLongField(javax.jdo.spi.PersistenceCapable pc, int field, long currentValue, long newValue);
    abstract void setFloatField(javax.jdo.spi.PersistenceCapable pc, int field, float currentValue, float newValue);
    abstract void setDoubleField(javax.jdo.spi.PersistenceCapable pc, int field, double currentValue, double newValue);
    abstract void setStringField(javax.jdo.spi.PersistenceCapable pc, int field, String currentValue, String newValue);
    abstract void setObjectField(javax.jdo.spi.PersistenceCapable pc, int field, Object currentValue, Object newValue);
    abstract void providedBooleanField(javax.jdo.spi.PersistenceCapable pc, int field, boolean currentValue);
    abstract void providedCharField(javax.jdo.spi.PersistenceCapable pc, int field, char currentValue);
    abstract void providedByteField(javax.jdo.spi.PersistenceCapable pc, int field, byte currentValue);
    abstract void providedShortField(javax.jdo.spi.PersistenceCapable pc, int field, short currentValue);
    abstract void providedIntField(javax.jdo.spi.PersistenceCapable pc, int field, int currentValue);
    abstract void providedLongField(javax.jdo.spi.PersistenceCapable pc, int field, long currentValue);
    abstract void providedFloatField(javax.jdo.spi.PersistenceCapable pc, int field, float currentValue);
    abstract void providedDoubleField(javax.jdo.spi.PersistenceCapable pc, int field, double currentValue);
    abstract void providedStringField(javax.jdo.spi.PersistenceCapable pc, int field, String currentValue);
    abstract void providedObjectField(javax.jdo.spi.PersistenceCapable pc, int field, Object currentValue);
    abstract boolean replacingBooleanField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract char replacingCharField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract byte replacingByteField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract short replacingShortField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract int replacingIntField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract long replacingLongField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract float replacingFloatField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract double replacingDoubleField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract String replacingStringField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract Object replacingObjectField(javax.jdo.spi.PersistenceCapable pc, int field);
    abstract Object[] replacingDetachedState(javax.jdo.spi.Detachable pc, Object[] state);
}

public interface javax.jdo.Transaction {
    abstract void begin();
    abstract void commit();
    abstract void rollback();
    abstract boolean isActive();
    abstract boolean getRollbackOnly();
    abstract void setRollbackOnly();
    abstract void setNontransactionalRead(boolean nontransactionalRead);
    abstract boolean getNontransactionalRead();
    abstract void setNontransactionalWrite(boolean nontransactionalWrite);
    abstract boolean getNontransactionalWrite();
    abstract void setRetainValues(boolean retainValues);
    abstract boolean getRetainValues();
    abstract void setRestoreValues(boolean restoreValues);
    abstract boolean getRestoreValues();
    abstract void setOptimistic(boolean optimistic);
    abstract boolean getOptimistic();
    abstract void setIsolationLevel(String level);
    abstract String getIsolationLevel();
    abstract void setSynchronization(javax.transaction.Synchronization sync);
    abstract javax.transaction.Synchronization getSynchronization();
    abstract javax.jdo.PersistenceManager getPersistenceManager();
    abstract Boolean getSerializeRead();
    abstract void setSerializeRead(Boolean);
}

public interface javax.jdo.AttributeConverter
{
    abstract Object convertToDatastore(Object attributeValue);
    abstract Object convertToAttribute(Object datastoreValue);
}

public final enum javax.jdo.ObjectState extends java.lang.Enum {

    public static final enum javax.jdo.ObjectState TRANSIENT;
    public static final enum javax.jdo.ObjectState TRANSIENT_CLEAN;
    public static final enum javax.jdo.ObjectState TRANSIENT_DIRTY;
    public static final enum javax.jdo.ObjectState PERSISTENT_NEW;
    public static final enum javax.jdo.ObjectState HOLLOW_PERSISTENT_NONTRANSACTIONAL;
    public static final enum javax.jdo.ObjectState PERSISTENT_NONTRANSACTIONAL_DIRTY;
    public static final enum javax.jdo.ObjectState PERSISTENT_CLEAN;
    public static final enum javax.jdo.ObjectState PERSISTENT_DIRTY;
    public static final enum javax.jdo.ObjectState PERSISTENT_DELETED;
    public static final enum javax.jdo.ObjectState PERSISTENT_NEW_DELETED;
    public static final enum javax.jdo.ObjectState DETACHED_CLEAN;
    public static final enum javax.jdo.ObjectState DETACHED_DIRTY;
    public static enum javax.jdo.ObjectState valueOf(java.lang.String);
    public static javax.jdo.ObjectState[] values();
    public String toString();
}

public annotation javax.jdo.annotations.Column extends java.lang.annotation.Annotation
{
    abstract String name() default "";
    abstract String target() default "";
    abstract String targetMember() default "";
    abstract String jdbcType() default "";
    abstract String sqlType() default "";
    abstract int length() default -1;
    abstract int scale() default -1;
    abstract String allowsNull() default "";
    abstract String defaultValue() default "";
    abstract String insertValue() default "";
    abstract javax.jdo.annotations.Extension[] extensions() default {};
    abstract int position() default -1;
}

public annotation javax.jdo.annotations.Columns extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.Column[] value();
}

public annotation javax.jdo.annotations.DatastoreIdentity extends java.lang.annotation.Annotation
{
    abstract enum javax.jdo.annotations.IdGeneratorStrategy strategy() default javax.jdo.annotations.IdGeneratorStrategy.UNSPECIFIED;
    abstract String customStrategy() default "";
    abstract String sequence() default "";
    abstract String column() default "";
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.Discriminator extends java.lang.annotation.Annotation
{
    abstract enum javax.jdo.annotations.DiscriminatorStrategy strategy() 
        default javax.jdo.annotations.DiscriminatorStrategy.UNSPECIFIED;
    abstract String customStrategy() default "";
    abstract String indexed() default "";
    abstract String column() default "";
    abstract String value() default "";
    abstract javax.jdo.annotations.Column[] columns() default {};
}

public final enum javax.jdo.annotations.DiscriminatorStrategy extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.DiscriminatorStrategy UNSPECIFIED;
    public static final enum javax.jdo.annotations.DiscriminatorStrategy NONE;
    public static final enum javax.jdo.annotations.DiscriminatorStrategy VALUE_MAP;
    public static final enum javax.jdo.annotations.DiscriminatorStrategy CLASS_NAME;
    public static enum javax.jdo.annotations.DiscriminatorStrategy valueOf(java.lang.String);
    public static javax.jdo.annotations.DiscriminatorStrategy[] values();
}

public annotation javax.jdo.annotations.Element extends java.lang.annotation.Annotation
{
    abstract Class[] types() default {};
    abstract String serialized() default "";
    abstract String embedded() default "";
    abstract javax.jdo.annotations.Embedded[] embeddedMapping() default {};
    abstract String dependent() default "";
    abstract String table() default "";
    abstract String column() default "";
    abstract enum javax.jdo.annotations.ForeignKeyAction deleteAction() default javax.jdo.annotations.ForeignKeyAction.UNSPECIFIED;
    abstract enum javax.jdo.annotations.ForeignKeyAction updateAction() default javax.jdo.annotations.ForeignKeyAction.UNSPECIFIED;
    abstract String indexed() default "";
    abstract String index() default "";
    abstract String unique() default "";
    abstract String uniqueKey() default "";
    abstract String mappedBy() default "";
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract String generateForeignKey() default "";
    abstract String foreignKey() default "";
    abstract Class converter() default javax.jdo.AttributeConverter$UseDefault.class;
    abstract boolean useDefaultConversion() default false;
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.Embedded extends java.lang.annotation.Annotation
{
    abstract String ownerMember() default "";
    abstract String nullIndicatorColumn() default "";
    abstract String nullIndicatorValue() default "";
    abstract javax.jdo.annotations.Persistent[] members() default {};
    abstract javax.jdo.annotations.Discriminator discriminatorColumnName() default @javax.jdo.annotations.Discriminator;
}

public annotation javax.jdo.annotations.EmbeddedOnly extends java.lang.annotation.Annotation
{
}

public annotation javax.jdo.annotations.Extension extends java.lang.annotation.Annotation
{
    abstract String vendorName();
    abstract String key();
    abstract String value();
}

public annotation javax.jdo.annotations.Extensions extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.Extension[] value();
}

public annotation javax.jdo.annotations.FetchGroup extends java.lang.annotation.Annotation
{
    abstract String name() default "";
    abstract String postLoad() default "";
    abstract javax.jdo.annotations.Persistent[] members();
    abstract String[] fetchGroups() default {};
}

public annotation javax.jdo.annotations.FetchGroups extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.FetchGroup[] value();
}

public annotation javax.jdo.annotations.FetchPlan extends java.lang.annotation.Annotation
{
    abstract String name() default "";
    abstract String[] fetchGroups() default {};
    abstract int maxFetchDepth() default 1;
    abstract int fetchSize() default 0;
}

public annotation javax.jdo.annotations.FetchPlans extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.FetchPlan[] value();
}

public annotation javax.jdo.annotations.ForeignKey extends java.lang.annotation.Annotation
{
    abstract String name() default "";
    abstract String table() default "";
    abstract String deferred() default "";
    abstract String unique() default "";
    abstract enum javax.jdo.annotations.ForeignKeyAction deleteAction() default javax.jdo.annotations.ForeignKeyAction.RESTRICT;
    abstract enum javax.jdo.annotations.ForeignKeyAction updateAction() default javax.jdo.annotations.ForeignKeyAction.RESTRICT;
    abstract String[] members() default {};
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public final enum javax.jdo.annotations.ForeignKeyAction extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.ForeignKeyAction UNSPECIFIED;
    public static final enum javax.jdo.annotations.ForeignKeyAction RESTRICT;
    public static final enum javax.jdo.annotations.ForeignKeyAction CASCADE;
    public static final enum javax.jdo.annotations.ForeignKeyAction NULL;
    public static final enum javax.jdo.annotations.ForeignKeyAction DEFAULT;
    public static final enum javax.jdo.annotations.ForeignKeyAction NONE;
    public static enum javax.jdo.annotations.ForeignKeyAction valueOf(java.lang.String);
    public static javax.jdo.annotations.ForeignKeyAction[] values();
}

public annotation javax.jdo.annotations.ForeignKeys extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.ForeignKey[] value();
}

public final enum javax.jdo.annotations.IdGeneratorStrategy extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.IdGeneratorStrategy UNSPECIFIED;
    public static final enum javax.jdo.annotations.IdGeneratorStrategy NATIVE;
    public static final enum javax.jdo.annotations.IdGeneratorStrategy SEQUENCE;
    public static final enum javax.jdo.annotations.IdGeneratorStrategy IDENTITY;
    public static final enum javax.jdo.annotations.IdGeneratorStrategy INCREMENT;
    public static final enum javax.jdo.annotations.IdGeneratorStrategy UUIDSTRING;
    public static final enum javax.jdo.annotations.IdGeneratorStrategy UUIDHEX;
    public static enum javax.jdo.annotations.IdGeneratorStrategy valueOf(java.lang.String);
    public static javax.jdo.annotations.IdGeneratorStrategy[] values();
}

public final enum javax.jdo.annotations.IdentityType extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.IdentityType UNSPECIFIED;
    public static final enum javax.jdo.annotations.IdentityType APPLICATION;
    public static final enum javax.jdo.annotations.IdentityType DATASTORE;
    public static final enum javax.jdo.annotations.IdentityType NONDURABLE;
    public static enum javax.jdo.annotations.IdentityType valueOf(java.lang.String);
    public static javax.jdo.annotations.IdentityType[] values();
}

public annotation javax.jdo.annotations.Index extends java.lang.annotation.Annotation
{
    abstract String name() default "";
    abstract String table() default "";
    abstract String unique() default "";
    abstract String[] members() default {};
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.Indices extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.Index[] value();
}

public annotation javax.jdo.annotations.Inheritance extends java.lang.annotation.Annotation
{
    abstract enum javax.jdo.annotations.InheritanceStrategy strategy() default javax.jdo.annotations.InheritanceStrategy.UNSPECIFIED;
    abstract String customStrategy() default "";
}

public final enum javax.jdo.annotations.InheritanceStrategy extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.InheritanceStrategy UNSPECIFIED;
    public static final enum javax.jdo.annotations.InheritanceStrategy NEW_TABLE;
    public static final enum javax.jdo.annotations.InheritanceStrategy SUBCLASS_TABLE;
    public static final enum javax.jdo.annotations.InheritanceStrategy SUPERCLASS_TABLE;
    public static final enum javax.jdo.annotations.InheritanceStrategy COMPLETE_TABLE;
    public static enum javax.jdo.annotations.InheritanceStrategy valueOf(java.lang.String);
    public static javax.jdo.annotations.InheritanceStrategy[] values();
}

public annotation javax.jdo.annotations.Join extends java.lang.annotation.Annotation
{
    abstract String table() default "";
    abstract String column() default "";
    abstract String indexed() default "";
    abstract String index() default "";
    abstract String unique() default "";
    abstract String uniqueKey() default "";
    abstract String outer() default "";
    abstract enum javax.jdo.annotations.ForeignKeyAction deleteAction() default javax.jdo.annotations.ForeignKeyAction.UNSPECIFIED;
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract String generatePrimaryKey() default "";
    abstract String primaryKey() default "";
    abstract String generateForeignKey() default "";
    abstract String foreignKey() default "";
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.Joins extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.Join[] value();
}

public annotation javax.jdo.annotations.Key extends java.lang.annotation.Annotation
{
    abstract Class[] types() default {};
    abstract String serialized() default "";
    abstract String embedded() default "";
    abstract javax.jdo.annotations.Embedded[] embeddedMapping() default {};
    abstract String dependent() default "";
    abstract String table() default "";
    abstract String column() default "";
    abstract enum javax.jdo.annotations.ForeignKeyAction deleteAction() default javax.jdo.annotations.ForeignKeyAction.UNSPECIFIED;
    abstract enum javax.jdo.annotations.ForeignKeyAction updateAction() default javax.jdo.annotations.ForeignKeyAction.UNSPECIFIED;
    abstract String indexed() default "";
    abstract String index() default "";
    abstract String unique() default "";
    abstract String uniqueKey() default "";
    abstract String mappedBy() default "";
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract String generateForeignKey() default "";
    abstract String foreignKey() default "";
    abstract Class converter() default javax.jdo.AttributeConverter$UseDefault.class;
    abstract boolean useDefaultConversion() default false;
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.NotPersistent extends java.lang.annotation.Annotation
{
}

public final enum javax.jdo.annotations.NullValue extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.NullValue NONE;
    public static final enum javax.jdo.annotations.NullValue EXCEPTION;
    public static final enum javax.jdo.annotations.NullValue DEFAULT;
    public static enum javax.jdo.annotations.NullValue valueOf(java.lang.String);
    public static javax.jdo.annotations.NullValue[] values();
}

public annotation javax.jdo.annotations.Order extends java.lang.annotation.Annotation
{
    abstract String column() default "";
    abstract String mappedBy() default "";
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.PersistenceAware extends java.lang.annotation.Annotation
{
}

public annotation javax.jdo.annotations.PersistenceCapable extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.Persistent[] members() default {};
    abstract String table() default "";
    abstract String catalog() default "";
    abstract String schema() default "";
    abstract String requiresExtent() default "";
    abstract String embeddedOnly() default "";
    abstract String detachable() default "";
    abstract enum javax.jdo.annotations.IdentityType identityType() default javax.jdo.annotations.IdentityType.UNSPECIFIED;
    abstract Class objectIdClass() default void.class;
    abstract javax.jdo.annotations.Extension[] extensions() default {};
    abstract String cacheable() default "true";
    abstract String serializeRead() default "false";
}

public final enum javax.jdo.annotations.PersistenceModifier extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.PersistenceModifier UNSPECIFIED;
    public static final enum javax.jdo.annotations.PersistenceModifier PERSISTENT;
    public static final enum javax.jdo.annotations.PersistenceModifier TRANSACTIONAL;
    public static final enum javax.jdo.annotations.PersistenceModifier NONE;
    public static enum javax.jdo.annotations.PersistenceModifier valueOf(java.lang.String);
    public static javax.jdo.annotations.PersistenceModifier[] values();
}

public annotation javax.jdo.annotations.Persistent extends java.lang.annotation.Annotation
{
    abstract enum javax.jdo.annotations.PersistenceModifier persistenceModifier() 
        default javax.jdo.annotations.PersistenceModifier.UNSPECIFIED;
    abstract String table() default "";
    abstract String defaultFetchGroup() default "";
    abstract enum javax.jdo.annotations.NullValue nullValue() default javax.jdo.annotations.NullValue.NONE;
    abstract String embedded() default "";
    abstract String embeddedElement() default "";
    abstract String embeddedKey() default "";
    abstract String embeddedValue() default "";
    abstract String serialized() default "";
    abstract String serializedElement() default "";
    abstract String serializedKey() default "";
    abstract String serializedValue() default "";
    abstract String dependent() default "";
    abstract String dependentElement() default "";
    abstract String dependentKey() default "";
    abstract String dependentValue() default "";
    abstract String primaryKey() default "";
    abstract enum javax.jdo.annotations.IdGeneratorStrategy valueStrategy() default javax.jdo.annotations.IdGeneratorStrategy.UNSPECIFIED;
    abstract String customValueStrategy() default "";
    abstract String sequence() default "";
    abstract String loadFetchGroup() default "";
    abstract Class[] types() default {};
    abstract String mappedBy() default "";
    abstract javax.jdo.annotations.Column[] columns() default {}; 
    abstract String column() default "";
    abstract String nullIndicatorColumn() default "";
    abstract String name() default ""; 
    abstract int recursionDepth() default 1;
    abstract Class converter() default javax.jdo.AttributeConverter$UseDefault.class;
    abstract boolean useDefaultConversion() default false;
    abstract javax.jdo.annotations.Extension[] extensions() default {};
    abstract String cacheable() default "true";
}

public annotation javax.jdo.annotations.PrimaryKey extends java.lang.annotation.Annotation
{
    abstract String name() default "";
    abstract String column() default "";
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.Queries extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.Query[] value();
}

public annotation javax.jdo.annotations.Query extends java.lang.annotation.Annotation
{
    abstract String name();
    abstract String value();
    abstract String language() default "JDOQL";
    abstract String unmodifiable() default "";
    abstract String unique() default "";
    abstract Class resultClass() default void.class;
    abstract String fetchPlan() default "";
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.Sequence extends java.lang.annotation.Annotation
{
    abstract String name();
    abstract enum javax.jdo.annotations.SequenceStrategy strategy();
    abstract String datastoreSequence() default "";
    abstract Class factoryClass() default void.class;
    abstract javax.jdo.annotations.Extension[] extensions() default {};
    abstract int initialValue() default 1;
    abstract int allocationSize() default 50;
}

public final enum javax.jdo.annotations.SequenceStrategy extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.SequenceStrategy NONTRANSACTIONAL;
    public static final enum javax.jdo.annotations.SequenceStrategy CONTIGUOUS;
    public static final enum javax.jdo.annotations.SequenceStrategy NONCONTIGUOUS;
    public static enum javax.jdo.annotations.SequenceStrategy valueOf(java.lang.String);
    public static javax.jdo.annotations.SequenceStrategy[] values();
}

public annotation javax.jdo.annotations.Serialized extends java.lang.annotation.Annotation
{
}

public annotation javax.jdo.annotations.Transactional extends java.lang.annotation.Annotation
{
}

public annotation javax.jdo.annotations.Unique extends java.lang.annotation.Annotation
{
    abstract String name() default "";
    abstract String table() default "";
    abstract String deferred() default "";
    abstract String[] members() default {};
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.Uniques extends java.lang.annotation.Annotation
{
    abstract javax.jdo.annotations.Unique[] value();
}

public annotation javax.jdo.annotations.Value extends java.lang.annotation.Annotation
{
    abstract Class[] types() default {};
    abstract String serialized() default "";
    abstract String embedded() default "";
    abstract javax.jdo.annotations.Embedded[] embeddedMapping() default {};
    abstract String dependent() default "";
    abstract String table() default "";
    abstract String column() default "";
    abstract enum javax.jdo.annotations.ForeignKeyAction deleteAction() default javax.jdo.annotations.ForeignKeyAction.UNSPECIFIED;
    abstract enum javax.jdo.annotations.ForeignKeyAction updateAction() default javax.jdo.annotations.ForeignKeyAction.UNSPECIFIED;
    abstract String indexed() default "";
    abstract String index() default "";
    abstract String unique() default "";
    abstract String uniqueKey() default "";
    abstract String mappedBy() default "";
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract String generateForeignKey() default "";
    abstract String foreignKey() default "";
    abstract Class converter() default javax.jdo.AttributeConverter$UseDefault.class;
    abstract boolean useDefaultConversion() default false;
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public annotation javax.jdo.annotations.Version extends java.lang.annotation.Annotation
{
    abstract enum javax.jdo.annotations.VersionStrategy strategy() default javax.jdo.annotations.VersionStrategy.UNSPECIFIED;
    abstract String customStrategy() default "";
    abstract String column() default "";
    abstract String indexed() default "";
    abstract javax.jdo.annotations.Column[] columns() default {};
    abstract javax.jdo.annotations.Extension[] extensions() default {};
}

public final enum javax.jdo.annotations.VersionStrategy extends java.lang.Enum
{
    public static final enum javax.jdo.annotations.VersionStrategy UNSPECIFIED;
    public static final enum javax.jdo.annotations.VersionStrategy NONE;
    public static final enum javax.jdo.annotations.VersionStrategy STATE_IMAGE;
    public static final enum javax.jdo.annotations.VersionStrategy DATE_TIME;
    public static final enum javax.jdo.annotations.VersionStrategy VERSION_NUMBER;
    public static enum javax.jdo.annotations.VersionStrategy valueOf(java.lang.String);
    public static javax.jdo.annotations.VersionStrategy[] values();
}

public annotation javax.jdo.annotations.Cacheable extends java.lang.annotation.Annotation
{
    abstract String value() default "true";
}

public interface javax.jdo.FetchGroup 
{
    public static final String DEFAULT = "default";
    public static final String RELATIONSHIP = "relationship";
    public static final String MULTIVALUED = "multivalued";
    public static final String BASIC = "basic";
    public static final String ALL = "all";
    abstract String getName();
    abstract Class getType();
    abstract boolean getPostLoad();
    abstract javax.jdo.FetchGroup setPostLoad(boolean postLoad);
    abstract javax.jdo.FetchGroup addMember(String memberName);
    abstract varargs javax.jdo.FetchGroup addMembers(String[] memberNames);
    abstract javax.jdo.FetchGroup removeMember(String memberName);
    abstract varargs javax.jdo.FetchGroup removeMembers(String[] memberNames);
    abstract javax.jdo.FetchGroup addCategory(String categoryName);
    abstract javax.jdo.FetchGroup removeCategory(String categoryName);
    abstract javax.jdo.FetchGroup setRecursionDepth(String memberName, int recursionDepth);
    abstract int getRecursionDepth(String memberName);
    abstract java.util.Set getMembers();
    abstract javax.jdo.FetchGroup setUnmodifiable();
    abstract boolean isUnmodifiable();
    abstract int hashCode();
    abstract boolean equals(Object other);
}

public interface javax.jdo.JDOQLTypedQuery extends java.io.Serializable, java.io.Closeable 
{
    public static final String QUERY_CLASS_PREFIX;
    abstract javax.jdo.query.PersistableExpression candidate();
    abstract javax.jdo.query.Expression parameter(String name, Class type);
    abstract javax.jdo.query.StringExpression stringParameter(String name);
    abstract javax.jdo.query.CharacterExpression characterParameter(String name);
    abstract javax.jdo.query.NumericExpression numericParameter(String name);
    javax.jdo.query.NumericExpression numericParameter(String name, Class type);
    abstract javax.jdo.query.DateExpression dateParameter(String name);
    abstract javax.jdo.query.TimeExpression timeParameter(String name);
    abstract javax.jdo.query.DateTimeExpression datetimeParameter(String name);
    abstract javax.jdo.query.CollectionExpression collectionParameter(String name);
    javax.jdo.query.CollectionExpression collectionParameter(String name, Class elementType);
    abstract javax.jdo.query.MapExpression mapParameter(String name);
    javax.jdo.query.MapExpression mapParameter(String name, Class keyType, Class valueType);
    abstract javax.jdo.query.ListExpression listParameter(String name);
    javax.jdo.query.ListExpression listParameter(String name, Class elementType);
    abstract javax.jdo.query.Expression variable(String name, Class type);
    abstract javax.jdo.JDOQLTypedQuery setCandidates(java.util.Collection candidates);
    abstract javax.jdo.JDOQLTypedQuery excludeSubclasses();
    abstract javax.jdo.JDOQLTypedQuery includeSubclasses();
    abstract javax.jdo.JDOQLTypedQuery filter(javax.jdo.query.BooleanExpression expr);
    abstract javax.jdo.query.IfThenElseExpression ifThen(java.lang.Class, javax.jdo.query.BooleanExpression, javax.jdo.query.Expression);
    abstract javax.jdo.query.IfThenElseExpression ifThen(javax.jdo.query.BooleanExpression, java.lang.Object);
    abstract javax.jdo.query.IfThenElseExpression ifThenElse(javax.jdo.query.BooleanExpression, java.lang.Object, java.lang.Object);
    abstract javax.jdo.query.IfThenElseExpression ifThenElse(javax.jdo.query.BooleanExpression, javax.jdo.query.Expression, java.lang.Object);
    abstract javax.jdo.query.IfThenElseExpression ifThenElse(javax.jdo.query.BooleanExpression, java.lang.Object, javax.jdo.query.Expression);
    abstract javax.jdo.query.IfThenElseExpression ifThenElse(java.lang.Class, javax.jdo.query.BooleanExpression, javax.jdo.query.Expression, javax.jdo.query.Expression);
    abstract varargs javax.jdo.JDOQLTypedQuery groupBy(javax.jdo.query.Expression[] exprs);
    abstract javax.jdo.JDOQLTypedQuery having(javax.jdo.query.Expression expr);
    abstract varargs javax.jdo.JDOQLTypedQuery orderBy(javax.jdo.query.OrderExpression[] orderExprs);
    abstract varargs javax.jdo.JDOQLTypedQuery result(boolean distinct, javax.jdo.query.Expression[] exprs);
    abstract javax.jdo.JDOQLTypedQuery range(javax.jdo.query.NumericExpression lowerInclExpr, javax.jdo.query.NumericExpression upperExclExpr);
    abstract javax.jdo.JDOQLTypedQuery range(long lowerIncl, long upperExcl);
    abstract javax.jdo.JDOQLTypedQuery range(javax.jdo.query.Expression paramLowerInclExpr, javax.jdo.query.Expression paramUpperExclExpr);
    abstract javax.jdo.JDOQLTypedSubquery subquery(String candidateAlias);
    abstract javax.jdo.JDOQLTypedSubquery subquery(Class candidate, String candidateAlias);
    abstract javax.jdo.JDOQLTypedSubquery subquery(javax.jdo.query.CollectionExpression candidateCollection, Class candidate , String candidateAlias);
    abstract javax.jdo.JDOQLTypedQuery setParameters(java.util.Map namedParamMap);
    abstract javax.jdo.JDOQLTypedQuery setParameter(javax.jdo.query.Expression paramExpr, Object value);
    abstract javax.jdo.JDOQLTypedQuery setParameter(String paramName, Object value);
    abstract java.util.List executeList();
    abstract Object executeUnique();
    abstract java.util.List executeResultList(Class resultCls);
    abstract Object executeResultUnique(Class resultCls);
    abstract java.util.List executeResultList();
    abstract Object executeResultUnique();
    abstract long deletePersistentAll();
    abstract Integer getDatastoreReadTimeoutMillis();
    abstract javax.jdo.JDOQLTypedQuery datastoreReadTimeoutMillis(Integer interval);
    abstract Integer getDatastoreWriteTimeoutMillis();
    abstract javax.jdo.JDOQLTypedQuery datastoreWriteTimeoutMillis(Integer interval);
    abstract Boolean getSerializeRead();
    abstract javax.jdo.JDOQLTypedQuery serializeRead(Boolean serialize);
    abstract boolean isUnmodifiable();
    abstract javax.jdo.JDOQLTypedQuery unmodifiable();
    abstract boolean getIgnoreCache();
    abstract javax.jdo.JDOQLTypedQuery ignoreCache(boolean flag);
    abstract javax.jdo.JDOQLTypedQuery extension(String key, Object value);
    abstract javax.jdo.JDOQLTypedQuery extensions(java.util.Map values);
    abstract javax.jdo.JDOQLTypedQuery saveAsNamedQuery(String name);
    abstract javax.jdo.PersistenceManager getPersistenceManager();
    abstract javax.jdo.FetchPlan getFetchPlan();
    abstract void cancelAll();
    abstract void cancel(Thread thread);
    abstract void close(Object result);
    abstract void closeAll();
    abstract String toString();
}

public interface javax.jdo.JDOQLTypedSubquery extends java.io.Serializable 
{
    abstract javax.jdo.query.PersistableExpression candidate();
    abstract javax.jdo.JDOQLTypedSubquery filter(javax.jdo.query.BooleanExpression expr);
    abstract varargs javax.jdo.JDOQLTypedSubquery groupBy(javax.jdo.query.Expression[] exprs);
    abstract javax.jdo.JDOQLTypedSubquery having(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.NumericExpression selectUnique(javax.jdo.query.NumericExpression expr);
    abstract javax.jdo.query.StringExpression selectUnique(javax.jdo.query.StringExpression expr);
    abstract javax.jdo.query.DateExpression selectUnique(javax.jdo.query.DateExpression expr);
    abstract javax.jdo.query.DateTimeExpression selectUnique(javax.jdo.query.DateTimeExpression expr);
    abstract javax.jdo.query.TimeExpression selectUnique(javax.jdo.query.TimeExpression expr);
    abstract javax.jdo.query.CharacterExpression selectUnique(javax.jdo.query.CharacterExpression expr);
    abstract javax.jdo.query.CollectionExpression select(javax.jdo.query.CollectionExpression expr);
}

public interface javax.jdo.query.BooleanExpression extends javax.jdo.query.ComparableExpression
{
    abstract javax.jdo.query.BooleanExpression and(javax.jdo.query.BooleanExpression expr);
    abstract javax.jdo.query.BooleanExpression or(javax.jdo.query.BooleanExpression expr);
    abstract javax.jdo.query.BooleanExpression not();
    abstract javax.jdo.query.BooleanExpression neg();
}

public interface javax.jdo.query.ByteExpression extends javax.jdo.query.ComparableExpression
{
}

public interface javax.jdo.query.CharacterExpression extends javax.jdo.query.ComparableExpression
{
    abstract javax.jdo.query.CharacterExpression toLowerCase();
    abstract javax.jdo.query.CharacterExpression toUpperCase();
    abstract javax.jdo.query.CharacterExpression neg();
    abstract javax.jdo.query.CharacterExpression com();
}

public interface javax.jdo.query.CollectionExpression extends javax.jdo.query.Expression
{
    abstract javax.jdo.query.BooleanExpression contains(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.BooleanExpression contains(Object elem);
    abstract javax.jdo.query.BooleanExpression isEmpty();
    abstract javax.jdo.query.NumericExpression size();
}

public interface javax.jdo.query.ComparableExpression extends javax.jdo.query.Expression
{
    abstract javax.jdo.query.BooleanExpression lt(javax.jdo.query.ComparableExpression expr);
    abstract javax.jdo.query.BooleanExpression lt(Object t);
    abstract javax.jdo.query.BooleanExpression lteq(javax.jdo.query.ComparableExpression expr);
    abstract javax.jdo.query.BooleanExpression lteq(Object t);
    abstract javax.jdo.query.BooleanExpression gt(javax.jdo.query.ComparableExpression expr);
    abstract javax.jdo.query.BooleanExpression gt(Object t);
    abstract javax.jdo.query.BooleanExpression gteq(javax.jdo.query.ComparableExpression expr);
    abstract javax.jdo.query.BooleanExpression gteq(Object t);
    abstract javax.jdo.query.ComparableExpression min();
    abstract javax.jdo.query.ComparableExpression max();
    abstract javax.jdo.query.OrderExpression asc();
    abstract javax.jdo.query.OrderExpression desc();
}

public interface javax.jdo.query.DateExpression extends javax.jdo.query.ComparableExpression
{
    abstract javax.jdo.query.NumericExpression getYear();
    abstract javax.jdo.query.NumericExpression getMonth();
    abstract javax.jdo.query.NumericExpression getDay();
}

public interface javax.jdo.query.DateTimeExpression extends javax.jdo.query.ComparableExpression
{
    abstract javax.jdo.query.NumericExpression getYear();
    abstract javax.jdo.query.NumericExpression getMonth();
    abstract javax.jdo.query.NumericExpression getDay();
    abstract javax.jdo.query.NumericExpression getHour();
    abstract javax.jdo.query.NumericExpression getMinute();
    abstract javax.jdo.query.NumericExpression getSecond();
}

public interface javax.jdo.query.EnumExpression extends javax.jdo.query.ComparableExpression
{
    abstract javax.jdo.query.NumericExpression ordinal();
}

public interface javax.jdo.query.Expression
{
    abstract javax.jdo.query.BooleanExpression eq(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.BooleanExpression eq(Object t);
    abstract javax.jdo.query.BooleanExpression ne(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.BooleanExpression ne(Object t);
    abstract javax.jdo.query.NumericExpression count();
    abstract javax.jdo.query.NumericExpression countDistinct();
    abstract javax.jdo.query.BooleanExpression instanceOf(Class cls);
    abstract javax.jdo.query.Expression cast(Class cls);
    abstract javax.jdo.query.Expression as(String alias);
}

public interface javax.jdo.query.ListExpression extends javax.jdo.query.CollectionExpression
{
    abstract javax.jdo.query.Expression get(javax.jdo.query.NumericExpression posExpr);
    abstract javax.jdo.query.Expression get(int pos);
}

public interface javax.jdo.query.MapExpression extends javax.jdo.query.Expression
{
    abstract javax.jdo.query.Expression get(javax.jdo.query.Expression);
    abstract javax.jdo.query.Expression get(java.lang.Object);
    abstract javax.jdo.query.BooleanExpression containsKey(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.BooleanExpression containsKey(Object key);
    abstract javax.jdo.query.BooleanExpression containsValue(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.BooleanExpression containsValue(Object value);
    abstract javax.jdo.query.BooleanExpression containsEntry(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.BooleanExpression containsEntry(java.util.Map$Entry entry);
    abstract javax.jdo.query.BooleanExpression isEmpty();
    abstract javax.jdo.query.NumericExpression size();
}

public interface javax.jdo.query.NumericExpression extends javax.jdo.query.ComparableExpression
{
    abstract javax.jdo.query.NumericExpression add(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.NumericExpression add(Number num);
    abstract javax.jdo.query.NumericExpression sub(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.NumericExpression sub(Number num);
    abstract javax.jdo.query.NumericExpression mul(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.NumericExpression mul(Number num);
    abstract javax.jdo.query.NumericExpression div(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.NumericExpression div(Number num);
    abstract javax.jdo.query.NumericExpression mod(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.NumericExpression mod(Number num);
    abstract javax.jdo.query.NumericExpression neg();
    abstract javax.jdo.query.NumericExpression com();
    abstract javax.jdo.query.NumericExpression avg();
    abstract javax.jdo.query.NumericExpression avgDistinct();
    abstract javax.jdo.query.NumericExpression sum();
    abstract javax.jdo.query.NumericExpression sumDistinct();
    abstract javax.jdo.query.NumericExpression abs();
    abstract javax.jdo.query.NumericExpression sqrt();
    abstract javax.jdo.query.NumericExpression acos();
    abstract javax.jdo.query.NumericExpression asin();
    abstract javax.jdo.query.NumericExpression atan();
    abstract javax.jdo.query.NumericExpression sin();
    abstract javax.jdo.query.NumericExpression cos();
    abstract javax.jdo.query.NumericExpression tan();
    abstract javax.jdo.query.NumericExpression exp();
    abstract javax.jdo.query.NumericExpression log();
    abstract javax.jdo.query.NumericExpression ceil();
    abstract javax.jdo.query.NumericExpression floor();
    abstract javax.jdo.query.NumericExpression bAnd(javax.jdo.query.NumericExpression bitExpr);
    abstract javax.jdo.query.NumericExpression bOr(javax.jdo.query.NumericExpression bitExpr);
    abstract javax.jdo.query.NumericExpression bXor(javax.jdo.query.NumericExpression bitExpr);
}

public interface javax.jdo.query.ObjectExpression extends javax.jdo.query.Expression
{
}

public interface javax.jdo.query.OrderExpression
{
    abstract enum javax.jdo.query.OrderExpression$OrderDirection getDirection();
    abstract javax.jdo.query.Expression getExpression();
    abstract enum javax.jdo.query.OrderExpression$OrderNullsPosition getNullsPosition();
    abstract javax.jdo.query.OrderExpression nullsFirst();
    abstract javax.jdo.query.OrderExpression nullsLast();
}

public interface javax.jdo.query.PersistableExpression extends javax.jdo.query.Expression
{
    abstract javax.jdo.query.Expression jdoObjectId();
    abstract javax.jdo.query.Expression jdoVersion();
}

public interface javax.jdo.query.StringExpression extends javax.jdo.query.ComparableExpression
{
    abstract javax.jdo.query.StringExpression add(javax.jdo.query.Expression expr);
    abstract javax.jdo.query.StringExpression add(java.lang.String);
    abstract javax.jdo.query.CharacterExpression charAt(int pos);
    abstract javax.jdo.query.CharacterExpression charAt(javax.jdo.query.NumericExpression pos);
    abstract javax.jdo.query.BooleanExpression endsWith(javax.jdo.query.StringExpression expr);
    abstract javax.jdo.query.BooleanExpression endsWith(String str);
    abstract javax.jdo.query.BooleanExpression equalsIgnoreCase(javax.jdo.query.StringExpression expr);
    abstract javax.jdo.query.BooleanExpression equalsIgnoreCase(String str);
    abstract javax.jdo.query.NumericExpression indexOf(javax.jdo.query.StringExpression expr);
    abstract javax.jdo.query.NumericExpression indexOf(String str);
    abstract javax.jdo.query.NumericExpression indexOf(javax.jdo.query.StringExpression expr, javax.jdo.query.NumericExpression pos);
    abstract javax.jdo.query.NumericExpression indexOf(String str, javax.jdo.query.NumericExpression pos);
    abstract javax.jdo.query.NumericExpression indexOf(String str, int pos);
    abstract javax.jdo.query.NumericExpression indexOf(javax.jdo.query.StringExpression expr, int pos);
    abstract javax.jdo.query.NumericExpression length();
    abstract javax.jdo.query.BooleanExpression matches(javax.jdo.query.StringExpression expr);
    abstract javax.jdo.query.BooleanExpression matches(String str);
    abstract javax.jdo.query.BooleanExpression startsWith(javax.jdo.query.StringExpression expr);
    abstract javax.jdo.query.BooleanExpression startsWith(String str);
    abstract javax.jdo.query.BooleanExpression startsWith(javax.jdo.query.StringExpression, int);
    abstract javax.jdo.query.BooleanExpression startsWith(java.lang.String, int);
    abstract javax.jdo.query.StringExpression substring(javax.jdo.query.NumericExpression pos);
    abstract javax.jdo.query.StringExpression substring(int pos);
    abstract javax.jdo.query.StringExpression substring(javax.jdo.query.NumericExpression startPos, javax.jdo.query.NumericExpression endPos);
    abstract javax.jdo.query.StringExpression substring(int startPos, int endPos);
    abstract javax.jdo.query.StringExpression toLowerCase();
    abstract javax.jdo.query.StringExpression toUpperCase();
    abstract javax.jdo.query.StringExpression trim();
}

public interface javax.jdo.query.SubqueryExpression
{
}

public interface javax.jdo.query.TimeExpression extends javax.jdo.query.ComparableExpression
{
    abstract javax.jdo.query.NumericExpression getHour();
    abstract javax.jdo.query.NumericExpression getMinute();
    abstract javax.jdo.query.NumericExpression getSecond();
}

/*** This causes some NPE in SignatureTest whatever that means ***/
/*
public interface javax.jdo.JDOEnhancer extends java.lang.instrument.ClassFileTransformer {
    java.util.Properties getProperties();
    javax.jdo.JDOEnhancer setVerbose(boolean flag);
    javax.jdo.JDOEnhancer setOutputDirectory(String dirName);
    javax.jdo.JDOEnhancer setClassLoader(ClassLoader loader);
    javax.jdo.JDOEnhancer addPersistenceUnit(String persistenceUnit);
    javax.jdo.JDOEnhancer addClass(String className, byte[] bytes);
    javax.jdo.JDOEnhancer addClasses(String... classNames);
    javax.jdo.JDOEnhancer addFiles(String... metadataFiles);
    javax.jdo.JDOEnhancer addJar(String jarFileName);
    int enhance();
    int validate();
    byte[] getEnhancedBytes(String className);
    void registerMetadata(javax.jdo.metadata.JDOMetadata metadata);
    javax.jdo.metadata.JDOMetadata newMetadata();
} */
