001 /*
002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org
003 * Copyright (C) 2011 NightLabs Consulting GmbH
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program. If not, see <http://www.gnu.org/licenses/>.
017 */
018 package org.cumulus4j.store.model;
019
020 import java.util.List;
021
022 import javax.jdo.PersistenceManager;
023
024 import org.cumulus4j.store.Cumulus4jStoreManager;
025 import org.cumulus4j.store.crypto.CryptoContext;
026 import org.datanucleus.ExecutionContext;
027
028 /**
029 * Helper to find an {@link IndexEntry} for an object relation (1-1, 1-n or m-n).
030 * Even though {@link DefaultIndexEntryFactory} and {@link IndexEntryLong} are used for such relations, these
031 * classes should <b>not</b> be directly accessed in order to make refactorings easier (if this class is used for all
032 * object relations, it is possible to search for references of this class).
033 *
034 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
035 */
036 public class IndexEntryObjectRelationHelper
037 {
038 private static final IndexEntryFactory indexEntryFactoryLong = new DefaultIndexEntryFactory(IndexEntryLong.class);
039
040 public static IndexEntryFactory getIndexEntryFactory() {
041 return indexEntryFactoryLong;
042 }
043
044 public static List<IndexEntry> getIndexEntriesIncludingSubClasses(CryptoContext cryptoContext, PersistenceManager pmIndex, FieldMeta fieldMeta, ClassMeta classMeta, Long indexedDataEntryID)
045 {
046 ExecutionContext ec = cryptoContext.getExecutionContext();
047 Cumulus4jStoreManager storeManager = (Cumulus4jStoreManager) ec.getStoreManager();
048 List<ClassMeta> classMetaWithSubClassMetas = storeManager.getClassMetaWithSubClassMetas(ec, classMeta);
049 return getIndexEntries(cryptoContext, pmIndex, fieldMeta, classMetaWithSubClassMetas, indexedDataEntryID);
050 }
051
052 public static List<IndexEntry> getIndexEntries(CryptoContext cryptoContext, PersistenceManager pmIndex, FieldMeta fieldMeta, List<ClassMeta> classMetas, Long indexedDataEntryID)
053 {
054 // List<IndexEntry> result = new ArrayList<IndexEntry>(classMetas.size());
055 // for (ClassMeta classMeta : classMetas) {
056 // IndexEntry indexEntry = getIndexEntry(cryptoContext, pmIndex, fieldMeta, classMeta, indexedDataEntryID);
057 // if (indexEntry != null)
058 // result.add(indexEntry);
059 // }
060 // return result;
061 return indexEntryFactoryLong.getIndexEntries(cryptoContext, pmIndex, fieldMeta, classMetas, indexedDataEntryID);
062 }
063
064 /**
065 * Get an existing {@link IndexEntry} or <code>null</code>, if it does not exist.
066 * This method looks up an <code>IndexEntry</code> for a relation to the object referenced
067 * by the given <code>indexedDataEntryID</code> and the relation-type specified by the given <code>fieldMeta</code>.
068 * @param cryptoContext the crypto-context.
069 * @param pmIndex the backend-<code>PersistenceManager</code> used to access the index-datastore.
070 * @param fieldMeta the field pointing to the referenced object.
071 * @param classMeta the concrete owner type holding the field (might be a sub-class of {@link FieldMeta#getClassMeta() fieldMeta.classMeta}.
072 * @param indexedDataEntryID the {@link DataEntry#getDataEntryID() DataEntry.dataEntryID} of the referenced object.
073 * @return the appropriate {@link IndexEntry} or <code>null</code>.
074 */
075 public static IndexEntry getIndexEntry(CryptoContext cryptoContext, PersistenceManager pmIndex, FieldMeta fieldMeta, ClassMeta classMeta, Long indexedDataEntryID)
076 {
077 return indexEntryFactoryLong.getIndexEntry(cryptoContext, pmIndex, fieldMeta, classMeta, indexedDataEntryID);
078 }
079
080 /**
081 * Get an existing {@link IndexEntry} or create it, if it does not yet exist. This method behaves
082 * just like {@link #getIndexEntry(CryptoContext, PersistenceManager, FieldMeta, ClassMeta, Long)}, but instead of returning <code>null</code>,
083 * it creates an <code>IndexEntry</code>, if it does not yet exist.
084 * @param cryptoContext the crypto-context.
085 * @param pmIndex the backend-<code>PersistenceManager</code> used to access the index-datastore.
086 * @param fieldMeta the field pointing to the referenced object.
087 * @param classMeta the concrete owner type holding the field (might be a sub-class of {@link FieldMeta#getClassMeta() fieldMeta.classMeta}.
088 * @param indexedDataEntryID the {@link DataEntry#getDataEntryID() DataEntry.dataEntryID} of the referenced object.
089 * @return the appropriate {@link IndexEntry}; never <code>null</code>.
090 */
091 public static IndexEntry createIndexEntry(CryptoContext cryptoContext, PersistenceManager pmIndex, FieldMeta fieldMeta, ClassMeta classMeta, Long indexedDataEntryID)
092 {
093 return indexEntryFactoryLong.createIndexEntry(cryptoContext, pmIndex, fieldMeta, classMeta, indexedDataEntryID);
094 }
095 }