/** * Enter description here... * * @param SerializationStreamWriter $streamWriter * @param array $instance * @param MappedClass $instanceClass * @throws SerializationException */ public static function serialize(SerializationStreamWriter $streamWriter, $instance, MappedClass $instanceClass, $consuming_type, $name) { if ($consuming_type == 0) { $size = $instance->size(); $streamWriter->writeInt($size); $iterator = $instance->getIterator(); while ($iterator->valid()) { $streamWriter->writeObject($iterator->current()); $iterator->next(); } } else { if ($consuming_type == 1) { // $instance is array $size = count($instance); $streamWriter->writeInt($size); //for (Object obj : instance) { if (!$instanceClass->isGeneric()) { require_once GWTPHP_DIR . '/maps/java/lang/SerializationException.class.php'; throw new SerializationException("Error occurred while casting native php array to {$name}: " . "{$name} must be mapped as generic type! add < > to signatures and CRC"); } // if (!$instanceClass->isGeneric()) { // class_exists('SerializationException') || require(GWTPHP_DIR.'/maps/java/lang/SerializationException.class.php'); // throw new SerializationException("ArrayList must be mapped as generic type! add < > to signatures and CRC"); // } $typeParameters = $instanceClass->getTypeParameters(); foreach ($instance as $obj) { $streamWriter->writeObject($obj, $typeParameters[0]); } } } }
/** * * @see RPCTargetResolverStrategy::resolveRPCTarget() */ function resolveRPCTarget(MappedClass $interface) { if ($interface->getReflectionClass()->isInterface()) { require_once GWTPHP_DIR . '/maps/com/google/gwt/user/client/rpc/IncompatibleRemoteServiceException.class.php'; throw new IncompatibleRemoteServiceException("Blocked attempt to access interface '" . $interface->getName() . "' where class expected; this is either misconfiguration or a hack attempt"); } return null; }
public static function serialize(SerializationStreamWriter $streamWriter, $instance, MappedClass $instanceClass) { $itemCount = count($instance); $streamWriter->writeInt($itemCount); for ($itemIndex = 0; $itemIndex < $itemCount; ++$itemIndex) { $streamWriter->writeObject($instance[$itemIndex], $instanceClass->getComponentType()); } }
/** * Straight copy from * {@link com.google.gwt.dev.util.TypeInfo#getSourceRepresentation(Class)} to * avoid runtime dependency on gwt-dev. */ private static function printTypeName(MappedClass $type) { // Primitives // if ($type->isPrimitive()) { switch ($type) { case TypeSignatures::$BOOLEAN: return 'boolean'; case TypeSignatures::$BYTE: return 'byte'; case TypeSignatures::$CHAR: return 'char'; case TypeSignatures::$DOUBLE: return 'double'; case TypeSignatures::$FLOAT: return 'float'; case TypeSignatures::$INT: return 'int'; case TypeSignatures::$LONG: return 'long'; case TypeSignatures::$SHORT: return 'short'; default: 'unknown'; } } // Arrays // if ($type->isArray()) { $componentType = $type->getComponentType(); return RPC::printTypeName($componentType) + '[]'; } // Everything else // return $type->getName(); //.replace('$', '.'); }
/** * Enter description here... * * @param MappedClass $mappedClass * @return ReflectionClass */ public static function computeHasCustomFieldSerializer(MappedClass $instanceType) { assert($instanceType != null); $qualifiedTypeName = null; if ($instanceType->isArray()) { /*MappedClass*/ $componentType = $instanceType->getComponentType(); if ($componentType->isPrimitive()) { $qualifiedTypeName = 'java.lang.' . $componentType->getName(); } else { $qualifiedTypeName = 'java.lang.Object'; } $qualifiedTypeName .= '_Array'; } else { $qualifiedTypeName = $instanceType->getName(); } $classLoader = GWTPHPContext::getInstance()->getClassLoader(); $simpleSerializerName = $qualifiedTypeName . "_CustomFieldSerializer"; $customSerializer = SerializabilityUtil::getCustomFieldSerializer($classLoader, $simpleSerializerName); if ($customSerializer != null) { return $customSerializer; } // Try with the regular name /*ReflectionClass*/ $customSerializerClass = SerializabilityUtil::getCustomFieldSerializer($classLoader, SerializabilityUtil::$JRE_SERIALIZER_PACKAGE . '.' . $simpleSerializerName); if ($customSerializerClass != null) { return $customSerializerClass; } return null; }
/** * * @param SerializationStreamWriter $streamWriter * @param HashMap $instance * @param MappedClass $instanceClass * @throws SerializationException */ public static function serialize(SerializationStreamWriter $streamWriter, $instance, MappedClass $instanceClass) { if ($instance instanceof HashMap) { $size = $instance->size(); $streamWriter->writeInt($size); //assert($instanceClass->isGeneric()); //jesli nie array to zapomniano w gwtphpmap dodacgenericsow if ($instanceClass->isGeneric()) { $typeParameters = $instanceClass->getTypeParameters(); } else { $typeParameters = array(); } assert(is_array($typeParameters)); //jesli nie array to zapomniano w gwtphpmap dodacgenericsow foreach ($instance->getKeySet() as $key) { $streamWriter->writeObject($key, $typeParameters[0]); $streamWriter->writeObject($instance->get($key), $typeParameters[1]); } } else { if (is_array($instance)) { // $instance is array //$size = $instance->size(); $size = count($instance); $streamWriter->writeInt($size); //for (Object obj : instance) { if (!$instanceClass->isGeneric()) { require_once GWTPHP_DIR . '/maps/java/lang/SerializationException.class.php'; throw new SerializationException("Error occurred while casting native php array to HashMap: " . "HashMap must be mapped as generic type! add < > to signatures and CRC"); } $typeParameters = $instanceClass->getTypeParameters(); if (!isset(HashMap_CustomFieldSerializer::$ACCEPTABLE_KEY_TYPES[$typeParameters[0]->getSignature()])) { require_once GWTPHP_DIR . '/maps/java/lang/SerializationException.class.php'; throw new SerializationException("Error occurred while casting native php array to HashMap: " . "HashMap_CustomFieldSerializer serialize only array() where " . "keys object are mapped by one of following types: " . "java.lang.String, java.lang.Byte, java.lang.Character, java.lang.Double, " . "java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short, but given: " . $typeParameters[0]->getSignature()); } foreach ($instance as $key => $obj) { $streamWriter->writeObject($key, $typeParameters[0]); $streamWriter->writeObject($obj, $typeParameters[1]); } } else { require_once GWTPHP_DIR . '/maps/java/lang/UnimplementedOperationException.class.php'; throw new UnimplementedOperationException("HashMap_CustomFieldSerializer serialize type: " + gettype($instance) + " not implemented"); } } }
private function deserializeWithDefaultFieldDeserializer(MappedClass $instanceClass, $instance) { /*MappedField[]*/ $declFields = $instanceClass->getDeclaredFields(); /*MappedField[]*/ $serializableFields = SerializabilityUtil::applyFieldSerializationPolicy($declFields); foreach ($serializableFields as $declField) { $value = $this->deserializeValue($declField->getType()); $propName = $declField->getName(); $rClass = $instanceClass->getReflectionClass(); if ($rClass == null) { throw new ClassNotFoundException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains ReflectionClass infomration'); } if (!$rClass->hasProperty($propName)) { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains property: ' . $propName . ' Did you mapped all properties?'); } $rProperty = $rClass->getProperty($propName); if ($rProperty->isPublic()) { $rProperty->setValue($instance, $value); } else { // not public access to property, we try invoke setter method $propNameSetter = 'set' . strtoupper($propName[0]) . substr($propName, 1, strlen($propName)); if (!$rClass->hasMethod($propNameSetter)) { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains setter method for private property: ' . $propName . '. Mapped object should be in pojo style?'); } $rMethod = $rClass->getMethod($propNameSetter); if ($rMethod->isPublic()) { $rMethod->invoke($instance, $value); } else { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains public setter method for private property: ' . $propName . '. Mapped object should be in pojo style?'); } } /* Object value = deserializeValue(declField.getType()); boolean isAccessible = declField.isAccessible(); boolean needsAccessOverride = !isAccessible && !Modifier.isPublic(declField.getModifiers()); if (needsAccessOverride) { // Override access restrictions declField.setAccessible(true); } declField.set(instance, value); if (needsAccessOverride) { // Restore access restrictions declField.setAccessible(isAccessible); } */ } $superClass = $instanceClass->getSuperclass(); if ($superClass != null && $this->getSerializationPolicy()->shouldDeserializeFields($superClass)) { $this->deserializeImpl(SerializabilityUtil::hasCustomFieldSerializer($superClass), $superClass, $instance); } /* Class<?> superClass = instanceClass.getSuperclass(); if (serializationPolicy.shouldDeserializeFields(superClass)) { deserializeImpl(SerializabilityUtil.hasCustomFieldSerializer(superClass), superClass, instance); } */ }
/** * Instantiable types are primitives, {@line IsSerializable}, types with * custom serializers, and any arrays of those types. Merely * {@link Serializable} types cannot be instantiated or serialized directly * (only as super types of legacy serializable types). * @param MappedClass $mappedClass * @return boolean */ private function isInstantiable(MappedClass $mappedClass) { if ($mappedClass->isPrimitive()) { return true; } if ($mappedClass->isArray()) { return $this->isInstantiable($mappedClass->getComponentType()); } if ($mappedClass->getReflectionClass() != null && $mappedClass->getReflectionClass()->isSubclassOf(SerializationPolicy::$IS_SERIALIZABLE_INTERFACE_CLASS_NAME)) { return true; } //if (IsSerializable.class.isAssignableFrom(clazz)) { // return true; //} return SerializabilityUtil::hasCustomFieldSerializer($mappedClass) != null; }
/** * * @param SerializationStreamWriter $streamWriter * @param HashMap $instance * @param MappedClass $instanceClass * @throws SerializationException */ public static function serialize(SerializationStreamWriter $streamWriter, $instance, MappedClass $instanceClass) { ob_start(); print_r($instance); syslog(LOG_DEBUG, "instance = " . ob_get_contents()); ob_end_clean(); if ($instance instanceof HashMap) { $size = $instance->size(); $streamWriter->writeInt($size); foreach ($instance->getKeySet() as $key) { $streamWriter->writeObject($key); $streamWriter->writeObject($instance->get($key)); } } else { if (is_array($instance)) { // $instance is array //$size = $instance->size(); $size = count($instance); $streamWriter->writeInt($size); $typeParameters = $instanceClass->getTypeParameters(); //for (Object obj : instance) { if (defined('GWTPHP_FORCE_SHOEHORN') and !is_array($typeParameters)) { // Force casting to java.util.HashMap<java.lang.String,java.lang.String> require_once GWTPHP_DIR . '/lang/SimpleMappedClass.class.php'; $_class = new SimpleMappedClass(); $_class->setClassLoader(GWTPHPContext::getInstance()->getMappedClassLoader()->getClassLoader()); $_class->setMappedName("java.lang.String"); $_class->setSignature("java.lang.String"); $_class->setCRC("2004016611"); $typeParameters = array($_class, $_class); } else { if (!$instanceClass->isGeneric()) { class_exists('SerializationException') || (require_once GWTPHP_DIR . '/exceptions/SerializationException.class.php'); throw new SerializationException("Error occurred while casting native php array to HashMap: " . "HashMap must be mapped as generic type! add < > to signatures and CRC"); $typeParameters = $instanceClass->getTypeParameters(); } } if (!isset(HashMap_CustomFieldSerializer::$ACCEPTABLE_KEY_TYPES[$typeParameters[0]->getSignature()])) { class_exists('SerializationException') || (require_once GWTPHP_DIR . '/exceptions/SerializationException.class.php'); throw new SerializationException("Error occurred while casting native php array to HashMap: " . "HashMap_CustomFieldSerializer serialize only array() where " . "keys object are mapped by one of following types: " . "java.lang.String, java.lang.Byte, java.lang.Character, java.lang.Double, " . "java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short, but given: " . $typeParameters[0]->getSignature()); } foreach ($instance as $key => $obj) { $streamWriter->writeObject($key, $typeParameters[0]); $streamWriter->writeObject($obj, $typeParameters[1]); } } else { if (defined('GWTPHP_FORCE_SHOEHORN')) { // Compatibility hack. :( $streamWriter->writeInt(0); } else { throw new UnimplementedOperationException("HashMap_CustomFieldSerializer serialize type: " + gettype($instance) + " not implemented"); } } } }
/** * @param MappedClass $instanceClass * @param Object $instance */ private function deserializeArray(MappedClass $instanceClass, BoundedList &$instance) { assert($instanceClass->isArray()); //assert($instance instanceof BoundedList); $s = $instanceClass->getSignature(); /*VectorReader */ $instanceReader = self::$CLASS_TO_VECTOR_READER[$s]; if ($instanceReader !== null) { return $instanceReader->read($this, $instance); } else { return VectorReader::OBJECT_VECTOR()->read($this, $instance); } }
function resolveRPCTarget(MappedClass $interface) { $target = GWTPHPContext::getInstance()->getClassLoader()->loadClass($interface->getMappedName() . 'Impl'); return $target->newInstance(); }
/** * * * @param Object $instance * @param MappedClass $instanceClass * @ throws SerializationException */ private function serializeClass($instance, MappedClass $instanceClass) { assert($instance != null); /*MappedField[]*/ $declFields = $instanceClass->getDeclaredFields(); /*MappedField[]*/ $serializableFields = SerializabilityUtil::applyFieldSerializationPolicy($declFields); foreach ($serializableFields as $declField) { assert($declField != null); $value = null; $propName = $declField->getName(); $rClass = $instanceClass->getReflectionClass(); //$rClass = new ReflectionObject($instance); if ($rClass == null) { throw new ClassNotFoundException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains ReflectionClass infomration'); } if (!$rClass->hasProperty($propName)) { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains property: ' . $propName . ' Did you mapped all properties?'); } $rProperty = $rClass->getProperty($propName); if ($rProperty->isPublic()) { $value = $rProperty->getValue($instance); } else { // not public access to property, we try invoke getter method $propNameSetter = 'get' . strtoupper($propName[0]) . substr($propName, 1, strlen($propName)); if (!$rClass->hasMethod($propNameSetter)) { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains getter method for private property: ' . $propName . '. Mapped object should be in pojo style?'); } $rMethod = $rClass->getMethod($propNameSetter); if ($rMethod->isPublic()) { $value = $rMethod->invoke($instance); } else { throw new SerializationException('MappedClass: ' . $instanceClass->getSignature() . ' do not contains public getter method for private property: ' . $propName . '. Mapped object should be in pojo style?'); } } $this->serializeValue($value, $declField->getType()); } /* assert (instance != null); Field[] declFields = instanceClass.getDeclaredFields(); Field[] serializableFields = SerializabilityUtil.applyFieldSerializationPolicy(declFields); for (Field declField : serializableFields) { assert (declField != null); boolean isAccessible = declField.isAccessible(); boolean needsAccessOverride = !isAccessible && !Modifier.isPublic(declField.getModifiers()); if (needsAccessOverride) { // Override the access restrictions declField.setAccessible(true); } Object value; try { value = declField.get(instance); serializeValue(value, declField.getType()); } catch (IllegalArgumentException e) { throw new SerializationException(e); } catch (IllegalAccessException e) { throw new SerializationException(e); } if (needsAccessOverride) { // Restore the access restrictions declField.setAccessible(isAccessible); } } Class<?> superClass = instanceClass.getSuperclass(); if (serializationPolicy.shouldSerializeFields(superClass)) { serializeImpl(instance, superClass); }*/ $superClass = $instanceClass->getSuperclass(); if ($superClass != null && $this->serializationPolicy->shouldDeserializeFields($superClass)) { $this->serializeImpl($instance, $superClass); } }
public function write(ServerSerializationStreamWriter $stream, $instance, MappedClass $instanceClass = null) { $stream->writeInt(count($instance)); for ($i = 0, $n = count($instance); $i < $n; ++$i) { $stream->writeObject($instance[$i], $instanceClass->getComponentType()); } }