/*
* 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.reading;
import org.exoplatform.services.jcr.JcrAPIBaseTest;
import org.exoplatform.services.jcr.impl.core.PropertyImpl;
import org.exoplatform.services.jcr.impl.core.value.BinaryValue;
import org.exoplatform.services.jcr.impl.dataflow.SpoolConfig;
import org.exoplatform.services.jcr.impl.xml.importing.dataflow.PropertyInfo;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.jcr.ItemExistsException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import javax.jcr.ValueFormatException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.version.VersionException;
/**
* Created by The eXo Platform SAS.
*
* @author <a href="mailto:geaz@users.sourceforge.net">Gennady Azarenkov</a>
* @version $Id: TestProperty.java 11907 2008-03-13 15:36:21Z ksm $
*/
public class TestProperty extends JcrAPIBaseTest
{
private Node node;
public void initRepository() throws RepositoryException
{
Node root = session.getRootNode();
node = root.addNode("childNode", "nt:unstructured");
Value[] values = new Value[3];
values[0] = valueFactory.createValue("stringValue");
values[1] = valueFactory.createValue("true");
values[2] = valueFactory.createValue("121");
node.setProperty("multi", values, PropertyType.STRING);
node.setProperty("multi-boolean", new Value[]{session.getValueFactory().createValue(true),
session.getValueFactory().createValue(true)});
node.setProperty("single", session.getValueFactory().createValue("this is the content"));
ByteArrayInputStream is = new ByteArrayInputStream("streamValue".getBytes());
node.setProperty("stream", valueFactory.createValue(is));
}
public void tearDown() throws Exception
{
node.remove();
super.tearDown();
}
public void testGetValue() throws RepositoryException
{
Property property = node.getProperty("single");
assertTrue(property.getValue() instanceof Value);
try
{
node.getProperty("multi").getValue();
fail("exception should have been thrown");
}
catch (ValueFormatException e)
{
}
try
{
node.getProperty("multi-boolean").getBoolean();
fail("exception should have been thrown");
}
catch (ValueFormatException e)
{
}
}
public void testGetValues() throws RepositoryException
{
Value[] values = node.getProperty("multi").getValues();
for (int i = 0; i < values.length; i++)
{
Value value = values[i];
if (!("stringValue".equals(value.getString()) || "true".equals(value.getString()) || "121".equals(value
.getString())))
{
fail("returned non expected value");
}
}
try
{
node.getProperty("single").getValues();
fail("exception should have been thrown");
}
catch (ValueFormatException e)
{
}
}
public void testGetString() throws RepositoryException
{
node.setProperty("string", session.getValueFactory().createValue("stringValue"));
String stringValue = node.getProperty("string").getString();
assertEquals("stringValue", stringValue);
try
{
node.getProperty("multi").getString();
fail("exception should have been thrown");
}
catch (ValueFormatException e)
{
}
}
public void testGetBinaryAsStream() throws RepositoryException, IOException
{
node.setProperty("stream",
new BinaryValue(new ByteArrayInputStream("inputStream".getBytes()), SpoolConfig.getDefaultSpoolConfig()));
Value value = node.getProperty("stream").getValue();
InputStream iS = value.getStream();
byte[] bytes = new byte[iS.available()];
iS.read(bytes);
assertEquals("inputStream", new String(bytes));
try
{
value.getString();
fail("exception should have been thrown");
}
catch (IllegalStateException e)
{
}
iS.reset();
iS = node.getProperty("stream").getValue().getStream();
bytes = new byte[iS.available()];
iS.read(bytes);
assertEquals("inputStream", new String(bytes));
}
public void testGetLong() throws RepositoryException
{
node.setProperty("long", valueFactory.createValue(15l));
assertEquals(15, node.getProperty("long").getLong());
assertEquals(15, node.getProperty("long").getValue().getLong());
node.setProperty("noLong", "someText");
try
{
node.getProperty("noLong").getLong();
fail();
}
catch (ValueFormatException e)
{
}
}
public void testGetDouble() throws RepositoryException
{
node.setProperty("double", session.getValueFactory().createValue(15));
assertEquals(15, (int)node.getProperty("double").getDouble());
assertEquals(15, (int)node.getProperty("double").getValue().getDouble());
try
{
node.getProperty("multi").getDouble();
fail("exception should have been thrown");
}
catch (ValueFormatException e)
{
}
node.setProperty("noDouble", "someText");
try
{
node.getProperty("noDouble").getDouble();
fail();
}
catch (ValueFormatException e)
{
}
}
public void testGetDate() throws RepositoryException
{
Calendar calendar = new GregorianCalendar();
node.setProperty("date", session.getValueFactory().createValue(calendar));
assertEquals(calendar.getTimeInMillis(), node.getProperty("date").getDate().getTimeInMillis());
assertEquals(calendar.getTimeInMillis(), node.getProperty("date").getValue().getDate().getTimeInMillis());
node.setProperty("noDate", "someText");
try
{
node.getProperty("noDate").getDate();
fail();
}
catch (ValueFormatException e)
{
}
}
public void testGetBoolean() throws RepositoryException
{
node.setProperty("boolean", session.getValueFactory().createValue(true));
assertEquals(true, node.getProperty("boolean").getBoolean());
assertEquals(true, node.getProperty("boolean").getValue().getBoolean());
}
public void testGetLength() throws RepositoryException, IOException
{
Property property = node.getProperty("single");
assertTrue(property.getLength() > 0);
property = node.getProperty("stream");
// node.setProperty("stream", new BinaryValue(new
// ByteArrayInputStream("inputStream".getBytes())));
Value b = valueFactory.createValue(new ByteArrayInputStream("inputStream".getBytes()));
property.setValue(b);
assertTrue(property.getLength() > 0);
try
{
node.getProperty("multi").getLength();
fail("exception should have been thrown");
}
catch (ValueFormatException e)
{
}
}
public void testGetLengths() throws RepositoryException, IOException
{
Property property = node.getProperty("multi");
assertTrue(property.getLengths()[0] > 0);
try
{
node.getProperty("single").getLengths();
fail("exception should have been thrown");
}
catch (ValueFormatException e)
{
}
}
public void testGetDefinition() throws RepositoryException
{
Property property = node.getProperty("single");
assertEquals("*", property.getDefinition().getName());
}
public void testGetType() throws RepositoryException
{
assertEquals(PropertyType.STRING, node.getProperty("single").getType());
assertEquals(PropertyType.STRING, node.getProperty("multi").getType());
}
public void testGetBinaryAsString() throws RepositoryException, IOException
{
// System.out.println("STREAM>>>>>>");
node.setProperty("stream",
new BinaryValue(new ByteArrayInputStream("inputStream".getBytes()), SpoolConfig.getDefaultSpoolConfig()));
// System.out.println("STREAM>>>>>>");
// log.debug("STREAM>>>>>>");
Value value = node.getProperty("stream").getValue();
assertEquals("inputStream", value.getString());
try
{
value.getStream();
fail("exception should have been thrown");
}
catch (IllegalStateException e)
{
}
}
public void testGetNode() throws RepositoryException
{
Node root = session.getRootNode();
Node node1 = root.addNode("childNode1", "nt:unstructured");
Node refNode = node1.addNode("refNode", "nt:resource");
refNode
.setProperty("jcr:data", session.getValueFactory().createValue("this is the content", PropertyType.BINARY));
refNode.setProperty("jcr:mimeType", session.getValueFactory().createValue("text/html"));
refNode.setProperty("jcr:lastModified", session.getValueFactory().createValue(Calendar.getInstance()));
Value refVal = valueFactory.createValue(refNode);
Property p = node1.setProperty("reference", refVal);
// log.debug("RefVal >>>"+p.getString());
root.save();
assertEquals(refNode.getUUID(), node1.getProperty("reference").getString());
assertEquals(refNode.getPath(), node1.getProperty("reference").getNode().getPath());
refNode.remove();
node1.setProperty("noNode", "someText");
try
{
node1.getProperty("noNode").getNode();
fail();
}
catch (ValueFormatException e)
{
}
finally
{
node1.remove();
}
}
public void testEquals() throws ItemExistsException, PathNotFoundException, VersionException,
ConstraintViolationException, LockException, RepositoryException
{
Node testNode = root.addNode("testNode");
PropertyImpl testProperty = (PropertyImpl)testNode.setProperty("testProperty", "someText");
assertFalse(testProperty.equals(new Object()));
}
public void testPropertyInfoGetValuesSize()
{
PropertyInfo propertInfo = new PropertyInfo();
assertEquals(0, propertInfo.getValuesSize());
}
}