Hello!

I would like to start with a reproducer. Rafael, can you please throw
together a runnable stand-alone reproducer of this issue?

Thanks,
-- 
Ilya Kasnacheev


чт, 2 июл. 2020 г. в 17:28, Denis Magda <dma...@apache.org>:

> Ilya,
>
> Yes, Rafael confirmed that the peer-class-loading is set.
>
> Still does not work, this time complaining that the MyFilter class is not
> found.
> PeerClassLoading is active as far as I can tell. At least in both
> server/client ignite config
>
> Is this a known limitation or regression? Should we file an feature
> request or bug?
>
> Denis
>
> On Thursday, July 2, 2020, Ilya Kasnacheev <ilya.kasnach...@gmail.com>
> wrote:
>
>> Hello!
>>
>> Did you enable peer class loading? You need to either enable peer class
>> loading, or put your filter class(es) to all server nodes.
>>
>> Regards,
>> --
>> Ilya Kasnacheev
>>
>>
>> чт, 2 июл. 2020 г. в 15:09, Rafael Troilo <rafael.tro...@heigit.org>:
>>
>>> Hi Denis,
>>>
>>> thank you for your quick response. Unfortunately even avoiding lambdas
>>> or anonymous classes didn't solve this problem.
>>> And was my first thought for this problem too.
>>>
>>> With:
>>>
>>> MyFilter.java
>>>
>>> import org.apache.ignite.lang.IgniteClosure;
>>>
>>> public class MyFilter<T> implements IgniteClosure<T, Long> {
>>>
>>>   private static final long serialVersionUID = 1L;
>>>   private final long l;
>>>
>>>   public MyFilter(long l) {
>>>     this.l = l;
>>>   }
>>>
>>>   @Override
>>>   public Long apply(T e) {
>>>     return l;
>>>   }
>>>
>>> }
>>>
>>>
>>> and
>>>
>>> try (Ignite ignite = Ignition.start("ignite.xml")) {
>>>    IgniteCache<Integer, String> cache =
>>> ignite.getOrCreateCache("ScanTransformTest");
>>>   ...
>>>    // 2 Running the ScanQuery on the remote server. Works!
>>>   compute.broadcast(() -> {
>>>     try (QueryCursor<Long> cursor = cache.query(new
>>> ScanQuery<>().setLocal(true), new MyFilter<>(234))) {
>>>       for (Long row : cursor) {
>>>         return row;
>>>       }
>>>     }
>>>     return 0;
>>>   })
>>>
>>>   // 3 Still does not work.
>>>   try (QueryCursor<Long> cursor = cache.query(new ScanQuery<>(), new
>>> MyFilter<>(345L))) {
>>>     for (Long row : cursor) {
>>>       System.out.println(row);
>>>       break;
>>>     }
>>>   }
>>> }
>>>
>>> Still does not work, this time complaining that the MyFilter class is
>>> not found.
>>> PeerClassLoading is active as far as I can tell. At least in both
>>> server/client ignite config
>>> ...
>>> <property name="peerClassLoadingEnabled" value="true"/>
>>> ...
>>> it is enabled.
>>>
>>> I'm also not sure why the same class (IgniteClosure) works in the other
>>> case but not in the Transformer or whats the differnt in case 2 to 3.
>>> I guess making the MyFilter class available on the server will solve
>>> this problem, but should not peerClassLoading work here?
>>>
>>> Is there any information  I can provide or test I should do to help to
>>> solve this problem.
>>>
>>> Thank you very much.
>>>
>>>
>>> Stack Trace:
>>> Exception in thread "main" javax.cache.CacheException: class
>>> org.apache.ignite.IgniteCheckedException: MyFilter
>>>         at
>>> org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1317)
>>>         at
>>> org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:173)
>>>         at
>>> org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5.onHasNext(GridCacheDistributedQueryManager.java:645)
>>>         at
>>> org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)
>>>         at
>>> org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)
>>>         at
>>> org.apache.ignite.internal.processors.cache.AutoClosableCursorIterator.hasNext(AutoClosableCursorIterator.java:49)
>>>         at ScanQueryTest.main(ScanQueryTest.java:57)
>>> Caused by: class org.apache.ignite.IgniteCheckedException: MyFilter
>>>         at
>>> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10310)
>>>         at
>>> org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest.finishUnmarshal(GridCacheQueryRequest.java:389)
>>>         at
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.unmarshall(GridCacheIoManager.java:1625)
>>>         at
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:586)
>>>         at
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:392)
>>>         at
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:318)
>>>         at
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:109)
>>>         at
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:308)
>>>         at
>>> org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1843)
>>>         at
>>> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1468)
>>>         at
>>> org.apache.ignite.internal.managers.communication.GridIoManager.access$5200(GridIoManager.java:229)
>>>         at
>>> org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1365)
>>>         at
>>> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>>>         at
>>> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>>>         at java.base/java.lang.Thread.run(Thread.java:834)
>>> Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException:
>>> MyFilter
>>>         at
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
>>>         at
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
>>>         at
>>> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1757)
>>>         at
>>> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
>>>         at
>>> org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:307)
>>>         at
>>> org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0(BinaryMarshaller.java:101)
>>>         at
>>> org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:81)
>>>         at
>>> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10304)
>>>         ... 14 more
>>> Caused by: java.lang.ClassNotFoundException: MyFilter
>>>         at
>>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
>>>         at
>>> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
>>>         at
>>> java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>>>         at java.base/java.lang.Class.forName0(Native Method)
>>>         at java.base/java.lang.Class.forName(Class.java:398)
>>>         at
>>> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
>>>         at
>>> org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
>>>         at
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
>>>         ... 21 more
>>>
>>>
>>>
>>> On 7/1/20 7:09 PM, Denis Magda wrote:
>>> > Hi Rafael,
>>> >
>>> > Lamdas and anonymous classes capture and serialize their
>>> Inner/OuterClass
>>> > with all the fields, and classes of the fields of those fields, etc. In
>>> > your case, ScanQueryClass was captured during the lamda serialization
>>> and
>>> > that class was not found during deserialization on the other side:
>>> >
>>> > Caused by: class org.apache.ignite.binary.BinaryObjectException:
>>> Failed to
>>> > read field [name=capturingClass]
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:874)
>>> >         ... 20 more
>>> > Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException:
>>> > ScanQueryTest
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1638)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1575)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1552)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryReaderExImpl.readClass(BinaryReaderExImpl.java:383)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:907)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read0(BinaryFieldAccessor.java:703)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:188)
>>> >         ... 21 more
>>> > *Caused by: java.lang.ClassNotFoundException: ScanQueryTest*
>>> >         at
>>> >
>>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
>>> >         at
>>> >
>>> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
>>> >         at
>>> java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>>> >         at java.base/java.lang.Class.forName0(Native Method)
>>> >         at java.base/java.lang.Class.forName(Class.java:398)
>>> >         at
>>> >
>>> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
>>> >         at
>>> >
>>> org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
>>> >         at
>>> >
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
>>> >         ... 29 more
>>> >
>>> > My advice is to avoid using lambdas and anonymous classes due to this
>>> > specificity. Instead, you can create "private static classes" and
>>> Ignite
>>> > will be serializing an instance of that class only:
>>> >
>>> > private static class MyFilter implements IgniteClosure {
>>> > ....
>>> > }
>>> >
>>> > Lamdas are nice for demos and simple code samples where
>>> Inner/OuterClasses
>>> > are simple Java classes. While in real production environments, things
>>> can
>>> > get messy.
>>> >
>>> > -
>>> > Denis
>>> >
>>> >
>>> > On Wed, Jul 1, 2020 at 9:36 AM Rafael Troilo <rafael.tro...@heigit.org
>>> >
>>> > wrote:
>>> >
>>> >> Hey Guys,
>>> >>
>>> >> I have a strange problem with the Transform part of a ScanQuery that
>>> I get
>>> >> a deserialize object exception for the SerializedLambda.
>>> >>> javax.cache.CacheException: class
>>> >> org.apache.ignite.IgniteCheckedException: Failed to deserialize object
>>> >> [typeName=java.lang.invoke.SerializedLambda]
>>> >>
>>> >> Strange is that it works very well in other cases like:
>>> >>
>>> >> try (Ignite ignite = Ignition.start("ignite.xml")) {
>>> >>   IgniteCache<Integer,String> cache =
>>> >> ignite.createCache("ScanTransformTest");
>>> >>   cache.put(1, "Hello");
>>> >>
>>> >>   // 1  Just a broadcast with a IgniteClosure works!
>>> >>   compute.broadcast((a) -> 123L,
>>> "Hello").forEach(System.out::println);
>>> >>
>>> >>   // 2 Running the ScanQuery on the remote server. Works too!
>>> >>   compute.broadcast(() -> {
>>> >>     try(QueryCursor<Long> cursor = cache.query(new
>>> >> ScanQuery<>().setLocal(true), (a) -> 234L)){
>>> >>       for( Long row : cursor) {
>>> >>         return row;
>>> >>       }
>>> >>     }
>>> >>     return 0;
>>> >>   }).forEach(System.out::println);
>>> >>
>>> >>
>>> >>   // 3 But running it from the client side it fails!
>>> >>   try(QueryCursor<Long> cursor = cache.query(new ScanQuery<>(), (a) ->
>>> >> 345L)){
>>> >>     for( Long row : cursor) {
>>> >>       System.out.println(row);
>>> >>       break;
>>> >>     }
>>> >>   }
>>> >>
>>> >> }
>>> >>
>>> >> Also changing the Lambda to a actually class implementing
>>> IgniteClosure
>>> >> results in the same problem.
>>> >>
>>> >> Any idea what I'm doing wrong?
>>> >>
>>> >> We are running ignite ver. 2.8.0#20200226-sha1:341b01df
>>> >> With java openjdk 11.0.7 2020-04-14
>>> >>
>>> >> Thank you!
>>> >>
>>> >> Best,
>>> >> Rafael
>>> >>
>>> >>
>>> >> Error Log:
>>> >> Exception in thread "main" javax.cache.CacheException: class
>>> >> org.apache.ignite.IgniteCheckedException: Failed to deserialize object
>>> >> [typeName=java.lang.invoke.SerializedLambda]
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1317)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:173)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5.onHasNext(GridCacheDistributedQueryManager.java:645)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.AutoClosableCursorIterator.hasNext(AutoClosableCursorIterator.java:49)
>>> >>         at ScanQueryTest.main(ScanQueryTest.java:49)
>>> >> Caused by: class org.apache.ignite.IgniteCheckedException: Failed to
>>> >> deserialize object [typeName=java.lang.invoke.SerializedLambda]
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10310)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest.finishUnmarshal(GridCacheQueryRequest.java:389)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.unmarshall(GridCacheIoManager.java:1625)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:586)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:392)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:318)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:109)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:308)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1843)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1468)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.managers.communication.GridIoManager.access$5200(GridIoManager.java:229)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1365)
>>> >>         at
>>> >>
>>> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>>> >>         at
>>> >>
>>> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>>> >>         at java.base/java.lang.Thread.run(Thread.java:834)
>>> >> Caused by: class org.apache.ignite.binary.BinaryObjectException:
>>> Failed to
>>> >> deserialize object [typeName=java.lang.invoke.SerializedLambda]
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:913)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1764)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:307)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0(BinaryMarshaller.java:101)
>>> >>         at
>>> >>
>>> org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:81)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10304)
>>> >>         ... 14 more
>>> >> Caused by: class org.apache.ignite.binary.BinaryObjectException:
>>> Failed to
>>> >> read field [name=capturingClass]
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:874)
>>> >>         ... 20 more
>>> >> Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException:
>>> >> ScanQueryTest
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1638)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1575)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1552)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryReaderExImpl.readClass(BinaryReaderExImpl.java:383)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:907)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read0(BinaryFieldAccessor.java:703)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:188)
>>> >>         ... 21 more
>>> >> Caused by: java.lang.ClassNotFoundException: ScanQueryTest
>>> >>         at
>>> >>
>>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
>>> >>         at
>>> >>
>>> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
>>> >>         at
>>> java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>>> >>         at java.base/java.lang.Class.forName0(Native Method)
>>> >>         at java.base/java.lang.Class.forName(Class.java:398)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
>>> >>         at
>>> >>
>>> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
>>> >>         ... 29 more
>>> >>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Rafael Troilo
>>> >> HeiGIT gGmbH
>>> >> Heidelberg Institute for Geoinformation Technology at Heidelberg
>>> University
>>> >>
>>> >> https://heigit.org | rafael.tro...@heigit.org | phone +49-6221-533
>>> 484
>>> >>
>>> >> Postal address: Schloss-Wolfsbrunnenweg 33 | 69118 Heidelberg |
>>> Germany
>>> <https://www.google.com/maps/search/Schloss-Wolfsbrunnenweg+33+%7C+69118+Heidelberg+%7C+Germany?entry=gmail&source=g>
>>> >> Offices: Berliner Str. 45 | 69120 Heidelberg | Germany
>>> <https://www.google.com/maps/search/Berliner+Str.+45+%7C+69120+Heidelberg+%7C+Germany?entry=gmail&source=g>
>>> >>
>>> >> Amtsgericht Mannheim | HRB 733765
>>> >> Managing Directors: Prof. Dr. Alexander Zipf | Dr. Gesa Schönberger
>>> >>
>>> >
>>>
>>> --
>>> Rafael Troilo
>>> HeiGIT gGmbH
>>> Heidelberg Institute for Geoinformation Technology at Heidelberg
>>> University
>>>
>>> https://heigit.org | rafael.tro...@heigit.org | phone +49-6221-533 484
>>>
>>> Postal address: Schloss-Wolfsbrunnenweg 33 | 69118 Heidelberg | Germany
>>> <https://www.google.com/maps/search/Schloss-Wolfsbrunnenweg+33+%7C+69118+Heidelberg+%7C+Germany?entry=gmail&source=g>
>>> Offices: Berliner Str. 45 | 69120 Heidelberg | Germany
>>> <https://www.google.com/maps/search/Berliner+Str.+45+%7C+69120+Heidelberg+%7C+Germany?entry=gmail&source=g>
>>>
>>> Amtsgericht Mannheim | HRB 733765
>>> Managing Directors: Prof. Dr. Alexander Zipf | Dr. Gesa Schönberger
>>>
>>
>
> --
> -
> Denis
>
>

Reply via email to