/**
  * 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());
     }
 }
Exemple #4
0
 /**
  * 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());
     }
 }