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

/src/com/google/appengine/datanucleus/query/QueryEntityPKFetchFieldManager.java

http://datanucleus-appengine.googlecode.com/
Java | 125 lines | 79 code | 19 blank | 27 comment | 13 complexity | 1b7628dddb116f66cd53717e2087dd7a MD5 | raw file
Possible License(s): Apache-2.0
  1. /**********************************************************************
  2. Copyright (c) 2011 Andy Jefferson and others. All rights reserved.
  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. Contributors:
  13. ...
  14. **********************************************************************/
  15. package com.google.appengine.datanucleus.query;
  16. import org.datanucleus.exceptions.NucleusFatalUserException;
  17. import org.datanucleus.metadata.AbstractClassMetaData;
  18. import org.datanucleus.metadata.AbstractMemberMetaData;
  19. import org.datanucleus.store.fieldmanager.AbstractFieldManager;
  20. import com.google.appengine.api.datastore.Entity;
  21. import com.google.appengine.api.datastore.Key;
  22. import com.google.appengine.api.datastore.KeyFactory;
  23. import com.google.appengine.datanucleus.DatastoreManager;
  24. import com.google.appengine.datanucleus.MetaDataUtils;
  25. /**
  26. * Simple implementation of a field manager for fetching values out of queries.
  27. * This version simply retrieves PK fields, so we can get hold of the identity.
  28. * FetchFieldManager really ought to be rewritten to follow this style rather than having
  29. * stacks of FetchState or whatever.
  30. */
  31. public class QueryEntityPKFetchFieldManager extends AbstractFieldManager {
  32. /** Metadata for the candidate class. */
  33. AbstractClassMetaData cmd;
  34. Entity datastoreEntity;
  35. public QueryEntityPKFetchFieldManager(AbstractClassMetaData cmd, Entity entity) {
  36. this.cmd = cmd;
  37. this.datastoreEntity = entity;
  38. }
  39. public boolean fetchBooleanField(int fieldNumber) {
  40. return (Boolean) fetchObjectField(fieldNumber);
  41. }
  42. public byte fetchByteField(int fieldNumber) {
  43. return (Byte) fetchObjectField(fieldNumber);
  44. }
  45. public char fetchCharField(int fieldNumber) {
  46. return (Character) fetchObjectField(fieldNumber);
  47. }
  48. public double fetchDoubleField(int fieldNumber) {
  49. return (Double) fetchObjectField(fieldNumber);
  50. }
  51. public float fetchFloatField(int fieldNumber) {
  52. return (Float) fetchObjectField(fieldNumber);
  53. }
  54. public int fetchIntField(int fieldNumber) {
  55. return (Integer) fetchObjectField(fieldNumber);
  56. }
  57. public long fetchLongField(int fieldNumber) {
  58. return (Long) fetchObjectField(fieldNumber);
  59. }
  60. public short fetchShortField(int fieldNumber) {
  61. return (Short) fetchObjectField(fieldNumber);
  62. }
  63. public String fetchStringField(int fieldNumber) {
  64. if (isPK(fieldNumber)) {
  65. return fetchStringPKField(fieldNumber);
  66. }
  67. return null;
  68. }
  69. public Object fetchObjectField(int fieldNumber) {
  70. AbstractMemberMetaData ammd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
  71. if (isPK(fieldNumber)) {
  72. if (ammd.getType().equals(Key.class)) {
  73. // If this is a pk field, transform the Key into its String representation.
  74. return datastoreEntity.getKey();
  75. } else if (ammd.getType().equals(Long.class)) {
  76. return datastoreEntity.getKey().getId();
  77. }
  78. }
  79. return null;
  80. }
  81. private String fetchStringPKField(int fieldNumber) {
  82. if (MetaDataUtils.isEncodedPKField(cmd, fieldNumber)) {
  83. // If this is an encoded pk field, transform the Key into its String representation.
  84. return KeyFactory.keyToString(datastoreEntity.getKey());
  85. } else {
  86. if (datastoreEntity.getKey().isComplete() && datastoreEntity.getKey().getName() == null) {
  87. // This is trouble, probably an incorrect mapping.
  88. throw new NucleusFatalUserException(
  89. "The primary key for " + cmd.getFullClassName() + " is an unencoded "
  90. + "string but the key of the corresponding entity in the datastore does not have a "
  91. + "name. You may want to either change the primary key to be an encoded string "
  92. + "(add the \"" + DatastoreManager.ENCODED_PK + "\" extension), change the "
  93. + "primary key to be of type " + Key.class.getName() + ", or, if you're certain that "
  94. + "this class will never have a parent, change the primary key to be of type Long.");
  95. }
  96. return datastoreEntity.getKey().getName();
  97. }
  98. }
  99. protected boolean isPK(int fieldNumber) {
  100. int[] pkPositions = cmd.getPKMemberPositions();
  101. return pkPositions != null && pkPositions[0] == fieldNumber;
  102. }
  103. }