PageRenderTime 27ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/com/google/appengine/datanucleus/mapping/InsertMappingConsumer.java

http://datanucleus-appengine.googlecode.com/
Java | 103 lines | 60 code | 15 blank | 28 comment | 13 complexity | 5748f12b54e4f8d1c4fae7944f29fbfb MD5 | raw file
Possible License(s): Apache-2.0
  1. /**********************************************************************
  2. Copyright (c) 2009 Google Inc.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. **********************************************************************/
  13. package com.google.appengine.datanucleus.mapping;
  14. import org.datanucleus.metadata.AbstractClassMetaData;
  15. import org.datanucleus.metadata.AbstractMemberMetaData;
  16. import org.datanucleus.metadata.ColumnMetaData;
  17. import org.datanucleus.store.mapped.DatastoreField;
  18. import org.datanucleus.store.mapped.mapping.JavaTypeMapping;
  19. import org.datanucleus.store.mapped.mapping.MappingCallbacks;
  20. import org.datanucleus.store.mapped.mapping.MappingConsumer;
  21. import org.datanucleus.store.mapped.mapping.PersistableMapping;
  22. import org.datanucleus.store.mapped.mapping.ReferenceMapping;
  23. import com.google.appengine.datanucleus.Utils;
  24. import java.util.ArrayList;
  25. import java.util.List;
  26. import java.util.Map;
  27. /**
  28. * {@link MappingConsumer} implementation that is used for the insertions.
  29. * Largely based on DataNucleus RDBMS InsertMappingConsumer.
  30. *
  31. * @author Max Ross <maxr@google.com>
  32. */
  33. public class InsertMappingConsumer implements MappingConsumer {
  34. private final List<MappingCallbacks> mc = new ArrayList<MappingCallbacks>();
  35. private final Map<Integer, AbstractMemberMetaData> fieldIndexToMemberMetaData = Utils.newHashMap();
  36. private final AbstractClassMetaData cmd;
  37. // running tally of the number of fields we've consumed
  38. // we assume that fields are consumed in fieldIndex order
  39. private int numFields = 0;
  40. public InsertMappingConsumer(AbstractClassMetaData cmd) {
  41. this.cmd = cmd;
  42. }
  43. public void preConsumeMapping(int highestFieldNumber) {
  44. }
  45. public void consumeMapping(JavaTypeMapping m, AbstractMemberMetaData fmd) {
  46. if (!fmd.getAbstractClassMetaData().isSameOrAncestorOf(cmd)) {
  47. // Make sure we only accept mappings from the correct part of any inheritance tree
  48. return;
  49. }
  50. if (m.getNumberOfDatastoreMappings() == 0 &&
  51. (m instanceof PersistableMapping || m instanceof ReferenceMapping)) {
  52. // Reachable Fields (that relate to this object but have no column in the table)
  53. } else {
  54. // Fields to be "inserted" (that have a datastore column)
  55. // Check if the field is "insertable" (either using JPA column, or JDO extension)
  56. if (fmd.hasExtension("insertable") && fmd.getValueForExtension("insertable").equalsIgnoreCase("false")) {
  57. return;
  58. }
  59. ColumnMetaData[] colmds = fmd.getColumnMetaData();
  60. if (colmds != null && colmds.length > 0) {
  61. for (ColumnMetaData colmd : colmds) {
  62. if (!colmd.getInsertable()) {
  63. // Not to be inserted
  64. return;
  65. }
  66. }
  67. }
  68. }
  69. fieldIndexToMemberMetaData.put(numFields++, fmd);
  70. if (m instanceof MappingCallbacks) {
  71. mc.add((MappingCallbacks) m);
  72. }
  73. }
  74. public void consumeMapping(JavaTypeMapping m, int mappingType) {}
  75. public void consumeUnmappedDatastoreField(DatastoreField fld) {}
  76. public List<MappingCallbacks> getMappingCallbacks() {
  77. return mc;
  78. }
  79. public AbstractMemberMetaData getMemberMetaDataForIndex(int index) {
  80. return fieldIndexToMemberMetaData.get(index);
  81. }
  82. public Map<Integer, AbstractMemberMetaData> getFieldIndexToMemberMetaData() {
  83. return fieldIndexToMemberMetaData;
  84. }
  85. }