@Override public TraversedReferences getPortableObjects(Object pojo, TraversedReferences addTo) { if (ClassUtils.isPrimitiveArray(pojo)) { return addTo; } Object[] array = (Object[]) pojo; for (Object o : array) { if (o != null && isPortableReference(o.getClass())) { addTo.addAnonymousReference(o); } } return addTo; }
private static void hydrateNonPrimitiveArray(Object[] source, TCObject tcObject, Object pojo, int offset) { for (int i = 0, n = source.length; i < n; i++) { setArrayElement(offset + i, source[i], tcObject, pojo); } }
@Override public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object po) throws IOException, IllegalArgumentException, ClassNotFoundException { DNACursor cursor = dna.getCursor(); while (cursor.next(encoding)) { PhysicalAction a = cursor.getPhysicalAction(); if (a.isArrayElement()) { setArrayElement(a.getArrayIndex(), a.getObject(), tcObject, po); } else if (a.isEntireArray() || a.isSubArray()) { Object array = a.getObject(); int offset = a.isEntireArray() ? 0 : a.getArrayIndex(); if (ClassUtils.isPrimitiveArray(array)) { System.arraycopy(array, 0, po, offset, Array.getLength(array)); } else { hydrateNonPrimitiveArray((Object[]) array, tcObject, po, offset); } } else { throw Assert.failure("Invalid physical action for array"); } } }
@Override public ChangeApplicator createApplicatorFor(final TCClass clazz, final boolean indexed) { if (indexed) { return new ArrayApplicator(this.encoding); } final String name = clazz.getName(); final Class applicatorClazz = this.config.getChangeApplicator(clazz.getPeerClass()); if (applicatorClazz == null) { if (LiteralValues.isLiteral(name)) { return new LiteralTypesApplicator(clazz, this.encoding); } else { return new PhysicalApplicator(clazz, this.encoding); } } TCLogger logger = TCLogging.getLogger(ChangeApplicator.class.getName() + "." + applicatorClazz.getName()); try { Constructor cstr = applicatorClazz.getConstructor(APPLICATOR_CSTR_SIGNATURE); Object[] params = new Object[] { encoding, logger }; return (ChangeApplicator) cstr.newInstance(params); } catch (final Exception e) { throw new AssertionError(e); } } }
@Override public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object pojo) { writer.setArrayLength(Array.getLength(pojo)); if (ClassUtils.isPrimitiveArray(pojo)) { writer.addEntireArray(pojo); } else { Object[] array = (Object[]) pojo; Object[] toEncode = new Object[array.length]; // convert to array of literals and ObjectID for (int i = 0, n = array.length; i < n; i++) { Object element = array[i]; if (!objectManager.isPortableInstance(element)) { toEncode[i] = ObjectID.NULL_ID; continue; } final Object obj = getDehydratableObject(element, objectManager); if (obj == null) { toEncode[i] = ObjectID.NULL_ID; } else { toEncode[i] = obj; } } writer.addEntireArray(toEncode); } }
@Override public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object po) throws IOException, IllegalArgumentException, ClassNotFoundException { DNACursor cursor = dna.getCursor(); while (cursor.next(encoding)) { PhysicalAction a = cursor.getPhysicalAction(); if (a.isArrayElement()) { setArrayElement(a.getArrayIndex(), a.getObject(), tcObject, po); } else if (a.isEntireArray() || a.isSubArray()) { Object array = a.getObject(); int offset = a.isEntireArray() ? 0 : a.getArrayIndex(); if (ClassUtils.isPrimitiveArray(array)) { System.arraycopy(array, 0, po, offset, Array.getLength(array)); } else { hydrateNonPrimitiveArray((Object[]) array, tcObject, po, offset); } } else { throw Assert.failure("Invalid physical action for array"); } } }
@Override public ChangeApplicator createApplicatorFor(final TCClass clazz, final boolean indexed) { if (indexed) { return new ArrayApplicator(this.encoding); } final String name = clazz.getName(); final Class applicatorClazz = this.config.getChangeApplicator(clazz.getPeerClass()); if (applicatorClazz == null) { if (LiteralValues.isLiteral(name)) { return new LiteralTypesApplicator(clazz, this.encoding); } else { return new PhysicalApplicator(clazz, this.encoding); } } TCLogger logger = TCLogging.getLogger(ChangeApplicator.class.getName() + "." + applicatorClazz.getName()); try { Constructor cstr = applicatorClazz.getConstructor(APPLICATOR_CSTR_SIGNATURE); Object[] params = new Object[] { encoding, logger }; return (ChangeApplicator) cstr.newInstance(params); } catch (final Exception e) { throw new AssertionError(e); } } }
@Override public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object pojo) { writer.setArrayLength(Array.getLength(pojo)); if (ClassUtils.isPrimitiveArray(pojo)) { writer.addEntireArray(pojo); } else { Object[] array = (Object[]) pojo; Object[] toEncode = new Object[array.length]; // convert to array of literals and ObjectID for (int i = 0, n = array.length; i < n; i++) { Object element = array[i]; if (!objectManager.isPortableInstance(element)) { toEncode[i] = ObjectID.NULL_ID; continue; } final Object obj = getDehydratableObject(element, objectManager); if (obj == null) { toEncode[i] = ObjectID.NULL_ID; } else { toEncode[i] = obj; } } writer.addEntireArray(toEncode); } }
@Override public TraversedReferences getPortableObjects(Object pojo, TraversedReferences addTo) { if (ClassUtils.isPrimitiveArray(pojo)) { return addTo; } Object[] array = (Object[]) pojo; for (Object o : array) { if (o != null && isPortableReference(o.getClass())) { addTo.addAnonymousReference(o); } } return addTo; }
private static void hydrateNonPrimitiveArray(Object[] source, TCObject tcObject, Object pojo, int offset) { for (int i = 0, n = source.length; i < n; i++) { setArrayElement(offset + i, source[i], tcObject, pojo); } }