/** * Initialize this JavaTypeMapping with the given DatastoreAdapter for the given metadata. * @param mmd FieldMetaData for the field to be mapped (if any) * @param table The datastore container storing this mapping (if any) * @param clr the ClassLoaderResolver */ public void initialize(AbstractMemberMetaData mmd, Table table, ClassLoaderResolver clr) { initialize(mmd, table, clr, mmd.getEmbeddedMetaData(), mmd.getTypeName(), ObjectProvider.EMBEDDED_PC); }
public EmbeddedMetadata getEmbeddedMetadata() { EmbeddedMetaData internalEmbmd = getInternal().getEmbeddedMetaData(); EmbeddedMetadataImpl embmd = new EmbeddedMetadataImpl(internalEmbmd); embmd.parent = this; return embmd; }
private void insertEmbedded(Object value) { ObjectProvider embeddedSM = getEmbeddedObjectProvider(value); EmbeddedMetaData embeddedMetaData = mmd.getEmbeddedMetaData(); List<AbstractMemberMetaData> embeddedMmds = new ArrayList<AbstractMemberMetaData>(Arrays.asList(embeddedMetaData.getMemberMetaData())); insertMerge(embeddedSM, attributes, embeddedMmds, embeddedMetaData); }
/** * Gets the object that is embedded from child entry under the current entry * @return the object */ private Object fetchFromChild() { // use embedded meta data from field Collection<Object> children = fetchFromChildren(ArrayList.class, mmd, mmd.getEmbeddedMetaData()); if (children.size() == 0) { return null; } else if (children.size() == 1) { return children.iterator().next(); } else { throw new NucleusDataStoreException("Must be unique!"); } }
/** * Retrieves a list of Force.com columns with the given JPA field metadata. * <p> * This method can handle embedded JPA metadata. * * @param acmd JPA class metadata * @param ammd JPA field metadata * @param storeManager ForceStoreManager * @param columns list which will collect all embedded Force.com columns * @return a list of Force.com columns registered with this {@code TableImpl} */ public List<ColumnImpl> getColumnsFor(AbstractClassMetaData acmd, AbstractMemberMetaData ammd, ForceStoreManager storeManager, List<ColumnImpl> columns) { if (ammd.getEmbeddedMetaData() != null) { for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { getColumnsFor(acmd, eammd, storeManager, columns); } } else { columns.add(getColumnFor(acmd, ammd)); } return columns; }
/** * Retrieves a list of Force.com columns with the given JPA field metadata. * <p> * This method can handle embedded JPA metadata. * * @param acmd JPA class metadata * @param ammd JPA field metadata * @param storeManager ForceStoreManager * @param columns list which will collect all embedded Force.com columns * @return a list of Force.com columns registered with this {@code TableImpl} */ public List<ColumnImpl> getColumnsFor(AbstractClassMetaData acmd, AbstractMemberMetaData ammd, ForceStoreManager storeManager, List<ColumnImpl> columns) { if (ammd.getEmbeddedMetaData() != null) { for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { getColumnsFor(acmd, eammd, storeManager, columns); } } else { columns.add(getColumnFor(acmd, ammd)); } return columns; }
public static boolean isEmbeddedField(AbstractMemberMetaData mmd) { return mmd.getEmbeddedMetaData() != null || (mmd.getElementMetaData() != null && mmd.getElementMetaData().getEmbeddedMetaData() != null); }
private void addColumn(TableImpl table, AbstractMemberMetaData ammd, OMFContext omf) { if (PersistenceUtils.isNonPersistedColumn(ammd)) return; if (ammd.getEmbeddedMetaData() != null) { for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { addColumn(table, eammd, omf); } } else { ColumnImpl col = table.getColumnByForceApiName(PersistenceUtils.getForceApiName(ammd, omf)); if (col != null) { String javaFieldName = ammd.getName(); table.registerJavaColumn(javaFieldName, col); } } }
private void addColumn(TableImpl table, AbstractMemberMetaData ammd, OMFContext omf) { if (PersistenceUtils.isNonPersistedColumn(ammd)) return; if (ammd.getEmbeddedMetaData() != null) { for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { addColumn(table, eammd, omf); } } else { ColumnImpl col = table.getColumnByForceApiName(PersistenceUtils.getForceApiName(ammd, omf)); if (col != null) { String javaFieldName = ammd.getName(); table.registerJavaColumn(javaFieldName, col); } } }
@Override public boolean isForeignJoinColumn(EntityType<?> ownerType, String attributeName) { ManagedTypeImpl<?> managedType = (ManagedTypeImpl<?>) ownerType; String[] parts = attributeName.split("\\."); AbstractMemberMetaData metaData = managedType.getMetadata().getMetaDataForMember(parts[0]); for (int i = 1; i < parts.length; i++) { EmbeddedMetaData embeddedMetaData = metaData.getEmbeddedMetaData(); if (embeddedMetaData == null) { // Probably trying to access the id attribute of a ToMany relation return metaData.getJoinMetaData() != null; } else { AbstractMemberMetaData[] metaDatas = embeddedMetaData.getMemberMetaData(); metaData = null; for (int j = 0; j < metaDatas.length; j++) { if (parts[i].equals(metaDatas[j].getName())) { metaData = metaDatas[j]; break; } } if (metaData == null) { throw new IllegalArgumentException("Could not find property '" + parts[i] + "' in embeddable type: " + ((AbstractMemberMetaData) embeddedMetaData.getParent()).getType().getName()); } } } return metaData.getJoinMetaData() != null; }
/** * Gets the object that is embedded within the current entry. * @return the object */ private Object fetchEmbedded() { // use embedded meta data from field EmbeddedMetaData embeddedMetaData = mmd.getEmbeddedMetaData(); // use field meta data from embedded meta data List<AbstractMemberMetaData> embeddedMmds = new ArrayList<AbstractMemberMetaData>(Arrays.asList(embeddedMetaData.getMemberMetaData())); // TODO Provide the owner in this call ObjectProvider embeddedSM = ec.getNucleusContext().getObjectProviderFactory().newForEmbedded(ec, effectiveClassMetaData, null, -1); // TODO Why get SM just after creating it???? embeddedSM = getEmbeddedObjectProvider(embeddedSM.getObject()); return fetchMerge(embeddedSM, attributes, embeddedMmds, embeddedMetaData); }
@Override public boolean isForeignJoinColumn(EntityType<?> ownerType, String attributeName) { ManagedTypeImpl<?> managedType = (ManagedTypeImpl<?>) ownerType; String[] parts = attributeName.split("\\."); AbstractMemberMetaData metaData = managedType.getMetadata().getMetaDataForMember(parts[0]); for (int i = 1; i < parts.length; i++) { EmbeddedMetaData embeddedMetaData = metaData.getEmbeddedMetaData(); if (embeddedMetaData == null) { // Probably trying to access the id attribute of a ToMany relation return metaData.getJoinMetaData() != null; } else { AbstractMemberMetaData[] metaDatas = embeddedMetaData.getMemberMetaData(); metaData = null; for (int j = 0; j < metaDatas.length; j++) { if (parts[i].equals(metaDatas[j].getName())) { metaData = metaDatas[j]; break; } } if (metaData == null) { throw new IllegalArgumentException("Could not find property '" + parts[i] + "' in embeddable type: " + ((AbstractMemberMetaData) embeddedMetaData.getParent()).getType().getName()); } } } return metaData.getJoinMetaData() != null; }
private void storeEmbeddedFields(AbstractMemberMetaData ammd, Object value) { AbstractClassMetaData cmd = objectProvider.getClassMetaData(); for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { if (eammd.getPersistenceModifier() != FieldPersistenceModifier.PERSISTENT) continue; try { Object newValue = PersistenceUtils.getMemberValue(eammd.getMemberRepresented(), value); if (eammd.getEmbeddedMetaData() != null) { storeEmbeddedFields(eammd, newValue); } else { ColumnImpl column = table.getColumnFor(cmd, eammd); if (column != null) { sobject.addField(column.getFieldName(), newValue); dirty = true; } } } catch (Exception e) { throw new NucleusUserException(e.getMessage()); } } }
private void storeEmbeddedFields(AbstractMemberMetaData ammd, Object value) { AbstractClassMetaData cmd = objectProvider.getClassMetaData(); for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { if (eammd.getPersistenceModifier() != FieldPersistenceModifier.PERSISTENT) continue; try { Object newValue = PersistenceUtils.getMemberValue(eammd.getMemberRepresented(), value); if (eammd.getEmbeddedMetaData() != null) { storeEmbeddedFields(eammd, newValue); } else { ColumnImpl column = table.getColumnFor(cmd, eammd); if (column != null) { sobject.addField(column.getFieldName(), newValue); dirty = true; } } } catch (Exception e) { throw new NucleusUserException(e.getMessage()); } } }
protected static void selectAllFieldsOfEmbeddedObject(AbstractMemberMetaData mmd, BasicDBObject fieldsSelection, ExecutionContext ec, ClassLoaderResolver clr) { EmbeddedMetaData embmd = mmd.getEmbeddedMetaData(); AbstractMemberMetaData[] embmmds = embmd.getMemberMetaData(); for (int i=0;i<embmmds.length;i++) { RelationType relationType = embmmds[i].getRelationType(clr); if (embmmds[i].isEmbedded() && RelationType.isRelationSingleValued(relationType)) { selectAllFieldsOfEmbeddedObject(embmmds[i], fieldsSelection, ec, clr); } else { fieldsSelection.append(MongoDBUtils.getFieldName(mmd, i), 1); } } }
private void updateEmbedded(Object value) { if (value == null) { // create an instance with empty fields, this will null-out all embedded fields // TODO Populate the owner object in this call ObjectProvider embeddedSM = ec.getNucleusContext().getObjectProviderFactory().newForEmbedded(ec, effectiveClassMetaData, null, -1); int[] allMemberPositions = embeddedSM.getClassMetaData().getAllMemberPositions(); for (int i : allMemberPositions) { embeddedSM.makeDirty(i); } //get the dummy value value = embeddedSM.getObject(); } ObjectProvider embeddedSM = ec.findObjectProvider(value); boolean insert = false; if (embeddedSM == null) { embeddedSM = getEmbeddedObjectProvider(value); insert = true; } EmbeddedMetaData embeddedMetaData = mmd.getEmbeddedMetaData(); List<AbstractMemberMetaData> embeddedMmds = new ArrayList<AbstractMemberMetaData>(Arrays.asList(embeddedMetaData.getMemberMetaData())); updateMerge(embeddedSM, attributes, embeddedMmds, embeddedMetaData, insert); }
private Object fetchEmbeddedObject(AbstractMemberMetaData ammd) { if (objectProvider == null) return null; AbstractClassMetaData cmd = storeManager.getMetaDataManager().getMetaDataForClass(ammd.getType(), ec.getClassLoaderResolver()); Object obj = null; try { obj = ec.getClassLoaderResolver().classForName(cmd.getFullClassName(), true).newInstance(); for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { PersistenceUtils.setFieldValue(ammd.getType(), cmd, cmd.getAbsolutePositionOfMember(eammd.getName()), obj, fetchObjectField(eammd, null)); } ec.findObjectProviderForEmbedded(obj, objectProvider, ammd); } catch (Exception e) { throw new NucleusUserException(e.getMessage(), e); } return obj; } }
private Object fetchEmbeddedObject(AbstractMemberMetaData ammd) { if (objectProvider == null) return null; AbstractClassMetaData cmd = storeManager.getMetaDataManager().getMetaDataForClass(ammd.getType(), ec.getClassLoaderResolver()); Object obj = null; try { obj = ec.getClassLoaderResolver().classForName(cmd.getFullClassName(), true).newInstance(); for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { PersistenceUtils.setFieldValue(ammd.getType(), cmd, cmd.getAbsolutePositionOfMember(eammd.getName()), obj, fetchObjectField(eammd, null)); } ec.findObjectProviderForEmbedded(obj, objectProvider, ammd); } catch (Exception e) { throw new NucleusUserException(e.getMessage(), e); } return obj; } }
@Override public void initialize(AbstractMemberMetaData mmd, DatastoreContainerObject container, ClassLoaderResolver clr) { MetaDataManager mmgr = container.getStoreManager().getMetaDataManager(); if (mmd.getEmbeddedMetaData() == null) { EmbeddedMetaData embmd = new EmbeddedMetaData(); embmd.setOwnerMember(mmd.getName()); mmd.setEmbeddedMetaData(embmd); embmd.populate(clr, null, mmgr); embmd.initialise(clr, mmgr); } super.initialize(mmd, container, clr); } }
private void updateListOfMissingFields() { for (AbstractMemberMetaData ammd : findAllFields()) { validateColumn(ammd, storeManager.getOMFContext()); AbstractClassMetaData relatedEntity = storeManager.getMetaDataManager().getMetaDataForEntityName(ammd.getType().getSimpleName()); if (relatedEntity != null && relatedEntity.isEmbeddedOnly()) { // Add all embedded fields to embedding entity for (AbstractMemberMetaData eammd : ammd.getEmbeddedMetaData().getMemberMetaData()) { addFieldToListIfAbsent(eammd, storeManager); } } else { addFieldToListIfAbsent(ammd, storeManager); } } // If there is a discriminator column add that too if (cmd.getSuperAbstractClassMetaData() == null && cmd.getDiscriminatorMetaData() != null && cmd.getDiscriminatorMetaData().getColumnMetaData() != null) { ColumnMetaData colmd = cmd.getDiscriminatorMetaData().getColumnMetaData(); addFieldToListIfAbsent(new ForceMemberMetaData(colmd, colmd.getName()) { @Override public Class<?> getType() { return String.class; } }, storeManager); } }