/* * Copyright 2004-2009 the original author or authors. * * 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.compass.core.test.component.cyclic3; import org.compass.core.CompassSession; import org.compass.core.CompassTransaction; import org.compass.core.Resource; import org.compass.core.config.CompassEnvironment; import org.compass.core.config.CompassSettings; import org.compass.core.test.AbstractTestCase; /** * @author kimchy */ public class SimpleCyclicTests extends AbstractTestCase { protected String[] getMappings() { return new String[]{"component/cyclic3/Cyclic.cpm.xml"}; } protected void addSettings(CompassSettings settings) { settings.setBooleanSetting(CompassEnvironment.Osem.FILTER_DUPLICATES, true); } public void testCyclicWithParent() throws Exception { CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); Cyclic1 cyclic1 = new Cyclic1(); cyclic1.id = new Long(1); cyclic1.value = "cyclic1"; Cyclic2 cyclic2 = new Cyclic2(); cyclic2.value = "cyclic2"; cyclic1.cyclic2 = cyclic2; cyclic2.cyclic1 = cyclic1; session.save("cyclic1", cyclic1); cyclic1 = (Cyclic1) session.load("cyclic1", new Long(1)); assertNotNull(cyclic1.cyclic2); assertEquals("cyclic2", cyclic1.cyclic2.value); cyclic2 = cyclic1.cyclic2; assertNotNull(cyclic2); assertEquals("cyclic1", cyclic2.cyclic1.value); tr.commit(); session.close(); } public void testCyclicNullWithParent() throws Exception { CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); Long id = new Long(1); Cyclic1 cyclic1 = new Cyclic1(); cyclic1.id = id; cyclic1.value = "cyclic1"; session.save("cyclic1", cyclic1); cyclic1 = (Cyclic1) session.load("cyclic1", id); assertNull(cyclic1.cyclic2); tr.commit(); session.close(); } public void testCyclicWithComponent() throws Exception { CompassSession session = openSession(); CompassTransaction tr = session.beginTransaction(); Long id = new Long(1); Cyclic1 cyclic1 = new Cyclic1(); cyclic1.id = id; cyclic1.value = "cyclic1"; Cyclic2 cyclic2 = new Cyclic2(); cyclic2.id = id; cyclic2.value = "cyclic2"; cyclic1.cyclic2 = cyclic2; cyclic2.cyclic1 = cyclic1; session.save("cyclic1c", cyclic1); session.save("cyclic2c", cyclic2); cyclic1 = (Cyclic1) session.load("cyclic1c", id); assertNotNull(cyclic1.cyclic2); assertEquals("cyclic2", cyclic1.cyclic2.value); cyclic2 = cyclic1.cyclic2; assertNotNull(cyclic2); assertEquals("cyclic1", cyclic2.cyclic1.value); // check that compass creates the same object (when ids are invoved // when in cyclic reference assertEquals(System.identityHashCode(cyclic1), System.identityHashCode(cyclic1.cyclic2.cyclic1)); cyclic2 = (Cyclic2) session.load("cyclic2c", id); assertNotNull(cyclic2.cyclic1); assertEquals("cyclic1", cyclic2.cyclic1.value); cyclic1 = cyclic2.cyclic1; assertNotNull(cyclic1); assertEquals("cyclic2", cyclic1.cyclic2.value); // check that we don't go into cyclic hell Resource resource = session.loadResource("cyclic1c", id); assertEquals(2, resource.getProperties("value").length); assertNotNull(resource.getProperty("$/cyclic1c/id")); assertNotNull(resource.getProperty("$/cyclic1c/value")); assertNotNull(resource.getProperty("$/cyclic1c/cyclic2/id")); assertNotNull(resource.getProperty("$/cyclic1c/cyclic2/value")); assertNotNull(resource.getProperty("$/cyclic1c/cyclic2/cyclic1/id")); assertNull(resource.getProperty("$/cyclic1c/cyclic2/cyclic1/value")); assertNull(resource.getProperty("$/cyclic1c/cyclic2/cyclic1/cyclic2/id")); assertNull(resource.getProperty("$/cyclic1c/cyclic2/cyclic1/cyclic2/cyclic1/id")); tr.commit(); session.close(); } }