mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-28 18:37:51 +01:00
java: adds ReflectionPacker and ReflectionTemplate
This commit is contained in:
parent
7161a235f1
commit
002b86198c
@ -20,6 +20,6 @@ package org.msgpack;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public interface MessageConverter {
|
public interface MessageConverter {
|
||||||
public Object convert(MessagePackObject obj) throws MessageTypeException;
|
public Object convert(MessagePackObject from) throws MessageTypeException;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
26
java/src/main/java/org/msgpack/ReflectionBase.java
Normal file
26
java/src/main/java/org/msgpack/ReflectionBase.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// MessagePack for Java
|
||||||
|
//
|
||||||
|
// Copyright (C) 2009-2010 FURUHASHI Sadayuki
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
package org.msgpack;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
|
||||||
|
// FIXME mock-up
|
||||||
|
abstract class ReflectionBase {
|
||||||
|
}
|
||||||
|
|
49
java/src/main/java/org/msgpack/ReflectionPacker.java
Normal file
49
java/src/main/java/org/msgpack/ReflectionPacker.java
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
//
|
||||||
|
// MessagePack for Java
|
||||||
|
//
|
||||||
|
// Copyright (C) 2009-2010 FURUHASHI Sadayuki
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
package org.msgpack;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
|
||||||
|
// FIXME mock-up
|
||||||
|
public class ReflectionPacker extends ReflectionBase implements MessagePacker {
|
||||||
|
private Class<?> klass;
|
||||||
|
|
||||||
|
private ReflectionPacker(Class<?> klass) {
|
||||||
|
this.klass = klass;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public ReflectionPacker create(Class klass) {
|
||||||
|
// FIXME code generation: generates subclass of ReflectionPacker
|
||||||
|
// returned instance will be cached by Packer into CustomPacker
|
||||||
|
return new ReflectionPacker(klass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pack(Packer pk, Object target) throws IOException {
|
||||||
|
Field[] fields = klass.getDeclaredFields();
|
||||||
|
pk.packArray(fields.length);
|
||||||
|
try {
|
||||||
|
for(int i=0; i < fields.length; i++) {
|
||||||
|
pk.pack(fields[i].get(target));
|
||||||
|
}
|
||||||
|
} catch(IllegalAccessException e) {
|
||||||
|
throw new MessageTypeException(e.getMessage()); // FIXME
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
74
java/src/main/java/org/msgpack/ReflectionTemplate.java
Normal file
74
java/src/main/java/org/msgpack/ReflectionTemplate.java
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
//
|
||||||
|
// MessagePack for Java
|
||||||
|
//
|
||||||
|
// Copyright (C) 2009-2010 FURUHASHI Sadayuki
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
package org.msgpack;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
import org.msgpack.template.ClassTemplate;
|
||||||
|
|
||||||
|
// FIXME mock-up
|
||||||
|
public class ReflectionTemplate extends ReflectionBase implements Template {
|
||||||
|
private Class klass;
|
||||||
|
|
||||||
|
private ReflectionTemplate(Class klass) {
|
||||||
|
this.klass = klass;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public ReflectionTemplate create(Class klass) {
|
||||||
|
// FIXME code generation: generates subclass of ReflectionPacker
|
||||||
|
// returned instance will be cached by ClassTemplate into CustomUnpacker/CustomConverter
|
||||||
|
return new ReflectionTemplate(klass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object unpack(Unpacker pac) throws IOException, MessageTypeException {
|
||||||
|
// FIXME optimize it
|
||||||
|
return convert(pac.unpackObject());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object convert(MessagePackObject from) throws MessageTypeException {
|
||||||
|
Object obj;
|
||||||
|
try {
|
||||||
|
obj = klass.newInstance();
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw new MessageTypeException(e.getMessage()); // FIXME
|
||||||
|
} catch (InstantiationException e) {
|
||||||
|
throw new MessageTypeException(e.getMessage()); // FIXME
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME check Requred/Optional
|
||||||
|
|
||||||
|
Field[] fields = klass.getDeclaredFields();
|
||||||
|
MessagePackObject[] array = from.asArray();
|
||||||
|
if(fields.length < array.length) {
|
||||||
|
throw new MessageTypeException();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
for(int i=0; i < fields.length; i++) {
|
||||||
|
// FIXME generics getDeclaringClass
|
||||||
|
Object value = new ClassTemplate(fields[i].getType()).convert(array[i]);
|
||||||
|
fields[i].set(obj, value);
|
||||||
|
}
|
||||||
|
} catch(IllegalAccessException e) {
|
||||||
|
throw new MessageTypeException(e.getMessage()); // FIXME
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
|||||||
|
package org.msgpack;
|
||||||
|
|
||||||
|
import static org.msgpack.Templates.*;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class TestReflectionPackerTemplate {
|
||||||
|
|
||||||
|
public static class StringFieldClass {
|
||||||
|
public String s1;
|
||||||
|
public String s2;
|
||||||
|
public StringFieldClass() { }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPackConvert() throws Exception {
|
||||||
|
tString();
|
||||||
|
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
MessagePacker packer = ReflectionPacker.create(StringFieldClass.class);
|
||||||
|
|
||||||
|
StringFieldClass src = new StringFieldClass();
|
||||||
|
|
||||||
|
src.s1 = "kumofs";
|
||||||
|
src.s2 = "frsyuki";
|
||||||
|
|
||||||
|
packer.pack(new Packer(out), src);
|
||||||
|
|
||||||
|
Template tmpl = ReflectionTemplate.create(StringFieldClass.class);
|
||||||
|
|
||||||
|
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
|
||||||
|
|
||||||
|
Object obj = tmpl.unpack(new Unpacker(in));
|
||||||
|
assertEquals(obj.getClass(), StringFieldClass.class);
|
||||||
|
|
||||||
|
StringFieldClass dst = (StringFieldClass)obj;
|
||||||
|
assertEquals(src.s1, dst.s1);
|
||||||
|
assertEquals(src.s2, dst.s2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user