/*
* 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.xml;
import java.io.InputStreamReader;
import java.io.Reader;
import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.Resource;
import org.compass.core.config.CompassConfiguration;
import org.compass.core.config.CompassEnvironment;
import org.compass.core.converter.mapping.xsem.XmlContentMappingConverter;
import org.compass.core.converter.xsem.XmlContentConverter;
import org.compass.core.converter.xsem.XmlContentConverterWrapper;
import org.compass.core.mapping.xsem.XmlContentMapping;
import static org.compass.core.mapping.xsem.builder.XSEM.*;
import org.compass.core.test.AbstractTestCase;
import org.compass.core.xml.AliasedXmlObject;
import org.compass.core.xml.XmlObject;
/**
* @author kimchy
*/
public abstract class AbstractXmlObjectTests extends AbstractTestCase {
protected String[] getMappings() {
return new String[]{"xml/xml.cpm.xml"};
}
@Override
protected void addExtraConf(CompassConfiguration conf) {
conf.getSettings().setGroupSettings(CompassEnvironment.Xsem.Namespace.PREFIX, "test1",
new String[]{CompassEnvironment.Xsem.Namespace.URI}, new String[]{"http://test1"});
conf.getSettings().setGroupSettings(CompassEnvironment.Xsem.Namespace.PREFIX, "test2",
new String[]{CompassEnvironment.Xsem.Namespace.URI}, new String[]{"http://test2"});
}
protected void addProgrammaticConfiguration(CompassConfiguration conf) {
conf.addMapping(
xml("data1")
.add(id("/xml-fragment/data/id/@value").indexName("id"))
.add(property("/xml-fragment/data/data1/@value"))
.add(property("/xml-fragment/data/data1").indexName("eleText"))
);
conf.addMapping(
xml("data2").xpath("/xml-fragment/data[1]")
.add(id("id/@value").indexName("id"))
.add(property("data1/@value"))
.add(property("data1").indexName("eleText"))
);
conf.addMapping(
xml("data3").xpath("/xml-fragment/data")
.add(id("id/@value").indexName("id"))
.add(property("data1/@value"))
.add(property("data1").indexName("eleText"))
);
conf.addMapping(
xml("data4").xpath("/xml-fragment/data")
.add(id("id/@value").indexName("id"))
.add(property("data1/@value"))
.add(property("data1").indexName("eleText"))
.add(content("content"))
);
conf.addMapping(
xml("data5-1").xpath("/xml-fragment/test1:data")
.add(id("test1:id/@value").indexName("id"))
.add(property("test1:data1/@value"))
.add(property("test1:data1").indexName("eleText"))
.add(content("content"))
);
conf.addMapping(
xml("data5-2").xpath("/xml-fragment/data")
.add(id("id/@value").indexName("id"))
.add(property("data1/@value"))
.add(property("data1").indexName("eleText"))
.add(content("content"))
);
conf.addMapping(
xml("data6").xpath("/xml-fragment/data")
.add(id("id/@value").indexName("id"))
.add(property("data1/@value").format("000000.0000").valueConverter("float"))
.add(property("data1").indexName("eleText").format("yyyy-MM-dd||dd-MM-yyyy").valueConverter("date"))
.add(content("content"))
);
conf.addMapping(
contract("contract1")
.add(id("/xml-fragment/data/id/@value").indexName("id"))
.add(property("/xml-fragment/data/data1/@value"))
);
conf.addMapping(
contract("contract2")
.add(property("/xml-fragment/data/data1").indexName("eleText"))
);
conf.addMapping(
xml("data7").extendsAliases("contract1", "contract2")
);
}
protected abstract AliasedXmlObject buildAliasedXmlObject(String alias, Reader data) throws Exception;
private Reader readData(String path) {
path = "org/compass/core/test/xml/" + path + ".xml";
return new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream(path));
}
public void testConverterType() {
XmlContentMappingConverter converter = (XmlContentMappingConverter) getCompass().getConverterLookup().lookupConverter(XmlContentMapping.class);
XmlContentConverter xmlContentConverter = converter.getXmlContentConverter();
if (xmlContentConverter instanceof XmlContentConverterWrapper) {
xmlContentConverter = ((XmlContentConverterWrapper) xmlContentConverter).createContentConverter();
}
assertTrue(getContentConverterType().isAssignableFrom(xmlContentConverter.getClass()));
}
protected abstract Class<? extends XmlContentConverter> getContentConverterType();
public void testData1() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
AliasedXmlObject xmlObject = buildAliasedXmlObject("data1", readData("data1"));
session.save(xmlObject);
assertNull(session.get("data1", "1"));
Resource resource = session.loadResource("data1", "1");
assertEquals("1", resource.getValue("$/data1/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
resource = session.loadResource("data1", xmlObject);
assertEquals("1", resource.getValue("$/data1/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
CompassHits hits = session.find("data11");
assertEquals(1, hits.length());
hits = session.find("data11attr");
assertEquals(1, hits.length());
tr.commit();
session.close();
}
public void testData2() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
AliasedXmlObject xmlObject = buildAliasedXmlObject("data2", readData("data2"));
session.save(xmlObject);
Resource resource = session.loadResource("data2", "1");
assertEquals("1", resource.getValue("$/data2/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
resource = session.getResource("data2", "2");
assertNull(resource);
CompassHits hits = session.find("data11");
assertEquals(1, hits.length());
hits = session.find("data11attr");
assertEquals(1, hits.length());
tr.commit();
session.close();
}
public void testData3() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
AliasedXmlObject xmlObject = buildAliasedXmlObject("data3", readData("data3"));
session.save(xmlObject);
Resource resource = session.loadResource("data3", "1");
assertEquals("1", resource.getValue("$/data3/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
resource = session.getResource("data3", "2");
assertEquals("2", resource.getValue("$/data3/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
CompassHits hits = session.find("data11");
assertEquals(1, hits.length());
hits = session.find("data11attr");
assertEquals(1, hits.length());
hits = session.find("data21attr");
assertEquals(1, hits.length());
session.delete(xmlObject);
hits = session.find("data11attr");
assertEquals(0, hits.length());
hits = session.find("data21attr");
assertEquals(0, hits.length());
tr.commit();
session.close();
}
public void innerTestData4XmlContent() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
AliasedXmlObject xmlObject = buildAliasedXmlObject("data4", readData("data4"));
session.save(xmlObject);
Resource resource = session.loadResource("data4", "1");
assertEquals("1", resource.getValue("$/data4/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
assertNotNull(resource.getValue("content"));
resource = session.getResource("data4", "2");
assertEquals("2", resource.getValue("$/data4/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
assertNotNull(resource.getValue("content"));
xmlObject = (AliasedXmlObject) session.get("data4", "1");
assertNotNull(xmlObject);
verifyXmlObjectType(xmlObject);
XmlObject[] ids = xmlObject.selectPath("/data/id/@value");
assertEquals(1, ids.length);
assertEquals("1", ids[0].getValue());
xmlObject = (AliasedXmlObject) session.get("data4", "2");
assertNotNull(xmlObject);
ids = xmlObject.selectPath("/data/id/@value");
assertEquals(1, ids.length);
assertEquals("2", ids[0].getValue());
tr.commit();
session.close();
}
protected void innerTestData5WithNamespacePrefixXpath() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
AliasedXmlObject xmlObject = buildAliasedXmlObject("data5-1", readData("data5"));
session.save(xmlObject);
assertNotNull(session.get("data5-1", "1"));
assertNull(session.get("data5-2", "2"));
Resource resource = session.loadResource("data5-1", "1");
assertEquals("1", resource.getValue("$/data5-1/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
resource = session.loadResource("data5-1", xmlObject);
assertEquals("1", resource.getValue("$/data5-1/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
CompassHits hits = session.find("data11");
assertEquals(1, hits.length());
hits = session.find("data11attr");
assertEquals(1, hits.length());
tr.commit();
session.close();
}
protected void innerTestData5WithoutNamespacePrefixXpath() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
AliasedXmlObject xmlObject = buildAliasedXmlObject("data5-2", readData("data5"));
session.save(xmlObject);
assertNotNull(session.get("data5-2", "1"));
Resource resource = session.loadResource("data5-2", "1");
assertEquals("1", resource.getValue("$/data5-2/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
CompassHits hits = session.find("data11");
assertEquals(1, hits.length());
hits = session.find("data11attr");
assertEquals(1, hits.length());
tr.commit();
session.close();
}
public void testData6WhichTestsFormatters() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
AliasedXmlObject xmlObject = buildAliasedXmlObject("data6", readData("data6"));
session.save(xmlObject);
assertNotNull(session.get("data6", "1"));
Resource resource = session.loadResource("data6", "1");
assertEquals("1", resource.getValue("$/data6/id"));
assertEquals("2001-12-03", resource.getValue("eleText"));
assertEquals("000021.2000", resource.getValue("value"));
tr.commit();
session.close();
}
public void testContractData7() throws Exception {
CompassSession session = openSession();
CompassTransaction tr = session.beginTransaction();
AliasedXmlObject xmlObject = buildAliasedXmlObject("data7", readData("data7"));
session.save(xmlObject);
assertNull(session.get("data7", "1"));
Resource resource = session.loadResource("data7", "1");
assertEquals("1", resource.getValue("$/data7/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
resource = session.loadResource("data7", xmlObject);
assertEquals("1", resource.getValue("$/data7/id"));
assertEquals(2, resource.getProperties("eleText").length);
assertEquals(2, resource.getProperties("value").length);
CompassHits hits = session.find("data11");
assertEquals(1, hits.length());
hits = session.find("data11attr");
assertEquals(1, hits.length());
tr.commit();
session.close();
}
protected abstract void verifyXmlObjectType(XmlObject xmlObject);
}