/** * Method to generate a new query using the passed query as basis. * * @param language The query language * @param ec ExecutionContext * @param query The query filter (String) or a previous Query * @return The Query */ public Query newQuery(String language, ExecutionContext ec, Object query) { if (language == null) { return null; } String languageImpl = language; // Find the query support for this language and this datastore if (query == null) { // TODO We don't have candidate so don't know the StoreManager to use throw new NucleusException("Not yet supported for queries with unknown candidate"); } if (query instanceof String) { // Single-string query String queryString = (String) query; String candidateName = null; if (languageImpl.equalsIgnoreCase("JDOQL") && queryString.toUpperCase().indexOf(" FROM ") > 0) { int candidateStart = queryString.toUpperCase().indexOf(" FROM ") + 6; int candidateEnd = queryString.indexOf(" ", candidateStart + 1); candidateName = queryString.substring(candidateStart, candidateEnd); } if (candidateName != null) { ClassLoaderResolver clr = nucleusCtx.getClassLoaderResolver(null); AbstractClassMetaData cmd = nucleusCtx.getMetaDataManager().getMetaDataForClass(candidateName, clr); StoreManager classStoreMgr = ((FederatedStoreManager) storeMgr).getStoreManagerForClass(cmd); return classStoreMgr.getQueryManager().newQuery(languageImpl, ec, query); } // TODO Extract the candidate for this query // TODO Find StoreManager for the candidate throw new NucleusException("Not yet supported for single-string queries"); } else if (query instanceof Query) { // Based on previous query StoreManager storeMgr = ((Query) query).getStoreManager(); return storeMgr.getQueryManager().newQuery(languageImpl, ec, query); } else { if (query instanceof Class) { // Find StoreManager for the candidate Class cls = (Class) query; ClassLoaderResolver clr = nucleusCtx.getClassLoaderResolver(cls.getClassLoader()); AbstractClassMetaData cmd = nucleusCtx.getMetaDataManager().getMetaDataForClass(cls, clr); StoreManager classStoreMgr = ((FederatedStoreManager) storeMgr).getStoreManagerForClass(cmd); return classStoreMgr.getQueryManager().newQuery(languageImpl, ec, query); } throw new NucleusException( "Not yet supported for queries taking in object of type " + query.getClass()); } }