Hi Édouard,

We have the GAE driver that used to work, but that was more about
configuring a single-threaded executor and some other http related stuff.

As far as I know, the GAE support has been untested for several releases,
as I believe the community is not using it, but it is good to have a real
use case!

I haven't seen reflection restrictions before, but I'm not a GAE user, so I
don't know the details and its limitations. Looking at the stacktrace, it
seems that the failure happens when trying to build the deserialization
context. jclouds uses Gson to deserialize the API responses, and it uses
reflection to make sure it will be able to build the corresponding Java
object, by making all the constructors accessible.

This seems to be not allowed in GAE, and we could try to configure the GAE
module to "disable" that reflection, and use only the visible constructor.
However, this has been out there since 2013 and I'm not sure if working
only with the visible constructors would be compatible with the current
domain model of all providers.

In any case, it is worth giving it a try. Mind opening a JIRA [1] issue so
we can properly track this?

Thanks!

I.

[1] https://issues.apache.org/jira/browse/jclouds

On 2 March 2015 at 22:16, Édouard Mercier sur Gmail <
[email protected]> wrote:

> Hello.
>
> I've been digging a long time, both using the v1.8.1 and the
> v2.0.0-SNAPSHOT, and found no way to jclouds BlobStore to work on the
> current GAE Java flavor v1.9.18.
>
> When attempting to use the "BlobStore.putBlob()" method, I get this
>
> """
> java.lang.SecurityException: java.lang.IllegalAccessException: Reflection
> is not allowed on java.lang.String(int,int,char[])
> at com.google.appengine.runtime.Request.process-
> 6c82fef5146f94d9(Request.java)
> at java.lang.reflect.Constructor.setAccessible(Constructor.java:40)
> at org.jclouds.reflect.Reflection2$1.load(Reflection2.java:156)
> at org.jclouds.reflect.Reflection2$1.load(Reflection2.java:152)
> at com.google.common.cache.LocalCache$LoadingValueReference.
> loadFuture(LocalCache.java:3527)
> at com.google.common.cache.LocalCache$Segment.loadSync(
> LocalCache.java:2319)
> at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.
> java:2282)
> at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2197)
> at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
> at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
> at com.google.common.cache.LocalCache$LocalLoadingCache.
> get(LocalCache.java:4824)
> at org.jclouds.reflect.Reflection2.get(Reflection2.java:345)
> at org.jclouds.reflect.Reflection2.constructors(Reflection2.java:99)
> at org.jclouds.json.internal.NamingStrategies$
> AnnotationConstructorNamingStrategy.getDeserializer(
> NamingStrategies.java:248)
> at org.jclouds.json.internal.DeserializationConstructorAndR
> eflectiveTypeAdapterFactory.create(DeserializationConstructorAndR
> eflectiveTypeAdapterFactory.java:122)
> at com.google.gson.Gson.getAdapter(Gson.java:358)
> at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.
> getFieldAdapter(ReflectiveTypeAdapterFactory.java:109)
> at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(
> ReflectiveTypeAdapterFactory.java:46)
> at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(
> ReflectiveTypeAdapterFactory.java:84)
> at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.
> createBoundField(ReflectiveTypeAdapterFactory.java:83)
> at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.
> getBoundFields(ReflectiveTypeAdapterFactory.java:129)
> at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(
> ReflectiveTypeAdapterFactory.java:75)
> at com.google.gson.Gson.getAdapter(Gson.java:358)
> at com.google.gson.Gson.toJson(Gson.java:587)
> at com.google.gson.Gson.toJson(Gson.java:574)
> at com.google.gson.Gson.toJson(Gson.java:529)
> at com.google.gson.Gson.toJson(Gson.java:509)
> at org.jclouds.json.internal.GsonWrapper.toJson(GsonWrapper.java:52)
> at org.jclouds.googlecloudstorage.binders.MultipartUploadBinder.
> bindToRequest(MultipartUploadBinder.java:53)
> at org.jclouds.rest.internal.RestAnnotationProcessor.apply(
> RestAnnotationProcessor.java:324)
> at org.jclouds.rest.internal.RestAnnotationProcessor.apply(
> RestAnnotationProcessor.java:129)
> at org.jclouds.rest.internal.InvokeHttpMethod.toCommand(
> InvokeHttpMethod.java:188)
> at org.jclouds.rest.internal.InvokeHttpMethod.invoke(
> InvokeHttpMethod.java:84)
> at org.jclouds.rest.internal.InvokeHttpMethod.apply(
> InvokeHttpMethod.java:73)
> at org.jclouds.rest.internal.InvokeHttpMethod.apply(
> InvokeHttpMethod.java:44)
> at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.
> handleInvocation(FunctionalReflection.java:117)
> at com.google.common.reflect.AbstractInvocationHandler.invoke(
> AbstractInvocationHandler.java:87)
> at com.sun.proxy.$Proxy62.multipartUpload(Unknown Source)
> at org.jclouds.googlecloudstorage.blobstore.GoogleCloudStorageBlobStore.
> putBlob(GoogleCloudStorageBlobStore.java:224)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(
> NativeMethodAccessorImpl.java:57)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(
> DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:45)
> at com.google.inject.internal.DelegatingInvocationHandler.invoke(
> DelegatingInvocationHandler.java:37)
> at com.sun.proxy.$Proxy60.putBlob(Unknown Source)
> """
>
> exception (this one was caused using jclouds v2.0.0-SNAPSHOT).
>
> I've seen that there has been initiatives to have jclouds working on the
> GAE in the past, but would like to know if this is still on the roadmap.
> Any help which shows how to have jclouds BlobStore working on GAE is very
> welcome.
>
> Thank you for your support. Regards,
> Édouard
>

Reply via email to