PageRenderTime 26ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/src/org/datanucleus/store/cassandra/CassandraFetchFieldManager.java

http://github.com/PedroGomes/datanucleus-cassandra
Java | 331 lines | 236 code | 73 blank | 22 comment | 46 complexity | 036952fd08562c21fec651d003a2793a MD5 | raw file
  1. /**********************************************************************
  2. Copyright (c) 2010 Pedro Gomes and Universidade do Minho. All rights reserved.
  3. (Based on datanucleus-hbase. Copyright (c) 2009 Erik Bengtson and others.)
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. **********************************************************************/
  14. package org.datanucleus.store.cassandra;
  15. import org.apache.cassandra.thrift.ColumnOrSuperColumn;
  16. import org.datanucleus.ClassLoaderResolver;
  17. import org.datanucleus.api.ApiAdapter;
  18. import org.datanucleus.exceptions.NucleusException;
  19. import org.datanucleus.metadata.AbstractClassMetaData;
  20. import org.datanucleus.metadata.AbstractMemberMetaData;
  21. import org.datanucleus.metadata.MetaDataManager;
  22. import org.datanucleus.metadata.Relation;
  23. import org.datanucleus.store.ExecutionContext;
  24. import org.datanucleus.store.ObjectProvider;
  25. import org.datanucleus.store.fieldmanager.AbstractFieldManager;
  26. import java.util.*;
  27. public class CassandraFetchFieldManager extends AbstractFieldManager {
  28. private AbstractClassMetaData acmd;
  29. private ObjectProvider objectProvider;
  30. private Map<String, byte[]> result_map;
  31. public CassandraFetchFieldManager(AbstractClassMetaData acmd,
  32. ObjectProvider objcp, List<ColumnOrSuperColumn> result) {
  33. this.acmd = acmd;
  34. this.objectProvider = objcp;
  35. result_map = new TreeMap<String, byte[]>();
  36. for (int index = 0; index < result.size(); index++) {
  37. ColumnOrSuperColumn columnOrSuperColumn = result.get(index);
  38. String name = new String(columnOrSuperColumn.getColumn().name);
  39. result_map.put(name, columnOrSuperColumn.getColumn().value);
  40. }
  41. }
  42. public boolean fetchBooleanField(int fieldNumber) {
  43. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  44. Boolean value;
  45. try {
  46. byte[] bytes = result_map.get(columnName);
  47. value = ConversionUtils.convertBytes(Boolean.class, bytes);
  48. } catch (Exception e) {
  49. throw new NucleusException(e.getMessage(), e);
  50. }
  51. return value;
  52. }
  53. public byte fetchByteField(int fieldNumber) {
  54. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  55. Byte value;
  56. try {
  57. byte[] bytes = result_map.get(columnName);
  58. value = ConversionUtils.convertBytes(Byte.class, bytes);
  59. } catch (Exception e) {
  60. throw new NucleusException(e.getMessage(), e);
  61. }
  62. return value;
  63. }
  64. public char fetchCharField(int fieldNumber) {
  65. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  66. Character value;
  67. try {
  68. byte[] bytes = result_map.get(columnName);
  69. value = ConversionUtils.convertBytes(Character.class, bytes);
  70. } catch (Exception e) {
  71. throw new NucleusException(e.getMessage(), e);
  72. }
  73. return value;
  74. }
  75. public double fetchDoubleField(int fieldNumber) {
  76. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  77. Double value;
  78. try {
  79. byte[] bytes = result_map.get(columnName);
  80. value = ConversionUtils.convertBytes(Double.class, bytes);
  81. } catch (Exception e) {
  82. throw new NucleusException(e.getMessage(), e);
  83. }
  84. return value;
  85. }
  86. public float fetchFloatField(int fieldNumber) {
  87. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  88. Float value;
  89. try {
  90. byte[] bytes = result_map.get(columnName);
  91. value = ConversionUtils.convertBytes(Float.class, bytes);
  92. } catch (Exception e) {
  93. throw new NucleusException(e.getMessage(), e);
  94. }
  95. return value;
  96. }
  97. public int fetchIntField(int fieldNumber) {
  98. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  99. int value;
  100. try {
  101. byte[] bytes = result_map.get(columnName);
  102. value = ConversionUtils.convertBytes(Integer.class, bytes);
  103. } catch (Exception e) {
  104. throw new NucleusException(e.getMessage(), e);
  105. }
  106. return value;
  107. }
  108. public long fetchLongField(int fieldNumber) {
  109. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  110. long value;
  111. try {
  112. byte[] bytes = result_map.get(columnName);
  113. value = ConversionUtils.convertBytes(Long.class, bytes);
  114. } catch (Exception e) {
  115. throw new NucleusException(e.getMessage(), e);
  116. }
  117. return value;
  118. }
  119. public short fetchShortField(int fieldNumber) {
  120. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  121. short value;
  122. try {
  123. byte[] bytes = result_map.get(columnName);
  124. value = ConversionUtils.convertBytes(Short.class, bytes);
  125. } catch (Exception e) {
  126. throw new NucleusException(e.getMessage(), e);
  127. }
  128. return value;
  129. }
  130. public String fetchStringField(int fieldNumber) {
  131. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  132. String value;
  133. try {
  134. byte[] bytes = result_map.get(columnName);
  135. value = ConversionUtils.convertBytes(String.class, bytes);
  136. } catch (Exception e) {
  137. throw new NucleusException(e.getMessage(), e);
  138. }
  139. return value;
  140. }
  141. public Object fetchObjectField(int fieldNumber) {
  142. String columnName = CassandraUtils.getQualifierName(acmd, fieldNumber);
  143. ExecutionContext context = objectProvider.getExecutionContext();
  144. ClassLoaderResolver clr = context.getClassLoaderResolver();
  145. AbstractMemberMetaData fieldMetaData = acmd
  146. .getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
  147. // get object
  148. Object value;
  149. byte[] bytes = result_map.get(columnName);
  150. if (bytes == null) {
  151. return null;
  152. }
  153. try {
  154. value = ConversionUtils.convertBytes(fieldMetaData.getType(), bytes);
  155. } catch (Exception e) {
  156. throw new NucleusException(e.getMessage(), e);
  157. }
  158. // handle relations
  159. int relationType = fieldMetaData.getRelationType(clr);
  160. if (relationType == Relation.ONE_TO_ONE_BI
  161. || relationType == Relation.ONE_TO_ONE_UNI
  162. || relationType == Relation.MANY_TO_ONE_BI) {
  163. Object id = value;
  164. String class_name = fieldMetaData.getClassName();
  165. value = context.findObject(id, true, false, class_name);
  166. } else if (relationType == Relation.MANY_TO_MANY_BI
  167. || relationType == Relation.ONE_TO_MANY_BI
  168. || relationType == Relation.ONE_TO_MANY_UNI) {
  169. MetaDataManager mmgr = context.getMetaDataManager();
  170. if (fieldMetaData.hasCollection()) {
  171. String elementClassName = fieldMetaData.getCollection()
  172. .getElementType();
  173. List<Object> mapping = (List<Object>) value;
  174. Collection<Object> collection = new ArrayList<Object>(mapping.size());
  175. for (Object id : mapping) {
  176. // System.out.println("Object:"+id.toString());
  177. Object element = context.findObject(id, true, false,
  178. elementClassName);
  179. collection.add(element);
  180. }
  181. value = objectProvider.wrapSCOField(fieldNumber, collection,
  182. false, false, true);
  183. //value = collection;
  184. } else if (fieldMetaData.hasMap()) {
  185. // Process all keys, values of the Map that are PC
  186. String key_elementClassName = fieldMetaData.getMap()
  187. .getKeyType();
  188. String value_elementClassName = fieldMetaData.getMap()
  189. .getValueType();
  190. Map<Object, Object> mapping = new TreeMap<Object, Object>();
  191. Map map = (Map) value;
  192. ApiAdapter api = context.getApiAdapter();
  193. Set keys = map.keySet();
  194. Iterator iter = keys.iterator();
  195. while (iter.hasNext()) {
  196. Object mapKey = iter.next();
  197. Object key = null;
  198. if (mapKey instanceof javax.jdo.identity.SingleFieldIdentity) {
  199. key = context.findObject(mapKey, true, false,
  200. key_elementClassName);
  201. } else {
  202. key = mapKey;
  203. }
  204. Object mapValue = map.get(key);
  205. Object key_value = null;
  206. if (mapValue instanceof javax.jdo.identity.SingleFieldIdentity) {
  207. key_value = context.findObject(mapValue, true, false,
  208. value_elementClassName);
  209. } else {
  210. key_value = mapValue;
  211. }
  212. mapping.put(key, key_value);
  213. }
  214. // value = mapping;
  215. value = objectProvider.wrapSCOField(fieldNumber, mapping, false,
  216. false, true);
  217. }
  218. }
  219. return value;
  220. }
  221. public Object fetchField(int fieldNumber, Class c) {
  222. if (c == Boolean.class) {
  223. return this.fetchBooleanField(fieldNumber);
  224. }
  225. if (c == Byte.class) {
  226. return this.fetchByteField(fieldNumber);
  227. }
  228. if (c == Character.class) {
  229. return this.fetchCharField(fieldNumber);
  230. }
  231. if (c == Double.class) {
  232. return this.fetchDoubleField(fieldNumber);
  233. }
  234. if (c == Float.class) {
  235. return this.fetchFloatField(fieldNumber);
  236. }
  237. if (c == Integer.class) {
  238. return this.fetchIntField(fieldNumber);
  239. }
  240. if (c == Long.class) {
  241. return this.fetchLongField(fieldNumber);
  242. }
  243. if (c == Short.class) {
  244. return this.fetchShortField(fieldNumber);
  245. }
  246. if (c == String.class) {
  247. return this.fetchStringField(fieldNumber);
  248. }
  249. if (c == Object.class) {
  250. return this.fetchObjectField(fieldNumber);
  251. } else {
  252. return null;
  253. }
  254. }
  255. }