001 package org.cumulus4j.store.model;
002
003 import java.util.Collection;
004 import java.util.Map;
005
006 import javax.jdo.JDOObjectNotFoundException;
007 import javax.jdo.PersistenceManager;
008 import javax.jdo.Query;
009
010 public class ClassMetaDAO extends AbstractDAO {
011
012 public ClassMetaDAO() { }
013
014 public ClassMetaDAO(PersistenceManager pm) {
015 super(pm);
016 }
017
018 public static String getMultiClassMetaOrFilterPart(Map<String, Object> queryParams, Collection<ClassMeta> classMetas) {
019 StringBuilder result = new StringBuilder();
020
021 if (classMetas.size() > 1)
022 result.append('(');
023
024 int idx = -1;
025 for (ClassMeta classMeta : classMetas) {
026 if (++idx > 0)
027 result.append(" || ");
028
029 String classMetaClassIDParamName = "classMeta_classID" + idx;
030 result.append("this.classMeta_classID == :").append(classMetaClassIDParamName);
031 queryParams.put(classMetaClassIDParamName, classMeta.getClassID());
032 }
033
034 if (classMetas.size() > 1)
035 result.append(')');
036
037 return result.toString();
038 }
039
040 public ClassMeta getClassMeta(String packageName, String simpleClassName, boolean throwExceptionIfNotFound)
041 {
042 Query q = pm.newNamedQuery(ClassMeta.class, ClassMeta.NamedQueries.getClassMetaByPackageNameAndSimpleClassName);
043 ClassMeta result = (ClassMeta) q.execute(ClassMeta.UNIQUE_SCOPE_CLASS_META, packageName, simpleClassName);
044
045 if (result == null && throwExceptionIfNotFound)
046 throw new JDOObjectNotFoundException(
047 "No ClassMeta found for packageName=\"" + packageName + "\" and simpleClassName=\"" + simpleClassName + "\"!"
048 );
049
050 return result;
051 }
052
053 public ClassMeta getClassMeta(Class<?> clazz, boolean throwExceptionIfNotFound)
054 {
055 String packageName = clazz.getPackage() == null ? "" : clazz.getPackage().getName();
056 String simpleClassName = clazz.getSimpleName();
057 return getClassMeta(packageName, simpleClassName, throwExceptionIfNotFound);
058 }
059
060 public ClassMeta getClassMeta(long classID, boolean throwExceptionIfNotFound)
061 {
062 // We cannot use pm.getObjectById(...), because GAE uses a GAE-specific identity
063 Object identity = ObjectIdFactory.getInstance().createObjectId(ClassMeta.class, classID);
064 try {
065 ClassMeta classMeta = (ClassMeta) pm.getObjectById(identity);
066 return classMeta;
067 } catch (JDOObjectNotFoundException x) {
068 if (throwExceptionIfNotFound)
069 throw x;
070 else
071 return null;
072 }
073 }
074
075 public EmbeddedClassMeta getEmbeddedClassMeta(FieldMeta embeddingFieldMeta, boolean throwExceptionIfNotFound) {
076 Query q = pm.newNamedQuery(EmbeddedClassMeta.class, EmbeddedClassMeta.NamedQueries.getEmbeddedClassMetaByEmbeddingFieldMeta_fieldID);
077 EmbeddedClassMeta result = (EmbeddedClassMeta) q.execute(embeddingFieldMeta.getFieldID());
078
079 // EmbeddedClassMeta result;
080 // @SuppressWarnings("unchecked")
081 // Collection<EmbeddedClassMeta> c = (Collection<EmbeddedClassMeta>) q.execute(embeddingFieldMeta);
082 // if (c.size() == 1)
083 // result = c.iterator().next();
084 // else if (c.isEmpty())
085 // result = null;
086 // else
087 // throw new IllegalStateException("Found multiple EmbeddeClassMeta instances: " + c);
088
089 if (result == null && throwExceptionIfNotFound)
090 throw new JDOObjectNotFoundException(
091 "No EmbeddedClassMeta found with embeddingFieldMeta=\"" + embeddingFieldMeta + "\"!"
092 );
093
094 return result;
095 }
096 }