private StoreData buildStoreDataWithTable(ClassMetaData cmd, DatastoreTable table) { MappedStoreData sd = new MappedStoreData(cmd, table, false); registerStoreData(sd); sd.setDatastoreContainerObject(table); table.manageClass(cmd); return sd; }
/** * This method requires synchronization so that we don't end up registering the same property more * than once. */ @Override protected synchronized StoreData newStoreData(ClassMetaData cmd, ClassLoaderResolver clr) { InheritanceStrategy strat = cmd.getInheritanceMetaData().getStrategy(); // The overarching rule for supported inheritance strategies is that we // don't split the state of an object across multiple entities. // TODO This is all nonsense. This datastore only allows "COMPLETE_TABLE" really so ignore the // inheritance // and remove the need for DatastoreClass if (strat == InheritanceStrategy.SUBCLASS_TABLE) { // Table mapped into the table(s) of subclass(es) // Just add the SchemaData entry with no table - managed by subclass return buildStoreDataWithNoTable(cmd); } else if (strat == InheritanceStrategy.COMPLETE_TABLE) { if (cmd.isAbstract()) { // Abstract class with "complete-table" so gets no table return buildStoreDataWithNoTable(cmd); } return buildStoreData(cmd, clr); } else if (strat == InheritanceStrategy.NEW_TABLE && (cmd.getSuperAbstractClassMetaData() == null || cmd.getSuperAbstractClassMetaData().getInheritanceMetaData().getStrategy() == InheritanceStrategy.SUBCLASS_TABLE)) { // New Table means you store your fields and your fields only (no fields from superclasses). // This only ok if you don't have a persistent superclass or your persistent superclass has // delegated responsibility for storing its fields to you. return buildStoreData(cmd, clr); } else if (MetaDataUtils.isNewOrSuperclassTableInheritanceStrategy(cmd)) { // Table mapped into table of superclass // Find the superclass - should have been created first AbstractClassMetaData[] managingCmds = getClassesManagingTableForClass(cmd, clr); DatastoreTable superTable; if (managingCmds != null && managingCmds.length == 1) { MappedStoreData superData = (MappedStoreData) storeDataMgr.get(managingCmds[0].getFullClassName()); if (superData != null) { // Specify the table if it already exists superTable = (DatastoreTable) superData.getDatastoreContainerObject(); return buildStoreDataWithTable(cmd, superTable); } } } // TODO Don't do this. GAE basically supports "complete-table" always so we should just ignore // any // inheritance metadata that implies otherwise. boolean jpa = getApiAdapter().getName().equalsIgnoreCase("JPA"); String unsupportedMsg = GAE_LOCALISER.msg( jpa ? "AppEngine.BadInheritance.JPA" : "AppEngine.BadInheritance.JDO", cmd.getInheritanceMetaData().getStrategy().toString(), cmd.getFullClassName(), getApiAdapter().getName()); throw new UnsupportedInheritanceStrategyException(unsupportedMsg); }