/** * OpenSpotLight - Open Source IT Governance Platform * * Copyright (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA * or third-party contributors as indicated by the @author tags or express * copyright attribution statements applied by the authors. All third-party * contributions are distributed under license by CARAVELATECH CONSULTORIA E * TECNOLOGIA EM INFORMATICA LTDA. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA * *********************************************************************** * OpenSpotLight - Plataforma de Governança de TI de Código Aberto * * Direitos Autorais Reservados (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA * EM INFORMATICA LTDA ou como contribuidores terceiros indicados pela etiqueta * @author ou por expressa atribuição de direito autoral declarada e atribuída pelo autor. * Todas as contribuições de terceiros estão distribuídas sob licença da * CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA. * * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo sob os * termos da Licença Pública Geral Menor do GNU conforme publicada pela Free Software * Foundation. * * Este programa é distribuído na expectativa de que seja útil, porém, SEM NENHUMA * GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU ADEQUAÇÃO A UMA * FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor do GNU para mais detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto com este * programa; se não, escreva para: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.openspotlight.persist.test; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.assertThat; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import org.hamcrest.core.Is; import org.hamcrest.core.IsNot; import org.hamcrest.core.IsNull; import org.jredis.JRedis; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.openspotlight.common.exception.SLRuntimeException; import org.openspotlight.persist.support.SimplePersistCapable; import org.openspotlight.persist.support.SimplePersistImpl; import org.openspotlight.storage.PartitionFactory.RegularPartitions; import org.openspotlight.storage.StorageSession; import org.openspotlight.storage.domain.StorageNode; import org.openspotlight.storage.redis.guice.JRedisFactory; import org.openspotlight.storage.redis.guice.JRedisStorageModule; import org.openspotlight.storage.redis.util.ExampleRedisConfig; import com.google.inject.Guice; import com.google.inject.Injector; /** * The Class SimplePersistSupportTest. */ public class SimplePersistSupportTest { private StorageSession session; final Injector autoFlushInjector; SimplePersistCapable<StorageNode, StorageSession> simplePersist; public SimplePersistSupportTest() { autoFlushInjector = Guice.createInjector(new JRedisStorageModule(StorageSession.FlushMode.AUTO, ExampleRedisConfig.EXAMPLE.getMappedServerConfig())); } /** * Setup session. */ @Before public void setupSession() throws Exception { final JRedis jRedis = autoFlushInjector.getInstance(JRedisFactory.class).getFrom(RegularPartitions.FEDERATION); jRedis.flushall(); session = autoFlushInjector.getInstance(StorageSession.class); simplePersist = new SimplePersistImpl(session, RegularPartitions.FEDERATION); } @Test public void shouldAddAndRemoveNodeOnAnotherNode() throws Exception { final RootObj root = new RootObj(); final LevelOneObj levelOne = new LevelOneObj(); levelOne.setRootObj(root); final LevelTwoObj levelTwo = new LevelTwoObj(); levelTwo.setLevelOneObj(levelOne); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("name"); propertyObj.setValue(3); levelTwo.setPropertyObj(propertyObj); StorageNode asJcr = simplePersist.convertBeanToNode(levelTwo); LevelTwoObj anotherLevelTwo = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelTwo.getPropertyObj().getName(), Is.is(propertyObj.getName())); assertThat(anotherLevelTwo.getPropertyObj().getValue(), Is.is(propertyObj.getValue())); propertyObj.setName("anotherName"); propertyObj.setValue(4); asJcr = simplePersist.convertBeanToNode(levelTwo); anotherLevelTwo = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelTwo.getPropertyObj().getName(), Is.is(propertyObj.getName())); assertThat(anotherLevelTwo.getPropertyObj().getValue(), Is.is(propertyObj.getValue())); levelTwo.setPropertyObj(null); asJcr = simplePersist.convertBeanToNode(levelTwo); anotherLevelTwo = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelTwo.getPropertyObj(), Is.is(IsNull.nullValue())); } @Test public void shouldAddAndRemoveNodeOnCollection() throws Exception { final RootObj root = new RootObj(); final LevelOneObj levelOne = new LevelOneObj(); levelOne.setRootObj(root); final LevelTwoObj levelTwo = new LevelTwoObj(); levelTwo.setLevelOneObj(levelOne); final LevelThreeObj levelThree = new LevelThreeObj(); levelThree.setLevelTwoObj(levelTwo); levelThree.setObjList(new ArrayList<ListItemObj>()); final ListItemObj obj1 = new ListItemObj(); obj1.setName("obj 1"); obj1.setValue(5); levelThree.getObjList().add(obj1); StorageNode asJcr = simplePersist.convertBeanToNode(levelThree); LevelThreeObj anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree.getObjList().size(), Is.is(1)); assertThat(anotherLevelThree.getObjList().get(0).getValue(), Is.is(obj1.getValue())); assertThat(anotherLevelThree.getObjList().get(0).getName(), Is.is(obj1.getName())); obj1.setName("anotherName"); final ListItemObj obj2 = new ListItemObj(); obj2.setName("another name 2"); obj2.setValue(33); levelThree.getObjList().add(obj2); asJcr = simplePersist.convertBeanToNode(levelThree); anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree.getObjList().size(), Is.is(2)); assertThat(anotherLevelThree.getObjList().get(0).getValue(), Is.is(obj1.getValue())); assertThat(anotherLevelThree.getObjList().get(0).getName(), Is.is(obj1.getName())); assertThat(anotherLevelThree.getObjList().get(1).getValue(), Is.is(obj2.getValue())); assertThat(anotherLevelThree.getObjList().get(1).getName(), Is.is(obj2.getName())); levelThree.getObjList().clear(); asJcr = simplePersist.convertBeanToNode(levelThree); anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree.getObjList().size(), Is.is(0)); } @Test public void shouldAddAndRemoveNodeOnMapProperty() throws Exception { final RootObj root = new RootObj(); final LevelOneObj levelOne = new LevelOneObj(); levelOne.setRootObj(root); final LevelTwoObj levelTwo = new LevelTwoObj(); levelTwo.setLevelOneObj(levelOne); final LevelThreeObj levelThree = new LevelThreeObj(); levelThree.setLevelTwoObj(levelTwo); final MapValueObj obj1 = new MapValueObj(); obj1.setName("obj 1"); obj1.setValue(5); StorageNode asJcr = simplePersist.convertBeanToNode(levelThree); LevelThreeObj anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree, IsNull.notNullValue()); obj1.setValue(4); asJcr = simplePersist.convertBeanToNode(levelThree); anotherLevelThree = simplePersist.convertNodeToBean(asJcr); asJcr = simplePersist.convertBeanToNode(levelThree); anotherLevelThree = simplePersist.convertNodeToBean(asJcr); } @Test public void shouldAddAndRemoveSimpleTypeOnCollection() throws Exception { final RootObj root = new RootObj(); final LevelOneObj levelOne = new LevelOneObj(); levelOne.setRootObj(root); final LevelTwoObj levelTwo = new LevelTwoObj(); levelTwo.setLevelOneObj(levelOne); final LevelThreeObj levelThree = new LevelThreeObj(); levelThree.setLevelTwoObj(levelTwo); levelThree.setBooleanList(new ArrayList<Boolean>()); levelThree.getBooleanList().add(true); StorageNode asJcr = simplePersist.convertBeanToNode(levelThree); LevelThreeObj anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree.getBooleanList().size(), Is.is(1)); assertThat(anotherLevelThree.getBooleanList().get(0), Is.is(true)); levelThree.getBooleanList().add(false); asJcr = simplePersist.convertBeanToNode(levelThree); anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree.getBooleanList().size(), Is.is(2)); assertThat(anotherLevelThree.getBooleanList().get(0), Is.is(true)); assertThat(anotherLevelThree.getBooleanList().get(1), Is.is(false)); levelThree.getBooleanList().clear(); asJcr = simplePersist.convertBeanToNode(levelThree); anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree.getObjList().size(), Is.is(0)); } // @Test // public void shouldAddAndRemoveSimpleTypeOnMapProperty() throws Exception // { // final RootObj root = new RootObj(); // final LevelOneObj levelOne = new LevelOneObj(); // levelOne.setRootObj(root); // final LevelTwoObj levelTwo = new LevelTwoObj(); // levelTwo.setLevelOneObj(levelOne); // final LevelThreeObj levelThree = new LevelThreeObj(); // levelThree.setLevelTwoObj(levelTwo); // levelThree.setNumberMap(new HashMap<Double, Integer>()); // levelThree.getNumberMap().put(1.0, 1); // StorageNode asJcr = simplePersist.convertBeanToNode( // levelThree); // LevelThreeObj anotherLevelThree = simplePersist // .convertNodeToBean( asJcr); // assertThat(anotherLevelThree.getNumberMap().size(), Is.is(1)); // assertThat(anotherLevelThree.getNumberMap().get(1.0), Is.is(1)); // // levelThree.getNumberMap().put(2.0, 2); // // asJcr = simplePersist.convertBeanToNode( // levelThree); // anotherLevelThree = simplePersist.convertNodeToBean( // asJcr); // assertThat(anotherLevelThree.getNumberMap().size(), Is.is(2)); // assertThat(anotherLevelThree.getNumberMap().get(1.0), Is.is(1)); // assertThat(anotherLevelThree.getNumberMap().get(2.0), Is.is(2)); // // levelThree.getNumberMap().clear(); // asJcr = simplePersist.convertBeanToNode( // levelThree); // anotherLevelThree = simplePersist.convertNodeToBean( // asJcr); // assertThat(anotherLevelThree.getNumberMap().size(), Is.is(0)); // } // /** // * Should convert bean to jcr node. // * // * @throws Exception // * the exception // */ // @Test // public void shouldconvertBeanToNodeNode() throws Exception { // final RootObj root = new RootObj(); // final LevelOneObj obj1 = new LevelOneObj(); // final LevelTwoObj obj2 = new LevelTwoObj(); // final LevelThreeObj obj3 = new LevelThreeObj(); // obj1.setRootObj(root); // obj2.setLevelOneObj(obj1); // final PropertyObj propertyObj = new PropertyObj(); // propertyObj.setName("name"); // propertyObj.setValue(2); // obj2.setPropertyObj(propertyObj); // obj3.setLevelTwoObj(obj2); // obj2.setProperty("propVal"); // final StorageNode StorageNode = simplePersist.convertBeanToNode( // SharedConstants.DEFAULT_JCR_ROOT_NAME, obj3); // final String path = node.getPath(); // assertThat( // path, // Is // .is("/osl/NODE_org_openspotlight_persist_test_RootObj/NODE_org_openspotlight_persist_test_LevelOneObj/NODE_org_openspotlight_persist_test_LevelTwoObj/NODE_org_openspotlight_persist_test_LevelThreeObj")); // assertThat(node.getProperty("node_property_property_type") // .getString(), Is.is("java.lang.String")); // assertThat(node.getProperty("node_typeName").getString(), Is // .is("org.openspotlight.persist.test.LevelThreeObj")); // assertThat(node.getProperty("node_hashValue").getString(), Is // .is("401bb295-1e5a-349f-976a-47c9ab205eaa")); // assertThat(node.getProperty("node_key_key_type").getString(), Is // .is("java.lang.String")); // // final StorageNode parentStorageNode = node.getParent(); // assertThat(parentNode.getProperty("node_property_property_type") // .getString(), Is.is("java.lang.String")); // assertThat(parentNode.getProperty("node_typeName").getString(), // Is.is("org.openspotlight.persist.test.LevelTwoObj")); // assertThat(parentNode.getProperty("node_hashValue").getString(), // Is.is("026dc045-a954-333e-ab47-6b5192a09134")); // assertThat(parentNode // .getProperty("node_property_property_value").getString(), Is // .is("propVal")); // assertThat(parentNode.getProperty("node_key_key_type") // .getString(), Is.is("java.lang.String")); // final StorageNode nodeProperty = parentNode // .getNode("NODE_PROPERTY_propertyObj"); // assertThat(nodeProperty.getProperty("node_key_value_type") // .getString(), Is.is("int")); // assertThat(nodeProperty.getProperty("node_hashValue") // .getString(), Is.is("f9facf49-a10f-35f3-90d5-1f2babe7478f")); // assertThat(nodeProperty.getProperty("node_property_name_type") // .getString(), Is.is("java.lang.String")); // assertThat(nodeProperty.getProperty("node_key_value_value") // .getString(), Is.is("2")); // assertThat( // nodeProperty.getProperty("property_name").getString(), Is // .is("propertyObj")); // assertThat(nodeProperty.getProperty("node_property_name_value") // .getString(), Is.is("name")); // assertThat( // nodeProperty.getProperty("node_typeName").getString(), Is // .is("org.openspotlight.persist.test.PropertyObj")); // } // /** * Should convert jcr StorageNode to bean. * * @throws Exception the exception */ @Test public void shouldConvertJcrNodeToBean() throws Exception { final RootObj root = new RootObj(); final LevelOneObj obj1 = new LevelOneObj(); final LevelTwoObj obj2 = new LevelTwoObj(); final LevelThreeObj obj3 = new LevelThreeObj(); final ListItemObj li1 = new ListItemObj(); li1.setName("1"); li1.setValue(1); final ListItemObj li2 = new ListItemObj(); li2.setName("2"); li2.setValue(2); final ListItemObj li3 = new ListItemObj(); li3.setName("3"); li3.setValue(3); obj3.getObjList().add(li1); obj3.getObjList().add(li2); obj3.getObjList().add(li3); final MapValueObj mapVal1 = new MapValueObj(); mapVal1.setName("1"); final MapValueObj mapVal2 = new MapValueObj(); mapVal2.setName("2"); final MapValueObj mapVal3 = new MapValueObj(); mapVal3.setName("3"); obj1.setRootObj(root); obj2.setLevelOneObj(obj1); obj3.setLevelTwoObj(obj2); obj3.setBooleanList(new ArrayList<Boolean>()); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.FALSE); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.TRUE); obj3.setNumberMap(new HashMap<Double, Integer>()); obj3.getNumberMap().put(1.0, 3); obj3.getNumberMap().put(2.0, 2); obj3.getNumberMap().put(3.0, 1); obj2.setProperty("propVal"); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("name"); propertyObj.setValue(2); obj2.setPropertyObj(propertyObj); final StorageNode node = simplePersist.convertBeanToNode( obj3); final LevelThreeObj convertedFromJcr = simplePersist.convertNodeToBean(node); assertThat(obj3.getKey(), Is.is(convertedFromJcr.getKey())); assertThat(obj3.getProperty(), Is.is(convertedFromJcr.getProperty())); assertThat(obj3.getLevelTwoObj().getKey(), Is.is(convertedFromJcr.getLevelTwoObj().getKey())); assertThat(obj3.getLevelTwoObj().getPropertyObj().getName(), Is.is(convertedFromJcr.getLevelTwoObj().getPropertyObj().getName())); assertThat(obj3.getLevelTwoObj().getLevelOneObj().getProperty(), Is.is(convertedFromJcr.getLevelTwoObj().getLevelOneObj().getProperty())); assertThat(convertedFromJcr.getBooleanList(), Is.is(Arrays.asList(true, false, true, true))); assertThat(convertedFromJcr.getNumberMap().get(1.0), Is.is(3)); assertThat(convertedFromJcr.getNumberMap().get(2.0), Is.is(2)); assertThat(convertedFromJcr.getNumberMap().get(3.0), Is.is(1)); assertThat(convertedFromJcr.getObjList().size(), Is.is(3)); assertThat(convertedFromJcr.getObjList().get(0).getName(), Is.is("1")); assertThat(convertedFromJcr.getObjList().get(1).getName(), Is.is("2")); assertThat(convertedFromJcr.getObjList().get(2).getName(), Is.is("3")); } @Test public void shouldConvertJcrNodeToBeanWithParent() throws Exception { final RootObj root = new RootObj(); final LevelOneObj obj1 = new LevelOneObj(); final LevelTwoObj obj2 = new LevelTwoObj(); final LevelThreeObj obj3 = new LevelThreeObj(); final ListItemObj li1 = new ListItemObj(); li1.setName("1"); li1.setValue(1); final ListItemObj li2 = new ListItemObj(); li2.setName("2"); li2.setValue(2); final ListItemObj li3 = new ListItemObj(); li3.setName("3"); li3.setValue(3); obj3.getObjList().add(li1); obj3.getObjList().add(li2); obj3.getObjList().add(li3); final MapValueObj mapVal1 = new MapValueObj(); mapVal1.setName("1"); final MapValueObj mapVal2 = new MapValueObj(); mapVal2.setName("2"); final MapValueObj mapVal3 = new MapValueObj(); mapVal3.setName("3"); obj1.setRootObj(root); obj2.setLevelOneObj(obj1); obj3.setLevelTwoObj(obj2); obj3.setBooleanList(new ArrayList<Boolean>()); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.FALSE); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.TRUE); obj3.setNumberMap(new HashMap<Double, Integer>()); obj3.getNumberMap().put(1.0, 3); obj3.getNumberMap().put(2.0, 2); obj3.getNumberMap().put(3.0, 1); obj2.setProperty("propVal"); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("name"); propertyObj.setValue(2); obj2.setPropertyObj(propertyObj); final StorageNode parentNode = session.withPartition(RegularPartitions.FEDERATION).createNewSimpleNode("a", "b", "c"); final StorageNode node = simplePersist.convertBeanToNode(parentNode, obj3); final LevelThreeObj convertedFromJcr = simplePersist.convertNodeToBean(node); assertThat(obj3.getKey(), Is.is(convertedFromJcr.getKey())); assertThat(obj3.getProperty(), Is.is(convertedFromJcr.getProperty())); assertThat(obj3.getLevelTwoObj().getKey(), Is.is(convertedFromJcr.getLevelTwoObj().getKey())); assertThat(obj3.getLevelTwoObj().getPropertyObj().getName(), Is.is(convertedFromJcr.getLevelTwoObj().getPropertyObj().getName())); assertThat(obj3.getLevelTwoObj().getLevelOneObj().getProperty(), Is.is(convertedFromJcr.getLevelTwoObj().getLevelOneObj().getProperty())); assertThat(convertedFromJcr.getBooleanList(), Is.is(Arrays.asList(true, false, true, true))); assertThat(convertedFromJcr.getNumberMap().get(1.0), Is.is(3)); assertThat(convertedFromJcr.getNumberMap().get(2.0), Is.is(2)); assertThat(convertedFromJcr.getNumberMap().get(3.0), Is.is(1)); assertThat(convertedFromJcr.getObjList().size(), Is.is(3)); assertThat(convertedFromJcr.getObjList().get(0).getName(), Is.is("1")); assertThat(convertedFromJcr.getObjList().get(1).getName(), Is.is("2")); assertThat(convertedFromJcr.getObjList().get(2).getName(), Is.is("3")); } @Test public void shouldFindCollectionItems() throws Exception { final RootObj root = new RootObj(); final LevelOneObj levelOne = new LevelOneObj(); levelOne.setRootObj(root); final LevelTwoObj levelTwo = new LevelTwoObj(); levelTwo.setLevelOneObj(levelOne); final LevelThreeObj levelThree = new LevelThreeObj(); levelThree.setLevelTwoObj(levelTwo); levelThree.setObjList(new ArrayList<ListItemObj>()); final ListItemObj obj1 = new ListItemObj(); obj1.setName("obj 1"); obj1.setValue(5); levelThree.getObjList().add(obj1); final StorageNode asJcr = simplePersist.convertBeanToNode(levelThree); final LevelThreeObj anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree.getObjList().size(), Is.is(1)); assertThat(anotherLevelThree.getObjList().get(0).getValue(), Is.is(obj1.getValue())); assertThat(anotherLevelThree.getObjList().get(0).getName(), Is.is(obj1.getName())); final Iterable<ListItemObj> result = simplePersist.findByProperties(ListItemObj.class, new String[] {"name"}, new Object[] {"obj 1"}); final ListItemObj item = result.iterator().next(); assertThat(item.getName(), Is.is("obj 1")); assertThat(item.getValue(), Is.is(5)); } @Test public void shouldFindCollectionItemsWithParent() throws Exception { final StorageNode parentNode = session.withPartition(RegularPartitions.FEDERATION).createNewSimpleNode("a", "b", "c"); final RootObj root = new RootObj(); final LevelOneObj levelOne = new LevelOneObj(); levelOne.setRootObj(root); final LevelTwoObj levelTwo = new LevelTwoObj(); levelTwo.setLevelOneObj(levelOne); final LevelThreeObj levelThree = new LevelThreeObj(); levelThree.setLevelTwoObj(levelTwo); levelThree.setObjList(new ArrayList<ListItemObj>()); final ListItemObj obj1 = new ListItemObj(); obj1.setName("obj 1"); obj1.setValue(5); levelThree.getObjList().add(obj1); final StorageNode asJcr = simplePersist.convertBeanToNode(parentNode, levelThree); final LevelThreeObj anotherLevelThree = simplePersist.convertNodeToBean(asJcr); assertThat(anotherLevelThree.getObjList().size(), Is.is(1)); assertThat(anotherLevelThree.getObjList().get(0).getValue(), Is.is(obj1.getValue())); assertThat(anotherLevelThree.getObjList().get(0).getName(), Is.is(obj1.getName())); final Iterable<ListItemObj> result = simplePersist.findByProperties(parentNode, ListItemObj.class, new String[] {"name"}, new Object[] {"obj 1"}); final ListItemObj item = result.iterator().next(); assertThat(item.getName(), Is.is("obj 1")); assertThat(item.getValue(), Is.is(5)); } @Test public void shouldFindJcrNodeByItsKey() throws Exception { final RootObj root = new RootObj(); final LevelOneObj obj1 = new LevelOneObj(); final LevelTwoObj obj2 = new LevelTwoObj(); final LevelThreeObj obj3 = new LevelThreeObj(); final ListItemObj li1 = new ListItemObj(); li1.setName("1"); final ListItemObj li2 = new ListItemObj(); li2.setName("2"); final ListItemObj li3 = new ListItemObj(); li3.setName("3"); obj3.getObjList().add(li1); obj3.getObjList().add(li2); obj3.getObjList().add(li3); final MapValueObj mapVal1 = new MapValueObj(); mapVal1.setName("1"); final MapValueObj mapVal2 = new MapValueObj(); mapVal2.setName("2"); final MapValueObj mapVal3 = new MapValueObj(); mapVal3.setName("3"); obj1.setRootObj(root); obj2.setLevelOneObj(obj1); obj3.setLevelTwoObj(obj2); obj3.setBooleanList(new ArrayList<Boolean>()); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.FALSE); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.TRUE); obj3.setNumberMap(new HashMap<Double, Integer>()); obj3.getNumberMap().put(1.0, 3); obj3.getNumberMap().put(2.0, 2); obj3.getNumberMap().put(3.0, 1); obj2.setProperty("propVal"); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("name"); propertyObj.setValue(2); obj2.setPropertyObj(propertyObj); obj2.setKey("1"); final LevelTwoObj obj2_1 = new LevelTwoObj(); obj2_1.setKey("2"); final LevelTwoObj obj2_2 = new LevelTwoObj(); obj2_2.setKey("3"); simplePersist.convertBeanToNode(obj2); simplePersist.convertBeanToNode( obj2_1); simplePersist.convertBeanToNode(obj2_2); final Iterable<LevelTwoObj> result1 = simplePersist.findByProperties(LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("1")); final Iterable<LevelTwoObj> result2 = simplePersist.findByProperties(LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("2")); final Iterable<LevelTwoObj> result3 = simplePersist.findByProperties(LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("3")); final LevelTwoObj result1Item = result1.iterator().next(); assertThat(result1Item.getKey(), Is.is("1")); assertThat(result2.iterator().next().getKey(), Is.is("2")); assertThat(result3.iterator().next().getKey(), Is.is("3")); assertThat(result1.iterator().next().getLevelOneObj().getRootObj(), IsNull.notNullValue()); assertThat(result2.iterator().next().getLevelOneObj(), Is.is(IsNull.nullValue())); assertThat(result3.iterator().next().getLevelOneObj(), Is.is(IsNull.nullValue())); } @Test public void shouldFindJcrNodeByItsKeyWithParent() throws Exception { final StorageNode parentNode = session.withPartition(RegularPartitions.FEDERATION).createNewSimpleNode("a", "b", "c"); final RootObj root = new RootObj(); final LevelOneObj obj1 = new LevelOneObj(); final LevelTwoObj obj2 = new LevelTwoObj(); final LevelThreeObj obj3 = new LevelThreeObj(); final ListItemObj li1 = new ListItemObj(); li1.setName("1"); final ListItemObj li2 = new ListItemObj(); li2.setName("2"); final ListItemObj li3 = new ListItemObj(); li3.setName("3"); obj3.getObjList().add(li1); obj3.getObjList().add(li2); obj3.getObjList().add(li3); final MapValueObj mapVal1 = new MapValueObj(); mapVal1.setName("1"); final MapValueObj mapVal2 = new MapValueObj(); mapVal2.setName("2"); final MapValueObj mapVal3 = new MapValueObj(); mapVal3.setName("3"); obj1.setRootObj(root); obj2.setLevelOneObj(obj1); obj3.setLevelTwoObj(obj2); obj3.setBooleanList(new ArrayList<Boolean>()); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.FALSE); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.TRUE); obj3.setNumberMap(new HashMap<Double, Integer>()); obj3.getNumberMap().put(1.0, 3); obj3.getNumberMap().put(2.0, 2); obj3.getNumberMap().put(3.0, 1); obj2.setProperty("propVal"); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("name"); propertyObj.setValue(2); obj2.setPropertyObj(propertyObj); obj2.setKey("1"); final LevelTwoObj obj2_1 = new LevelTwoObj(); obj2_1.setKey("2"); final LevelTwoObj obj2_2 = new LevelTwoObj(); obj2_2.setKey("3"); simplePersist.convertBeanToNode(parentNode, obj2); simplePersist.convertBeanToNode(parentNode, obj2_1); simplePersist.convertBeanToNode(parentNode, obj2_2); final Iterable<LevelTwoObj> result1 = simplePersist.findByProperties(parentNode, LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("1")); final Iterable<LevelTwoObj> result2 = simplePersist.findByProperties(parentNode, LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("2")); final Iterable<LevelTwoObj> result3 = simplePersist.findByProperties(parentNode, LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("3")); final LevelTwoObj result1Item = result1.iterator().next(); assertThat(result1Item.getKey(), Is.is("1")); assertThat(result2.iterator().next().getKey(), Is.is("2")); assertThat(result3.iterator().next().getKey(), Is.is("3")); assertThat(result1.iterator().next().getLevelOneObj().getRootObj(), IsNull.notNullValue()); assertThat(result2.iterator().next().getLevelOneObj(), Is.is(IsNull.nullValue())); assertThat(result3.iterator().next().getLevelOneObj(), Is.is(IsNull.nullValue())); } @Test public void shouldFindJcrNodeByItsProperties() throws Exception { final RootObj root = new RootObj(); final LevelOneObj obj1 = new LevelOneObj(); final LevelTwoObj obj2 = new LevelTwoObj(); final LevelThreeObj obj3 = new LevelThreeObj(); final ListItemObj li1 = new ListItemObj(); li1.setName("1"); final ListItemObj li2 = new ListItemObj(); li2.setName("2"); final ListItemObj li3 = new ListItemObj(); li3.setName("3"); obj3.getObjList().add(li1); obj3.getObjList().add(li2); obj3.getObjList().add(li3); final MapValueObj mapVal1 = new MapValueObj(); mapVal1.setName("1"); final MapValueObj mapVal2 = new MapValueObj(); mapVal2.setName("2"); final MapValueObj mapVal3 = new MapValueObj(); mapVal3.setName("3"); obj1.setRootObj(root); obj2.setLevelOneObj(obj1); obj3.setLevelTwoObj(obj2); obj3.setBooleanList(new ArrayList<Boolean>()); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.FALSE); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.TRUE); obj3.setNumberMap(new HashMap<Double, Integer>()); obj3.getNumberMap().put(1.0, 3); obj3.getNumberMap().put(2.0, 2); obj3.getNumberMap().put(3.0, 1); obj2.setProperty("propVal"); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("name"); propertyObj.setValue(2); obj2.setPropertyObj(propertyObj); obj2.setKey("1"); final LevelTwoObj obj2_1 = new LevelTwoObj(); obj2_1.setKey("2"); final LevelTwoObj obj2_2 = new LevelTwoObj(); obj2_2.setKey("3"); simplePersist.convertBeanToNode( obj2); simplePersist.convertBeanToNode( obj2_1); simplePersist.convertBeanToNode( obj2_2); final Iterable<LevelTwoObj> result1 = simplePersist.findByProperties(LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("1")); final Iterable<LevelTwoObj> result2 = simplePersist.findByProperties(LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("2")); final Iterable<LevelTwoObj> result3 = simplePersist.findByProperties(LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("3")); final LevelTwoObj item = result1.iterator().next(); assertThat(item.getKey(), Is.is("1")); assertThat(result2.iterator().next().getKey(), Is.is("2")); assertThat(result3.iterator().next().getKey(), Is.is("3")); assertThat(result1.iterator().next().getLevelOneObj().getRootObj(), IsNull.notNullValue()); assertThat(result2.iterator().next().getLevelOneObj(), Is.is(IsNull.nullValue())); assertThat(result3.iterator().next().getLevelOneObj(), Is.is(IsNull.nullValue())); } @Test public void shouldFindJcrNodeByItsPropertiesWithParent() throws Exception { final StorageNode parentNode = session.withPartition(RegularPartitions.FEDERATION).createNewSimpleNode("a", "b", "c"); final RootObj root = new RootObj(); final LevelOneObj obj1 = new LevelOneObj(); final LevelTwoObj obj2 = new LevelTwoObj(); final LevelThreeObj obj3 = new LevelThreeObj(); final ListItemObj li1 = new ListItemObj(); li1.setName("1"); final ListItemObj li2 = new ListItemObj(); li2.setName("2"); final ListItemObj li3 = new ListItemObj(); li3.setName("3"); obj3.getObjList().add(li1); obj3.getObjList().add(li2); obj3.getObjList().add(li3); final MapValueObj mapVal1 = new MapValueObj(); mapVal1.setName("1"); final MapValueObj mapVal2 = new MapValueObj(); mapVal2.setName("2"); final MapValueObj mapVal3 = new MapValueObj(); mapVal3.setName("3"); obj1.setRootObj(root); obj2.setLevelOneObj(obj1); obj3.setLevelTwoObj(obj2); obj3.setBooleanList(new ArrayList<Boolean>()); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.FALSE); obj3.getBooleanList().add(Boolean.TRUE); obj3.getBooleanList().add(Boolean.TRUE); obj3.setNumberMap(new HashMap<Double, Integer>()); obj3.getNumberMap().put(1.0, 3); obj3.getNumberMap().put(2.0, 2); obj3.getNumberMap().put(3.0, 1); obj2.setProperty("propVal"); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("name"); propertyObj.setValue(2); obj2.setPropertyObj(propertyObj); obj2.setKey("1"); final LevelTwoObj obj2_1 = new LevelTwoObj(); obj2_1.setKey("2"); final LevelTwoObj obj2_2 = new LevelTwoObj(); obj2_2.setKey("3"); simplePersist.convertBeanToNode(parentNode, obj2); simplePersist.convertBeanToNode(parentNode, obj2_1); simplePersist.convertBeanToNode(parentNode, obj2_2); final Iterable<LevelTwoObj> result1 = simplePersist.findByProperties(parentNode, LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("1")); final Iterable<LevelTwoObj> result2 = simplePersist.findByProperties(parentNode, LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("2")); final Iterable<LevelTwoObj> result3 = simplePersist.findByProperties(parentNode, LevelTwoObj.class, org.openspotlight.common.util.Arrays.of("key"), org.openspotlight.common.util.Arrays.of("3")); final LevelTwoObj item = result1.iterator().next(); assertThat(item.getKey(), Is.is("1")); assertThat(result2.iterator().next().getKey(), Is.is("2")); assertThat(result3.iterator().next().getKey(), Is.is("3")); assertThat(result1.iterator().next().getLevelOneObj().getRootObj(), IsNull.notNullValue()); assertThat(result2.iterator().next().getLevelOneObj(), Is.is(IsNull.nullValue())); assertThat(result3.iterator().next().getLevelOneObj(), Is.is(IsNull.nullValue())); } @Test public void shouldFindNodesWithSameKeyPropertyWhenUsingComposedKey() throws Exception { final ComposedKeyObject object1 = new ComposedKeyObject(); object1.setKey1("same key"); object1.setKey2(1); final ComposedKeyObject object2 = new ComposedKeyObject(); object2.setKey1("same key"); object2.setKey2(2); final ComposedKeyObject object3 = new ComposedKeyObject(); object3.setKey1("another key"); object3.setKey2(1); simplePersist.convertBeanToNode(object1); simplePersist.convertBeanToNode(object2); simplePersist.convertBeanToNode(object3); final Iterable<ComposedKeyObject> foundNodes = simplePersist.findByProperties(ComposedKeyObject.class, new String[] {"key1"}, new Object[] {"same key"}); final Iterator<ComposedKeyObject> it = foundNodes.iterator(); assertThat(it.next(), is(notNullValue())); assertThat(it.next(), is(notNullValue())); assertThat(it.hasNext(), is(false)); } @Test public void shouldFindNodesWithSameKeyPropertyWhenUsingComposedKeyWithParent() throws Exception { final StorageNode parentNode = session.withPartition(RegularPartitions.FEDERATION).createNewSimpleNode("a", "b", "c"); final ComposedKeyObject object1 = new ComposedKeyObject(); object1.setKey1("same key"); object1.setKey2(1); final ComposedKeyObject object2 = new ComposedKeyObject(); object2.setKey1("same key"); object2.setKey2(2); final ComposedKeyObject object3 = new ComposedKeyObject(); object3.setKey1("another key"); object3.setKey2(1); simplePersist.convertBeanToNode(parentNode, object1); simplePersist.convertBeanToNode(parentNode, object2); simplePersist.convertBeanToNode(object3); final Iterable<ComposedKeyObject> foundNodes = simplePersist.findByProperties(parentNode, ComposedKeyObject.class, new String[] {"key1"}, new Object[] {"same key"}); final Iterator<ComposedKeyObject> it = foundNodes.iterator(); assertThat(it.next(), is(notNullValue())); assertThat(it.next(), is(notNullValue())); assertThat(it.hasNext(), is(false)); } @Test public void shouldFindObjectsByNullParameter() throws Exception { final LevelOneObj obj1 = new LevelOneObj(); obj1.setProperty("prop"); final LevelOneObj obj2 = new LevelOneObj(); obj2.setProperty(null); simplePersist.convertBeanToNode(obj1); simplePersist.convertBeanToNode(obj2); final Iterable<LevelOneObj> result = simplePersist.findByProperties(LevelOneObj.class, new String[] {"property"}, new Object[] {null}); final Iterator<LevelOneObj> it = result.iterator(); assertThat(it.next(), is(notNullValue())); assertThat(it.hasNext(), is(false)); } @Test public void shouldFindObjectsByNullParameterWithParent() throws Exception { final StorageNode parentNode = session.withPartition(RegularPartitions.FEDERATION).createNewSimpleNode("a", "b", "c"); final LevelOneObj obj1 = new LevelOneObj(); obj1.setProperty("prop"); final LevelOneObj obj2 = new LevelOneObj(); obj2.setProperty(null); simplePersist.convertBeanToNode(parentNode, obj1); simplePersist.convertBeanToNode(parentNode, obj2); final Iterable<LevelOneObj> result = simplePersist.findByProperties(parentNode, LevelOneObj.class, new String[] {"property"}, new Object[] {null}); final Iterator<LevelOneObj> it = result.iterator(); assertThat(it.next(), is(notNullValue())); assertThat(it.hasNext(), is(false)); } @Test public void shouldFindPropertyItems() throws Exception { final LevelTwoObj levelTwo = new LevelTwoObj(); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("obj 1"); propertyObj.setValue(5); levelTwo.setPropertyObj(propertyObj); simplePersist.convertBeanToNode(levelTwo); final Iterable<PropertyObj> result = simplePersist.findByProperties(PropertyObj.class, new String[] {"name"}, new Object[] {"obj 1"}); final Iterator<PropertyObj> it = result.iterator(); final PropertyObj item = it.next(); assertThat(item.getName(), Is.is("obj 1")); assertThat(item.getValue(), Is.is(5)); assertThat(it.hasNext(), Is.is(false)); } @Test public void shouldFindPropertyItemsWithParent() throws Exception { final StorageNode parentNode = session.withPartition(RegularPartitions.FEDERATION).createNewSimpleNode("a", "b", "c"); final LevelTwoObj levelTwo = new LevelTwoObj(); final PropertyObj propertyObj = new PropertyObj(); propertyObj.setName("obj 1"); propertyObj.setValue(5); levelTwo.setPropertyObj(propertyObj); final StorageNode newnode = simplePersist.convertBeanToNode(parentNode, levelTwo); System.err.println(">>> " + newnode.getKey().getKeyAsString()); System.err.println(">>> " + newnode.getParent(session)); System.err.println(">>> " + newnode.getParent(session).getParent(session)); final Iterable<PropertyObj> result = simplePersist.findByProperties(parentNode, PropertyObj.class, new String[] {"name"}, new Object[] {"obj 1"}); final Iterator<PropertyObj> it = result.iterator(); final PropertyObj item = it.next(); assertThat(item.getName(), Is.is("obj 1")); assertThat(item.getValue(), Is.is(5)); assertThat(it.hasNext(), Is.is(false)); } @Test @Ignore //this test becames invalid since it can't iterate all items to reorder public void shouldMaintainOrder() throws Exception { final int count = 20; final ArrayList<SimpleObject> objs = new ArrayList<SimpleObject>(); for (int i = 0; i < count; i++) { final SimpleObject root = new SimpleObject(); root.setId(i); objs.add(root); } simplePersist.convertBeansToNodes(objs); final Iterable<SimpleObject> nodes = simplePersist.findByProperties(SimpleObject.class, new String[] {}, new Object[] {}); int i = 0; for (final SimpleObject obj: nodes) { assertThat(obj.getId(), Is.is(i)); i++; } } @Test(expected = SLRuntimeException.class) public void shouldNotFindWithWrongPropertyName() throws Exception { simplePersist.findByProperties(RootObj.class, new String[] {"invalidProperty"}, new Object[] {null}); } @Test public void shouldPersistAndReadStreamProperty() throws Exception { final ObjectWithInputStream pojo = new ObjectWithInputStream(); final String contentAsString = "content"; final InputStream content = new ByteArrayInputStream(contentAsString.getBytes()); pojo.setStream(content); final StorageNode jcrStorageNode = simplePersist.convertBeanToNode(pojo); final ObjectWithInputStream convertedPojo = simplePersist.convertNodeToBean(jcrStorageNode); final byte[] contentAsBytes = new byte[convertedPojo.getStream().available()]; convertedPojo.getStream().read(contentAsBytes); final String newContentAsString = new String(contentAsBytes); assertThat(contentAsString, Is.is(newContentAsString)); } @Test public void shouldPersistPropertyAsStream() throws Exception { final RootObj obj = new RootObj(); final ObjectThatDoesntImplementSimpleNodeType objectThatDoesntImplementSimpleNodeType = new ObjectThatDoesntImplementSimpleNodeType(); objectThatDoesntImplementSimpleNodeType.setName("name"); objectThatDoesntImplementSimpleNodeType.setNumber(3); objectThatDoesntImplementSimpleNodeType.setParent(obj); obj.setObjectThatDoesntImplementSimpleNodeType(objectThatDoesntImplementSimpleNodeType); final StorageNode jcrStorageNode = simplePersist.convertBeanToNode(obj); final RootObj fromJcr = simplePersist.convertNodeToBean(jcrStorageNode); assertThat(fromJcr.getObjectThatDoesntImplementSimpleNodeType().getName(), Is.is(obj.getObjectThatDoesntImplementSimpleNodeType().getName())); assertThat(fromJcr.getObjectThatDoesntImplementSimpleNodeType().getNumber(), Is.is(obj.getObjectThatDoesntImplementSimpleNodeType().getNumber())); assertThat(fromJcr.getObjectThatDoesntImplementSimpleNodeType().getParent() == fromJcr, Is.is(true)); } @Test public void shouldPersistTwoDifferentNodesWhenUsingComposedKeys() throws Exception { final ComposedKeyObject object1 = new ComposedKeyObject(); object1.setKey1("same"); object1.setKey2(1); final ComposedKeyObject object2 = new ComposedKeyObject(); object2.setKey1("same"); object2.setKey2(2); final ComposedKeyObject object3 = new ComposedKeyObject(); object3.setKey1("same"); object3.setKey2(1); final StorageNode newNode1 = simplePersist.convertBeanToNode(object1); final StorageNode newNode2 = simplePersist.convertBeanToNode(object2); final StorageNode newNode3 = simplePersist.convertBeanToNode(object3); assertThat(newNode1.getKey(), Is.is(IsNot.not(newNode2.getKey()))); assertThat(newNode1.getKey(), Is.is(newNode3.getKey())); } }