Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

ResponseConverter実験その1

ふむ。
自作しないかんという事がわかっただけ良しとするかなあ。

ResponseConverter

package org.seasar.teeda.extension.spike.json;

import java.io.StringWriter;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.betwixt.io.BeanWriter;
import org.json.JSONObject;

public class ResponseConverter {

	public String convertToJSON(Object o) throws Throwable {
		Map map = BeanUtils.describe(o);
		JSONObject json = new JSONObject(map);
		String str = json.toString();
		return str;
	}

	public String convertToXML(Object o) throws Throwable {
		StringWriter writer = new StringWriter();
		BeanWriter beanWriter = null;
		try {
			beanWriter = new BeanWriter(writer);
			beanWriter.setWriteIDs(false);
			beanWriter.setIndent("");
			beanWriter.setEndOfLine("");
			beanWriter.write(o);
			return writer.toString();
		} finally {
			if (beanWriter != null) {
				beanWriter.close();
			}
		}

	}
}

TestBean

package org.seasar.teeda.extension.spike.json;

import java.util.List;

public class TestBean {
	private String name;

	private String value;

	private List childList;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public List getChildList() {
		return childList;
	}

	public void setChildList(List childList) {
		this.childList = childList;
	}

}

TestCase

package org.seasar.teeda.extension.spike.json;

import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

public class ResponseConverterTest extends TestCase {

	public void testConvertToJSON() {
		TestBean b = new TestBean();
		b.setName("name");
		b.setValue("value");
		ResponseConverter c = new ResponseConverter();
		try {
			String json = c.convertToJSON(b);
			assertEquals(json, "{\"value\":\"value\",\"class\":\"class org.seasar.teeda.extension.spike.json.TestBean\",\"name\":\"name\"}");
		} catch (Throwable e) {
			e.printStackTrace();
			fail();
		}
	}

	public void testConvertToJSONWithArray() {
		TestBean b = new TestBean();
		b.setName("name");
		b.setValue("value");
		List l = new ArrayList();
		l.add("A");
		l.add("B");
		b.setChildList(l);
		ResponseConverter c = new ResponseConverter();
		try {
			String json = c.convertToJSON(b);
			assertEquals(json,
					"{\"value\":\"value\",\"childList\":\"[A, B]\",\"class\":\"class org.seasar.teeda.extension.spike.json.TestBean\",\"name\":\"name\"}");
		} catch (Throwable e) {
			e.printStackTrace();
			fail();
		}
	}

	public void testConvertToJSONWithBeanArray() {
		TestBean b = new TestBean();
		b.setName("name");
		b.setValue("value");
		List l = new ArrayList();
		TestBean c1 = new TestBean();
		c1.setName("name1");
		c1.setValue("value1");
		TestBean c2 = new TestBean();
		c2.setName("name2");
		c2.setValue("value3");
		l.add(c1);
		l.add(c2);
		b.setChildList(l);
		ResponseConverter c = new ResponseConverter();
		try {
			String json = c.convertToJSON(b);
			assertEquals(
					json,
					"{\"value\":\"value\",\"childList\":\"[org.seasar.teeda.extension.spike.json.TestBean@82701e, org.seasar.teeda.extension.spike.json.TestBean@18ee9d6]\",\"class\":\"class org.seasar.teeda.extension.spike.json.TestBean\",\"name\":\"name\"}");

		} catch (Throwable e) {
			e.printStackTrace();
			fail();
		}
	}

	public void testConvertToXML() {
		TestBean b = new TestBean();
		b.setName("name");
		b.setValue("value");
		ResponseConverter c = new ResponseConverter();
		try {
			String xml = c.convertToXML(b);
			assertEquals(xml, "<TestBean><childList/><name>name</name><value>value</value></TestBean>");

		} catch (Throwable e) {
			e.printStackTrace();
			fail();
		}
	}

	public void testConvertToXMLWithArray() {
		TestBean b = new TestBean();
		b.setName("name");
		b.setValue("value");
		List l = new ArrayList();
		l.add("A");
		l.add("B");
		b.setChildList(l);
		ResponseConverter c = new ResponseConverter();
		try {
			String json = c.convertToXML(b);
			assertEquals(json,
					"<TestBean><childList><String>A</String><String>B</String></childList><name>name</name><value>value</value></TestBean>");
		} catch (Throwable e) {
			e.printStackTrace();
			fail();
		}
	}

	public void testConvertToXmlWithBeanArray() {
		TestBean b = new TestBean();
		b.setName("name");
		b.setValue("value");
		List l = new ArrayList();
		TestBean c1 = new TestBean();
		c1.setName("name1");
		c1.setValue("value1");
		TestBean c2 = new TestBean();
		c2.setName("name2");
		c2.setValue("value3");
		l.add(c1);
		l.add(c2);
		b.setChildList(l);
		ResponseConverter c = new ResponseConverter();
		try {
			String json = c.convertToXML(b);
			assertEquals(
					json,
					"<TestBean><childList><TestBean><childList/><name>name1</name><value>value1</value></TestBean><TestBean><childList/><name>name2</name><value>value3</value></TestBean></childList><name>name</name><value>value</value></TestBean>");

		} catch (Throwable e) {
			e.printStackTrace();
			fail();
		}
	}

}

うん。こける。
JSONObjectは所詮入れ物。
再帰的変換処理できるようにJSONObjectは自作すべきだろうね。

JSONObject(Object o)

インスタンス化、再起で変換処理できるように改造すべきだな。
(BeanUtils.describeを更に内部で呼んで変換で十分気がする)
XMLはbetwixtのデフォルトで出してるだけ。

<TestBean>
<childList/>
<name>name</name>
<value>value</value>
</TestBean>

と出る。
Listなんかにクラスが入っているとそのクラス名が親エレメントとして値が出力される。

<TestBean>
<childList>
<String>A</String>
<String>B</String>
</childList>
<name>name</name>
<value>value</value>
</TestBean>

うーん、これはこれでいいような気もする。
XMLへの変換はルールでしかない。(標準なんてないんだし)
気にいらないなら.betwxtでカスタマイズも可能。
もしくは自分で書けの領域でしょう。
(そもそもXMLはキリのない領域だと個人的には思っている)
まーこの辺は話題の

commons-hell

との兼ね合いもあるので要相談でしょうw
イメージ的はDtoを作って

package org.seasar.teeda.extension.spike.dto;

import java.util.List;

public class AjaxBean {
        public static final RESPONSE_TYPE = "text/json"
	private String name;

	private String value;

	private List childList;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public List getChildList() {
		return childList;
	}

	public void setChildList(List childList) {
		this.childList = childList;
	}

}

定数でresponse拾ってこいつを変換かまして吐くって感じかな。
AjaxDtoでいつものパターン通りって方がわかりやすいのでこーいう風にしていきたい。
実際に使う人の感覚次第ってのもあるけどね。
うくく。