java: adds ReflectionPacker and ReflectionTemplate

This commit is contained in:
frsyuki 2010-09-27 04:17:20 +09:00
parent 7161a235f1
commit 002b86198c
5 changed files with 196 additions and 1 deletions

View File

@ -20,6 +20,6 @@ package org.msgpack;
import java.io.IOException;
public interface MessageConverter {
public Object convert(MessagePackObject obj) throws MessageTypeException;
public Object convert(MessagePackObject from) throws MessageTypeException;
}

View 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 {
}

View 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
}
}
}

View 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;
}
}

View File

@ -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);
}
}