public static function decodeRequest($encodedRequest, ClientOracle $clientOracle) { if ($encodedRequest == null) { throw new NullPointerException('encodedRequest cannot be null'); } if ($encodedRequest == '') { throw new IllegalArgumentException('encodedRequest cannot be empty'); } try { $decoder = null; try { $decoder = new SimplePayloadDecoder($clientOracle, $encodedRequest); } catch (ClassNotFoundException $e) { throw new IncompatibleRemoteServiceException('Server does not have a type sent by the client', $e); } $streamReader = new CommandServerSerializationStreamReader(); if ($decoder->getThrownValue() != null) { $streamReader->prepareToRead(array($decoder->getThrownValue())); throw new RemoteException($streamReader->readObject()); } else { $streamReader->prepareToRead($decoder->getValues()); } $serviceIntfName = $streamReader->readString(); //$servicePhpName = self::serviceInterfaceToPhpService($serviceIntfName); $serviceIntf = self::getClassForSerializedName($serviceIntfName); if (!Classes::classOf('RemoteService')->isAssignableFrom($serviceIntf)) { throw new IncompatibleRemoteServiceException('Blocked attempt to access interface "' . $serviceIntf->getName() . '" which does not extends RemoteService'); } $servicePhpName = $serviceIntf->getName(); $serviceObject = null; try { $serviceObject = new $servicePhpName(); } catch (Exception $e) { throw new IncompatibleRemoteServiceException('Could not locate requested service "' . $serviceIntfName . '"', $e); } $serviceMethodName = $streamReader->readString(); $paramCount = $streamReader->readInt(); $parameterTypes = array(); for ($i = 0; $i < $paramCount; $i++) { $paramClassName = $streamReader->readString(); try { $parameterTypes[] = self::getClassForSerializedName($paramClassName, $clientOracle); } catch (ClassNotFoundException $e) { throw new IncompatibleRemoteServiceException('Parameter ' . $i . ' of is of an unknown type ' . $paramClassName, $e); } } $method = $serviceIntf->getMethod($serviceMethodName); if ($method == null) { throw new IncompatibleRemoteServiceException('Cound not find the method ' . $serviceMethodName . ' in service ' . $serviceIntfName); } $parameterValues = array(); for ($i = 0; $i < $paramCount; $i++) { $parameterValues[] = Accessors::get($parameterTypes[$i])->readNext($streamReader); } return new RpcRequest($serviceObject, $method, $parameterValues); } catch (SerializationException $e) { throw new IncompatibleRemoteServiceException($e->getMessage(), $e); } }