/** * Copyright (C) 2010 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xcmis.restatom.abdera; import junit.framework.TestCase; import org.w3c.dom.Node; import org.xcmis.restatom.AbderaFactory; import org.xcmis.restatom.AtomCMIS; import org.xcmis.restatom.NamespaceResolver; import org.xcmis.spi.model.Choice; import org.xcmis.spi.model.Precision; import org.xcmis.spi.model.PropertyDefinition; import org.xcmis.spi.model.PropertyType; import org.xcmis.spi.model.Updatability; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.StringWriter; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Calendar; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; /** * @author <a href="mailto:andrey.parfonov@exoplatform.com">Andrey Parfonov</a> * @version $Id: PropertyDefinitionElementTest.java 2 2010-02-04 17:21:49Z * andrew00x $ */ public class PropertyDefinitionElementTest extends TestCase { public void testWriteBoolean() throws Exception { PropertyDefinition<Boolean> def = new PropertyDefinition<Boolean>(); addCommonAttributes(def); def.setPropertyType(PropertyType.BOOLEAN); Choice<Boolean> bc1 = new Choice<Boolean>(); bc1.setDisplayName("key1"); bc1.setValues(new Boolean[]{true}); Choice<Boolean> bc2 = new Choice<Boolean>(); bc2.setDisplayName("key2"); bc2.setValues(new Boolean[]{true}); def.getChoices().add(bc1); def.getChoices().add(bc2); def.setDefaultValue(new Boolean[]{true}); PropertyDefinitionTypeElement el = new PropertyDefinitionTypeElement(AbderaFactory.getInstance().getFactory(), AtomCMIS.PROPERTY_BOOLEAN_DEFINITION); el.build(def); // System.out.println("PropertyBooleanDefinition: " + el); ByteArrayOutputStream out = new ByteArrayOutputStream(); el.writeTo(out); DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(true); org.w3c.dom.Document xmlDoc = f.newDocumentBuilder().parse(new ByteArrayInputStream(out.toByteArray())); assertNotNull(xmlDoc); XPath xp = XPathFactory.newInstance().newXPath(); xp.setNamespaceContext(new NamespaceResolver()); String baseElement = "cmis:propertyBooleanDefinition"; checkCommonAttributes(xp, xmlDoc, baseElement); String r = (String)xp.evaluate(baseElement + "/cmis:propertyType", xmlDoc, XPathConstants.STRING); assertEquals("boolean", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:choice)", xmlDoc, XPathConstants.STRING); assertEquals("2", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue/cmis:value)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate(baseElement + "/cmis:defaultValue/cmis:value", xmlDoc, XPathConstants.STRING); assertEquals("true", r); } public void testWriteDateTime() throws Exception { PropertyDefinition<Calendar> def = new PropertyDefinition<Calendar>(); addCommonAttributes(def); def.setPropertyType(PropertyType.DATETIME); Choice<Calendar> dtc1 = new Choice<Calendar>(); dtc1.setDisplayName("key1"); dtc1.setValues(new Calendar[]{Calendar.getInstance()}); Choice<Calendar> dtc2 = new Choice<Calendar>(); dtc2.setDisplayName("key2"); dtc2.setValues(new Calendar[]{Calendar.getInstance()}); def.getChoices().add(dtc1); def.getChoices().add(dtc2); def.setDefaultValue(new Calendar[]{Calendar.getInstance()}); PropertyDefinitionTypeElement el = new PropertyDefinitionTypeElement(AbderaFactory.getInstance().getFactory(), AtomCMIS.PROPERTY_DATE_TIME_DEFINITION); el.build(def); // System.out.println("PropertyDateTimeDefinition: " + el); ByteArrayOutputStream out = new ByteArrayOutputStream(); el.writeTo(out); DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(true); org.w3c.dom.Document xmlDoc = f.newDocumentBuilder().parse(new ByteArrayInputStream(out.toByteArray())); assertNotNull(xmlDoc); XPath xp = XPathFactory.newInstance().newXPath(); xp.setNamespaceContext(new NamespaceResolver()); String baseElement = "cmis:propertyDateTimeDefinition"; checkCommonAttributes(xp, xmlDoc, baseElement); String r = (String)xp.evaluate("/" + baseElement + "/cmis:propertyType", xmlDoc, XPathConstants.STRING); assertEquals("datetime", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:choice)", xmlDoc, XPathConstants.STRING); assertEquals("2", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue/cmis:value)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); } public void testWriteDecimal() throws Exception { PropertyDefinition<BigDecimal> def = new PropertyDefinition<BigDecimal>(); addCommonAttributes(def); def.setPropertyType(PropertyType.DECIMAL); def.setDecimalPrecision(Precision.Bit32); Choice<BigDecimal> d1 = new Choice<BigDecimal>(); d1.setDisplayName("key1"); d1.setValues(new BigDecimal[]{BigDecimal.ZERO}); Choice<BigDecimal> d2 = new Choice<BigDecimal>(); d2.setDisplayName("key2"); d2.setValues(new BigDecimal[]{BigDecimal.ONE}); def.getChoices().add(d1); def.getChoices().add(d2); def.setDefaultValue(new BigDecimal[]{BigDecimal.valueOf(1)}); PropertyDefinitionTypeElement el = new PropertyDefinitionTypeElement(AbderaFactory.getInstance().getFactory(), AtomCMIS.PROPERTY_DECIMAL_DEFINITION); el.build(def); // System.out.println("PropertyDecimalDefinition: " + el); ByteArrayOutputStream out = new ByteArrayOutputStream(); el.writeTo(out); DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(true); org.w3c.dom.Document xmlDoc = f.newDocumentBuilder().parse(new ByteArrayInputStream(out.toByteArray())); assertNotNull(xmlDoc); XPath xp = XPathFactory.newInstance().newXPath(); xp.setNamespaceContext(new NamespaceResolver()); String baseElement = "cmis:propertyDecimalDefinition"; checkCommonAttributes(xp, xmlDoc, baseElement); String r = (String)xp.evaluate("/" + baseElement + "/cmis:propertyType", xmlDoc, XPathConstants.STRING); assertEquals("decimal", r); r = (String)xp.evaluate("/" + baseElement + "/cmis:precision", xmlDoc, XPathConstants.STRING); assertEquals("32", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:choice)", xmlDoc, XPathConstants.STRING); assertEquals("2", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue/cmis:value)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); } public void testWriteId() throws Exception { PropertyDefinition<String> def = new PropertyDefinition<String>(); addCommonAttributes(def); def.setPropertyType(PropertyType.ID); Choice<String> idc1 = new Choice<String>(); idc1.setDisplayName("key1"); idc1.setValues(new String[]{"id1"}); Choice<String> idc2 = new Choice<String>(); idc2.setDisplayName("key2"); idc2.setValues(new String[]{"id2"}); def.getChoices().add(idc1); def.getChoices().add(idc2); def.setDefaultValue(new String[]{"id:1"}); PropertyDefinitionTypeElement el = new PropertyDefinitionTypeElement(AbderaFactory.getInstance().getFactory(), AtomCMIS.PROPERTY_ID_DEFINITION); el.build(def); // System.out.println("PropertyIdDefinition: " + el); ByteArrayOutputStream out = new ByteArrayOutputStream(); el.writeTo(out); DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(true); org.w3c.dom.Document xmlDoc = f.newDocumentBuilder().parse(new ByteArrayInputStream(out.toByteArray())); assertNotNull(xmlDoc); XPath xp = XPathFactory.newInstance().newXPath(); xp.setNamespaceContext(new NamespaceResolver()); String baseElement = "cmis:propertyIdDefinition"; checkCommonAttributes(xp, xmlDoc, baseElement); String r = (String)xp.evaluate("/" + baseElement + "/cmis:propertyType", xmlDoc, XPathConstants.STRING); assertEquals("id", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:choice)", xmlDoc, XPathConstants.STRING); assertEquals("2", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue/cmis:value)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate(baseElement + "/cmis:defaultValue/cmis:value", xmlDoc, XPathConstants.STRING); assertEquals("id:1", r); } public void testWriteInteger() throws Exception { PropertyDefinition<BigInteger> def = new PropertyDefinition<BigInteger>(); addCommonAttributes(def); def.setPropertyType(PropertyType.INTEGER); def.setMinInteger(BigInteger.valueOf(Long.MIN_VALUE)); def.setMaxInteger(BigInteger.valueOf(Long.MAX_VALUE)); Choice<BigInteger> ic1 = new Choice<BigInteger>(); ic1.setDisplayName("key1"); ic1.setValues(new BigInteger[]{BigInteger.ONE}); Choice<BigInteger> ic2 = new Choice<BigInteger>(); ic2.setDisplayName("key2"); ic2.setValues(new BigInteger[]{BigInteger.ONE}); def.getChoices().add(ic1); def.getChoices().add(ic2); def.setDefaultValue(new BigInteger[]{BigInteger.ONE}); PropertyDefinitionTypeElement el = new PropertyDefinitionTypeElement(AbderaFactory.getInstance().getFactory(), AtomCMIS.PROPERTY_INTEGER_DEFINITION); el.build(def); // System.out.println("PropertyIntegerDefinition: " + el); ByteArrayOutputStream out = new ByteArrayOutputStream(); el.writeTo(out); DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(true); org.w3c.dom.Document xmlDoc = f.newDocumentBuilder().parse(new ByteArrayInputStream(out.toByteArray())); assertNotNull(xmlDoc); XPath xp = XPathFactory.newInstance().newXPath(); xp.setNamespaceContext(new NamespaceResolver()); String baseElement = "cmis:propertyIntegerDefinition"; checkCommonAttributes(xp, xmlDoc, baseElement); String r = (String)xp.evaluate("/" + baseElement + "/cmis:propertyType", xmlDoc, XPathConstants.STRING); assertEquals("integer", r); r = (String)xp.evaluate("/" + baseElement + "/cmis:minValue", xmlDoc, XPathConstants.STRING); assertEquals(Long.toString(Long.MIN_VALUE), r); r = (String)xp.evaluate("/" + baseElement + "/cmis:maxValue", xmlDoc, XPathConstants.STRING); assertEquals(Long.toString(Long.MAX_VALUE), r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:choice)", xmlDoc, XPathConstants.STRING); assertEquals("2", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue/cmis:value)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); } public void testWriteString() throws Exception { PropertyDefinition<String> def = new PropertyDefinition<String>(); addCommonAttributes(def); def.setPropertyType(PropertyType.STRING); def.setMaxLength(Integer.valueOf(65536)); Choice<String> sc1 = new Choice<String>(); sc1.setDisplayName("key1"); sc1.setValues(new String[]{"string1"}); Choice<String> sc2 = new Choice<String>(); sc2.setDisplayName("key2"); sc2.setValues(new String[]{"string2"}); def.getChoices().add(sc1); def.getChoices().add(sc2); def.setDefaultValue(new String[]{"hello"}); PropertyDefinitionTypeElement el = new PropertyDefinitionTypeElement(AbderaFactory.getInstance().getFactory(), AtomCMIS.PROPERTY_STRING_DEFINITION); el.build(def); // System.out.println("PropertyStringDefinition: " + el); ByteArrayOutputStream out = new ByteArrayOutputStream(); el.writeTo(out); DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(true); org.w3c.dom.Document xmlDoc = f.newDocumentBuilder().parse(new ByteArrayInputStream(out.toByteArray())); assertNotNull(xmlDoc); XPath xp = XPathFactory.newInstance().newXPath(); xp.setNamespaceContext(new NamespaceResolver()); String baseElement = "cmis:propertyStringDefinition"; checkCommonAttributes(xp, xmlDoc, baseElement); String r = (String)xp.evaluate("/" + baseElement + "/cmis:propertyType", xmlDoc, XPathConstants.STRING); assertEquals("string", r); r = (String)xp.evaluate("/" + baseElement + "/cmis:maxLength", xmlDoc, XPathConstants.STRING); assertEquals("65536", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:choice)", xmlDoc, XPathConstants.STRING); assertEquals("2", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue/cmis:value)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate(baseElement + "/cmis:defaultValue/cmis:value", xmlDoc, XPathConstants.STRING); assertEquals("hello", r); } public void testWriteUri() throws Exception { PropertyDefinition<String> def = new PropertyDefinition<String>(); addCommonAttributes(def); def.setPropertyType(PropertyType.URI); Choice<String> bc1 = new Choice<String>(); bc1.setDisplayName("key1"); bc1.setValues(new String[]{"http://host1/a/b/c/d"}); Choice<String> bc2 = new Choice<String>(); bc2.setDisplayName("key2"); bc2.setValues(new String[]{"http://host2/a/b/c/d"}); def.getChoices().add(bc1); def.getChoices().add(bc2); def.setDefaultValue(new String[]{"http://host2/a"}); PropertyDefinitionTypeElement el = new PropertyDefinitionTypeElement(AbderaFactory.getInstance().getFactory(), AtomCMIS.PROPERTY_URI_DEFINITION); el.build(def); // System.out.println("PropertyUriDefinition: " + el); ByteArrayOutputStream out = new ByteArrayOutputStream(); el.writeTo(out); DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setNamespaceAware(true); org.w3c.dom.Document xmlDoc = f.newDocumentBuilder().parse(new ByteArrayInputStream(out.toByteArray())); assertNotNull(xmlDoc); XPath xp = XPathFactory.newInstance().newXPath(); xp.setNamespaceContext(new NamespaceResolver()); String baseElement = "cmis:propertyUriDefinition"; checkCommonAttributes(xp, xmlDoc, baseElement); String r = (String)xp.evaluate("/" + baseElement + "/cmis:propertyType", xmlDoc, XPathConstants.STRING); assertEquals("uri", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:choice)", xmlDoc, XPathConstants.STRING); assertEquals("2", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate("count(/" + baseElement + "/cmis:defaultValue/cmis:value)", xmlDoc, XPathConstants.STRING); assertEquals("1", r); r = (String)xp.evaluate(baseElement + "/cmis:defaultValue/cmis:value", xmlDoc, XPathConstants.STRING); assertEquals("http://host2/a", r); } private void addCommonAttributes(PropertyDefinition<?> def) { def.setDescription("description"); def.setDisplayName("displayName"); def.setId("id"); def.setLocalName("localName"); def.setOrderable(true); def.setLocalNamespace("localNamespace"); def.setQueryable(true); def.setQueryName("queryName"); def.setMultivalued(false); def.setRequired(true); def.setOpenChoice(new Boolean(true)); def.setUpdatability(Updatability.READONLY); } private void checkCommonAttributes(XPath xp, org.w3c.dom.Document xmlDoc, String baseElement) throws Exception { assertNotNull(xmlDoc); String r = (String)xp.evaluate("/" + baseElement + "/cmis:name", xmlDoc, XPathConstants.STRING); r = (String)xp.evaluate(baseElement + "/cmis:cardinality", xmlDoc, XPathConstants.STRING); assertEquals("single", r); r = (String)xp.evaluate(baseElement + "/cmis:updatability", xmlDoc, XPathConstants.STRING); assertEquals("readonly", r); r = (String)xp.evaluate(baseElement + "/cmis:queryName", xmlDoc, XPathConstants.STRING); assertEquals("queryName", r); r = (String)xp.evaluate(baseElement + "/cmis:localName", xmlDoc, XPathConstants.STRING); assertEquals("localName", r); r = (String)xp.evaluate(baseElement + "/cmis:localNamespace", xmlDoc, XPathConstants.STRING); assertEquals("localNamespace", r); r = (String)xp.evaluate(baseElement + "/cmis:displayName", xmlDoc, XPathConstants.STRING); assertEquals("displayName", r); r = (String)xp.evaluate(baseElement + "/cmis:description", xmlDoc, XPathConstants.STRING); assertEquals("description", r); r = (String)xp.evaluate(baseElement + "/cmis:inherited", xmlDoc, XPathConstants.STRING); assertEquals("false", r); r = (String)xp.evaluate(baseElement + "/cmis:required", xmlDoc, XPathConstants.STRING); assertEquals("true", r); r = (String)xp.evaluate(baseElement + "/cmis:queryable", xmlDoc, XPathConstants.STRING); assertEquals("true", r); r = (String)xp.evaluate(baseElement + "/cmis:orderable", xmlDoc, XPathConstants.STRING); assertEquals("true", r); r = (String)xp.evaluate(baseElement + "/cmis:openChoice", xmlDoc, XPathConstants.STRING); assertEquals("true", r); } private static String xmlToString(Node node) { try { Source source = new DOMSource(node); StringWriter stringWriter = new StringWriter(); Result result = new StreamResult(stringWriter); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.transform(source, result); return stringWriter.getBuffer().toString(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } return null; } }