/* * Copyright (C) 2009 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.exoplatform.services.jcr.api.nodetypes; import org.exoplatform.services.jcr.JcrAPIBaseTest; import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager; import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.InputStream; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.PropertyType; import javax.jcr.Value; import javax.jcr.nodetype.ConstraintViolationException; /** * Created by The eXo Platform SAS. */ public class TestValueConstraints extends JcrAPIBaseTest { private Node testValueConstraintsNode = null; private NodeTypeManagerImpl ntManager = null; private Node refNodeNtUnstructured = null; private String nodeTypeName = "jcr:testValueConstraints"; private static String LOCAL_BIG_FILE = null; private static String LOCAL_SMALL_FILE = null; private static String LOCAL_NORMAL_FILE = null; public void setUp() throws Exception { super.setUp(); LOCAL_SMALL_FILE = createBLOBTempFile(16).getAbsolutePath(); // 16Kb LOCAL_BIG_FILE = createBLOBTempFile(16 * 1024).getAbsolutePath(); // 16Mb LOCAL_NORMAL_FILE = createBLOBTempFile(17).getAbsolutePath(); // 17Kb byte[] xmlData = readXmlContent("/org/exoplatform/services/jcr/api/nodetypes/nodetypes-api-test.xml"); ByteArrayInputStream xmlInput = new ByteArrayInputStream(xmlData); ntManager = (NodeTypeManagerImpl)session.getWorkspace().getNodeTypeManager(); ntManager.registerNodeTypes(xmlInput, 0, NodeTypeDataManager.TEXT_XML); assertNotNull(ntManager.getNodeType(nodeTypeName)); Node ntRoot = (Node)repository.getSystemSession().getItem(NodeTypeManagerImpl.NODETYPES_ROOT); assertTrue(ntRoot.hasNode(nodeTypeName)); testValueConstraintsNode = root.addNode("testValueConstraints", nodeTypeName); testValueConstraintsNode.addMixin("mix:referenceable"); refNodeNtUnstructured = root.addNode("testref", "nt:unstructured"); refNodeNtUnstructured.addMixin("mix:referenceable"); session.save(); } public void testSTRING1Property() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testSTRING1", "abc"); session.save(); try { testProperty.setValue("abcd"); session.save(); fail("setValue(STRING value) must throw a ConstraintViolationException "); } catch (Exception e) { // success } } public void testSTRING2Property() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testSTRING2", "abc"); testProperty.setValue("abcd"); testProperty.setValue(""); testProperty.setValue("1234"); testProperty.setValue("true"); session.save(); } public void testPATHProperty() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testPATH", valueFactory.createValue("/abc", PropertyType.PATH)); Value value = valueFactory.createValue("../exojcrtest:def/ghi", PropertyType.PATH); testProperty.setValue(value); session.save(); try { testProperty.setValue(valueFactory.createValue("/abcd", PropertyType.PATH)); session.save(); fail("setValue(PATH value) must throw a ConstraintViolationException "); } catch (Exception e) { // success } try { testProperty.setValue(valueFactory.createValue("../abc", PropertyType.PATH)); session.save(); fail("setValue(PATH value) must throw a ConstraintViolationException "); } catch (Exception e) { // success } } public void testNAMEProperty() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testNAME", valueFactory.createValue("abc:")); testProperty.setValue(valueFactory.createValue("abc:def")); session.save(); try { testProperty.setValue(valueFactory.createValue("/abcd")); session.save(); fail("setValue(NAME value) must throw a ConstraintViolationException "); } catch (Exception e) { // success } try { testProperty.setValue(valueFactory.createValue("abc:de")); session.save(); fail("setValue(NAME value) must throw a ConstraintViolationException "); } catch (Exception e) { // success } } public void testBINARYINCLUSIVEProperty() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testBINARYINCLUSIVE", new FileInputStream(LOCAL_SMALL_FILE)); testProperty.setValue(new FileInputStream(LOCAL_BIG_FILE)); session.save(); } public void testBINARYEXCLUSIVEProperty() throws Exception { try { Property testProperty = testValueConstraintsNode.setProperty("jcr:testBINARYEXCLUSIVE", new FileInputStream(LOCAL_SMALL_FILE)); testProperty.setValue(new FileInputStream(LOCAL_BIG_FILE)); session.save(); fail("setValue(BINARY value) must throw a ConstraintViolationException "); } catch (Exception e) { // succes } // trying to use another file to get constraint viol. try { Property testProperty = testValueConstraintsNode.setProperty("jcr:testBINARYEXCLUSIVE", new FileInputStream(LOCAL_NORMAL_FILE)); session.save(); fail("setValue(BINARY value) must throw a ConstraintViolationException "); } catch (Exception e) { // succes } } public void testDATEINCLUSIVEProperty() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testDATEINCLUSIVE", valueFactory.createValue( "1111-11-11T11:11:11.111Z", PropertyType.DATE)); testProperty.setValue(valueFactory.createValue("1222-11-11T11:11:11.111Z", PropertyType.DATE)); session.save(); } public void testDATEEXCLUSIVEProperty() throws Exception { try { Property testProperty = testValueConstraintsNode.setProperty("jcr:testDATEEXCLUSIVE", valueFactory.createValue( "1111-11-11T11:11:11.111Z", PropertyType.DATE)); testProperty.setValue(valueFactory.createValue("1222-11-11T11:11:11.111Z", PropertyType.DATE)); session.save(); fail("setValue(DATE value) must throw a ConstraintViolationException "); } catch (Exception e) { // succes } // trying to use another date to get constr.viol.ex. try { Property testProperty = testValueConstraintsNode.setProperty("jcr:testDATEEXCLUSIVE", valueFactory.createValue( "1155-11-11T11:11:11.111Z", PropertyType.DATE)); session.save(); fail("setValue(DATE value) must throw a ConstraintViolationException "); } catch (Exception e) { // succes } } public void testLONGINCLUSIVEProperty() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testLONGINCLUSIVE", 100); testProperty.setValue(200); session.save(); } public void testLONGEXCLUSIVEProperty() throws Exception { try { Property testProperty = testValueConstraintsNode.setProperty("jcr:testLONGEXCLUSIVE", 100); testProperty.setValue(200); session.save(); fail("setValue(LONG value) must throw a ConstraintViolationException "); } catch (Exception e) { // succes } // trying to use another Long to get ex. try { Property testProperty = testValueConstraintsNode.setProperty("jcr:testLONGEXCLUSIVE", 150); session.save(); fail("setValue(LONG value) must throw a ConstraintViolationException "); } catch (Exception e) { // succes } } public void testDOUBLEINCLUSIVEProperty() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testDOUBLEINCLUSIVE", 100); testProperty.setValue(200); session.save(); } public void testDOUBLEEXCLUSIVEProperty() throws Exception { try { Property testProperty = testValueConstraintsNode.setProperty("jcr:testDOUBLEEXCLUSIVE", 100); testProperty.setValue(200); session.save(); fail("setValue(DOUBLE value) must throw a ConstraintViolationException "); } catch (Exception e) { // succes } // trying to use another Double to get ex. try { Property testProperty = testValueConstraintsNode.setProperty("jcr:testDOUBLEEXCLUSIVE", 150); session.save(); fail("setValue(DOUBLE value) must throw a ConstraintViolationException "); } catch (Exception e) { // succes } } public void testBOOLEANProperty() throws Exception { Property testProperty = testValueConstraintsNode.setProperty("jcr:testBOOLEAN", true); session.save(); try { testProperty.setValue(false); root.save(); fail("setValue(BOOLEAN value) should throws ConstraintViolationException on 'false'"); } catch (ConstraintViolationException e) { // ok } } private byte[] readXmlContent(String fileName) { try { InputStream is = TestValueConstraints.class.getResourceAsStream(fileName); ByteArrayOutputStream output = new ByteArrayOutputStream(); int r = is.available(); byte[] bs = new byte[r]; while (r > 0) { r = is.read(bs); if (r > 0) { output.write(bs, 0, r); } r = is.available(); } is.close(); return output.toByteArray(); } catch (Exception e) { log.error("Error read file '" + fileName + "' with NodeTypes. Error:" + e); return null; } } protected void tearDown() throws Exception { if (session.getRootNode().hasNode("testValueConstraints")) { session.getRootNode().getNode("testValueConstraints").remove(); } if (session.getRootNode().hasNode("testref")) { session.getRootNode().getNode("testref").remove(); } super.tearDown(); } }