/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * 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.seasar.framework.container.hotdeploy; import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import org.seasar.framework.container.impl.S2ContainerBehavior; import org.seasar.framework.convention.impl.NamingConventionImpl; import org.seasar.framework.unit.S2FrameworkTestCase; /** * @author higa * */ public class HotdeployUtilTest extends S2FrameworkTestCase { protected void tearDown() { S2ContainerBehavior .setProvider(new S2ContainerBehavior.DefaultProvider()); } /** * @throws Exception */ public void testIsHotdeploy() throws Exception { assertFalse(HotdeployUtil.isHotdeploy()); S2ContainerBehavior.setProvider(new HotdeployBehavior()); assertTrue(HotdeployUtil.isHotdeploy()); } /** * @throws Exception */ public void testRebuildValue_simpleType() throws Exception { assertEquals("111", HotdeployUtil.rebuildValueInternal("111")); } /** * @throws Exception */ public void testRebuildValue_array() throws Exception { String[] array = (String[]) HotdeployUtil .rebuildValueInternal(new String[] { "aaa", "bbb" }); assertEquals(2, array.length); assertEquals("aaa", array[0]); assertEquals("bbb", array[1]); } /** * @throws Exception */ public void testRebuildValue_array_primitive() throws Exception { int[] array = (int[]) HotdeployUtil.rebuildValueInternal(new int[] { 1, 2 }); assertEquals(2, array.length); assertEquals(1, array[0]); assertEquals(2, array[1]); } /** * @throws Exception */ public void testRebuildValue_arrayList() throws Exception { ArrayList src = new ArrayList(); src.add("aaa"); src.add("bbb"); ArrayList dest = (ArrayList) HotdeployUtil.rebuildValueInternal(src); assertEquals(2, dest.size()); assertEquals("aaa", dest.get(0)); assertEquals("bbb", dest.get(1)); } /** * @throws Exception */ public void testRebuildValue_collection() throws Exception { LinkedList src = new LinkedList(); src.add("aaa"); src.add("bbb"); LinkedList dest = (LinkedList) HotdeployUtil.rebuildValueInternal(src); assertEquals(2, dest.size()); assertEquals("aaa", dest.get(0)); assertEquals("bbb", dest.get(1)); } /** * @throws Exception */ public void testRebuildValue_map() throws Exception { HashMap src = new HashMap(); src.put("aaa", "111"); HashMap dest = (HashMap) HotdeployUtil.rebuildValueInternal(src); assertEquals(1, dest.size()); assertEquals("111", dest.get("aaa")); } /** * @throws Exception */ public void testRebuildValue_bean() throws Exception { Hoge src = new Hoge(); src.setAaa("111"); Hoge hoge = new Hoge(); hoge.setAaa("222"); src.setHoge(hoge); Hoge dest = (Hoge) HotdeployUtil.rebuildValueInternal(src); assertNotSame(src, dest); assertEquals("111", dest.getAaa()); assertNotNull(dest.getHoge()); assertEquals("222", dest.getHoge().getAaa()); } /** * @throws Exception */ public void testRebuildValue_arrayListWithPrimitiveA() throws Exception { boolean defaultDeployMode = isWarmDeploy(); setWarmDeploy(true); try { ArrayList list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc"); List value = (List) HotdeployUtil.rebuildValue(list); assertTrue(value.size() == 3); } finally { setWarmDeploy(defaultDeployMode); } } /** * @throws Exception */ public void testRebuildValue_arrayListWithDto() throws Exception { boolean defaultDeployMode = isWarmDeploy(); setWarmDeploy(true); try { ArrayList list = new ArrayList(); { Hoge hoge = new Hoge(); hoge.setAaa("A"); list.add(hoge); } { Hoge hoge = new Hoge(); hoge.setAaa("B"); list.add(hoge); } { Hoge hoge = new Hoge(); hoge.setAaa("C"); list.add(hoge); } List value = (List) HotdeployUtil.rebuildValue(list); assertTrue(value.size() == 3); Hoge h = (Hoge) value.get(0); assertEquals("A", h.getAaa()); } finally { setWarmDeploy(defaultDeployMode); } } /** * @throws Exception */ public void testRebuildValue_arrayListWithDto2() throws Exception { boolean defaultDeployMode = isWarmDeploy(); setWarmDeploy(true); try { ArrayList list = new ArrayList(); { Hoge hoge = new Hoge(); hoge.setAaa("A"); Foo f = new Foo(); f.setNum(1); hoge.setFoo(f); list.add(hoge); } { Hoge hoge = new Hoge(); hoge.setAaa("B"); Foo f = new Foo(); f.setNum(2); hoge.setFoo(f); list.add(hoge); } { Hoge hoge = new Hoge(); hoge.setAaa("C"); Foo f = new Foo(); f.setNum(3); hoge.setFoo(f); list.add(hoge); } List value = (List) HotdeployUtil.rebuildValue(list); assertTrue(value.size() == 3); Hoge h = (Hoge) value.get(0); assertEquals("A", h.getAaa()); assertTrue(h.getFoo().getNum() == 1); } finally { setWarmDeploy(defaultDeployMode); } } /** * @throws Exception */ public void testPerformance() throws Exception { int n = 1000; Bar[] src = new Bar[n]; for (int i = 0; i < n; ++i) { src[i] = new Bar(); } ClassLoader originalLoader = Thread.currentThread() .getContextClassLoader(); NamingConventionImpl convention = new NamingConventionImpl(); for (int i = 0; i < 5; ++i) { HotdeployClassLoader hotLoader = new HotdeployClassLoader( originalLoader, convention); Thread.currentThread().setContextClassLoader(hotLoader); try { long t1 = System.currentTimeMillis(); Bar[] dest = (Bar[]) HotdeployUtil.rebuildValueInternal(src); long t2 = System.currentTimeMillis(); System.out.println("" + (t2 - t1) + "ms"); assertEquals(n, dest.length); assertEquals("A", dest[0].s01); } finally { Thread.currentThread().setContextClassLoader(originalLoader); } } } /** * @throws Exception */ public void testDeserialize_simpleType() throws Exception { assertEquals("111", HotdeployUtil.deserializeInternal(serialize("111"))); } /** * @throws Exception */ public void testDeserialize_array() throws Exception { String[] array = (String[]) HotdeployUtil .deserializeInternal(serialize(new String[] { "aaa", "bbb" })); assertEquals(2, array.length); assertEquals("aaa", array[0]); assertEquals("bbb", array[1]); } /** * @throws Exception */ public void testDeserialize_array_primitive() throws Exception { int[] array = (int[]) HotdeployUtil .deserializeInternal(serialize(new int[] { 1, 2 })); assertEquals(2, array.length); assertEquals(1, array[0]); assertEquals(2, array[1]); } /** * @throws Exception */ public void testDeserialize_arrayList() throws Exception { ArrayList src = new ArrayList(); src.add("aaa"); src.add("bbb"); ArrayList dest = (ArrayList) HotdeployUtil .deserializeInternal(serialize(src)); assertEquals(2, dest.size()); assertEquals("aaa", dest.get(0)); assertEquals("bbb", dest.get(1)); } /** * @throws Exception */ public void testDeserialize_collection() throws Exception { LinkedList src = new LinkedList(); src.add("aaa"); src.add("bbb"); LinkedList dest = (LinkedList) HotdeployUtil .deserializeInternal(serialize(src)); assertEquals(2, dest.size()); assertEquals("aaa", dest.get(0)); assertEquals("bbb", dest.get(1)); } /** * @throws Exception */ public void testDeserialize_map() throws Exception { HashMap src = new HashMap(); src.put("aaa", "111"); HashMap dest = (HashMap) HotdeployUtil .deserializeInternal(serialize(src)); assertEquals(1, dest.size()); assertEquals("111", dest.get("aaa")); } /** * @throws Exception */ public void testDeserialize_bean() throws Exception { Hoge src = new Hoge(); src.setAaa("111"); Hoge hoge = new Hoge(); hoge.setAaa("222"); src.setHoge(hoge); Hoge dest = (Hoge) HotdeployUtil.deserializeInternal(serialize(src)); assertNotSame(src, dest); assertEquals("111", dest.getAaa()); assertNotNull(dest.getHoge()); assertEquals("222", dest.getHoge().getAaa()); } /** * @throws Exception */ public void testDeserialize_arrayListWithPrimitiveA() throws Exception { boolean defaultDeployMode = isWarmDeploy(); setWarmDeploy(true); try { ArrayList list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc"); List value = (List) HotdeployUtil .deserializeInternal(serialize(list)); assertTrue(value.size() == 3); } finally { setWarmDeploy(defaultDeployMode); } } /** * @throws Exception */ public void testDeserialize_arrayListWithDto() throws Exception { boolean defaultDeployMode = isWarmDeploy(); setWarmDeploy(true); try { ArrayList list = new ArrayList(); { Hoge hoge = new Hoge(); hoge.setAaa("A"); list.add(hoge); } { Hoge hoge = new Hoge(); hoge.setAaa("B"); list.add(hoge); } { Hoge hoge = new Hoge(); hoge.setAaa("C"); list.add(hoge); } List value = (List) HotdeployUtil .deserializeInternal(serialize(list)); assertTrue(value.size() == 3); Hoge h = (Hoge) value.get(0); assertEquals("A", h.getAaa()); } finally { setWarmDeploy(defaultDeployMode); } } /** * @throws Exception */ public void testDeserialize_arrayListWithDto2() throws Exception { boolean defaultDeployMode = isWarmDeploy(); setWarmDeploy(true); try { ArrayList list = new ArrayList(); { Hoge hoge = new Hoge(); hoge.setAaa("A"); Foo f = new Foo(); f.setNum(1); hoge.setFoo(f); list.add(hoge); } { Hoge hoge = new Hoge(); hoge.setAaa("B"); Foo f = new Foo(); f.setNum(2); hoge.setFoo(f); list.add(hoge); } { Hoge hoge = new Hoge(); hoge.setAaa("C"); Foo f = new Foo(); f.setNum(3); hoge.setFoo(f); list.add(hoge); } List value = (List) HotdeployUtil .deserializeInternal(serialize(list)); assertTrue(value.size() == 3); Hoge h = (Hoge) value.get(0); assertEquals("A", h.getAaa()); assertTrue(h.getFoo().getNum() == 1); } finally { setWarmDeploy(defaultDeployMode); } } private byte[] serialize(Object o) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(o); oos.close(); return baos.toByteArray(); } /** * */ public static class Hoge implements Serializable { private static final long serialVersionUID = 1L; private String aaa; private Hoge hoge; private Foo foo; /** * @return */ public Foo getFoo() { return foo; } /** * @param foo */ public void setFoo(Foo foo) { this.foo = foo; } /** * @return Returns the aaa. */ public String getAaa() { return aaa; } /** * @param aaa * The aaa to set. */ public void setAaa(String aaa) { this.aaa = aaa; } /** * @return Returns the hoge. */ public Hoge getHoge() { return hoge; } /** * @param hoge * The hoge to set. */ public void setHoge(Hoge hoge) { this.hoge = hoge; } } /** * */ public static class Foo implements Serializable { private static final long serialVersionUID = 1L; private int num; /** * @return */ public int getNum() { return num; } /** * @param num */ public void setNum(int num) { this.num = num; } } /** * */ public static class Bar implements Serializable { private static final long serialVersionUID = 1L; /** */ public String s01; /** */ public String s02; /** */ public String s03; /** */ public String s04; /** */ public String s05; /** */ public String s06; /** */ public String s07; /** */ public String s08; /** */ public String s09; /** */ public String s10; /** */ public String s11; /** */ public String s12; /** */ public String s13; /** */ public String s14; /** */ public String s15; /** */ public String s16; /** */ public String s17; /** */ public String s18; /** */ public String s19; /** */ public String s20; /** * */ public Bar() { s01 = "A"; s02 = "B"; s03 = "C"; s04 = "D"; s05 = "E"; s06 = "F"; s07 = "G"; s08 = "H"; s09 = "I"; s10 = "J"; s11 = "K"; s12 = "L"; s13 = "M"; s14 = "N"; s15 = "O"; s16 = "P"; s17 = "Q"; s18 = "R"; s19 = "S"; s20 = "T"; } } }