/*
* 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.core.CredentialsImpl;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Calendar;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.LoginException;
import javax.jcr.NamespaceException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.version.VersionException;
/**
* Created by The eXo Platform SAS.
*
* @author <a href="mailto:geaz@users.sourceforge.net">Gennady Azarenkov</a>
* @version $Id: TestSession.java 12108 2008-03-19 14:26:36Z gazarenkov $
*/
public class TestSession extends JcrAPIBaseTest
{
public void testGetRepository()
{
assertEquals(session.getRepository(), repository);
}
public void testCredentials() throws Exception
{
assertEquals(session.getUserID(), credentials.getUserID());
assertEquals(0, session.getAttributeNames().length);
assertNull(session.getAttribute("test"));
CredentialsImpl c2 = new CredentialsImpl(this.credentials.getUserID(), credentials.getPassword());
c2.setAttribute("test", "value");
Session session2 = repository.login(c2);
assertEquals(1, session2.getAttributeNames().length);
assertEquals("value", session2.getAttribute("test"));
}
public void testGetWorkspace()
{
assertEquals(session.getWorkspace().getSession(), session);
}
public void testImpersonate() throws LoginException, RepositoryException
{
Session session2 = session.impersonate(new CredentialsImpl("user", new char[0]));
assertNotSame(session, session2);
/*
* 6.2.1 The new Session is tied to a new Workspace instance. In other
* words, Workspace instances are not re-used.
*/
assertNotSame(session.getWorkspace(), session2.getWorkspace());
/*
* 6.2.1 However, the Workspace instance returned represents the same actual
* persistent workspace entity in the repository as is represented by the
* Workspace object tied to this Session.
*/
assertEquals(session.getWorkspace().getName(), session2.getWorkspace().getName());
}
public void testLogout() throws Exception
{
Session localSession = repository.login(credentials, "ws");
localSession.logout();
}
public void testGetRootNode() throws RepositoryException
{
assertNotNull(session.getRootNode());
assertEquals("/", session.getRootNode().getPath());
}
public void testItem() throws RepositoryException
{
Node root = session.getRootNode();
// Node
Node node = root.addNode("testItem", "nt:folder").addNode("childNode2", "nt:file");
assertNotNull(session.getItem("/testItem/childNode2"));
// Property
Property prop = root.setProperty("prop", "val");
assertNotNull(session.getItem("/prop"));
try
{
session.getItem("/not/found");
fail("exception should have been thrown");
}
catch (PathNotFoundException e)
{
}
assertTrue(session.itemExists("/testItem/childNode2"));
assertFalse(session.itemExists("/not/found"));
}
public void testGetNodeByUUID() throws RepositoryException
{
Node root = session.getRootNode();
Node folder = root.addNode("childNode", "nt:folder").addNode("childNode2", "nt:file");
Node contentNode = folder.addNode("jcr:content", "nt:resource");
contentNode.setProperty("jcr:data", session.getValueFactory().createValue("this is the content",
PropertyType.BINARY));
contentNode.setProperty("jcr:mimeType", session.getValueFactory().createValue("text/html"));
contentNode.setProperty("jcr:lastModified", session.getValueFactory().createValue(Calendar.getInstance()));
try
{
//log.debug("SDM before save: "+session.getTransientNodesManager().dump())
// ;
session.save();
// child = child.getNode("jcr:content");
assertNotNull(contentNode.getUUID());
// System.out.println("LOC>>>"+session.getNodesManager().getLocation(
// contentNode.getUUID()));
Node n = session.getNodeByUUID(contentNode.getUUID());
assertNotNull(n);
assertEquals(contentNode.getPath(), n.getPath());
}
finally
{
// folder.refresh(false);
if (log.isDebugEnabled())
{
log.debug("SDM before remove: " + session.getTransientNodesManager().dump());
}
folder.remove();
session.save();
}
}
public void testGetAllNamespacePrefixes() throws RepositoryException
{
assertTrue(Arrays.asList(session.getWorkspace().getNamespaceRegistry().getPrefixes()).containsAll(
Arrays.asList(session.getAllNamespacePrefixes())));
}
public void testGetImportContentHandlerCheckLockException() throws ItemExistsException, PathNotFoundException,
VersionException, ConstraintViolationException, LockException, RepositoryException
{
Node testNode = root.addNode("test");
testNode.addMixin("mix:lockable");
session.save();
testNode.lock(true, true);
Session session2 =
repository.login(new CredentialsImpl("admin", "admin".toCharArray()), session.getWorkspace().getName());
try
{
session2.getImportContentHandler("/test", 0);
fail();
}
catch (LockException e)
{
}
finally
{
session2.logout();
testNode.unlock();
}
}
public void testGetImportContentHandlerCheckConstraintViolationException() throws ItemExistsException,
PathNotFoundException, VersionException, ConstraintViolationException, LockException, RepositoryException
{
root.addNode("someNode", "exo:myTypeJCR1703");
try
{
session.getImportContentHandler("/someNode/exo:myChildNode", 0);
fail();
}
catch (ConstraintViolationException e)
{
}
}
public void testImportXMLCheckLockException() throws ItemExistsException, PathNotFoundException,
NoSuchNodeTypeException, LockException, VersionException, ConstraintViolationException, RepositoryException,
IOException
{
Node testNode = root.addNode("testNode");
testNode.setProperty("exo:title", "testNode");
testNode.addMixin("mix:versionable");
Node testNodeImport = root.addNode("testNodeImport");
testNodeImport.addMixin("mix:lockable");
session.save();
testNodeImport.lock(true, true);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
testNode.getSession().exportDocumentView(testNode.getPath(), bos, false, false);
ByteArrayInputStream is = new ByteArrayInputStream(bos.toByteArray());
Session session2 =
repository.login(new CredentialsImpl("admin", "admin".toCharArray()), session.getWorkspace().getName());
try
{
session2.importXML(testNodeImport.getPath(), is, 1);
fail();
}
catch (LockException e)
{
}
finally
{
session2.logout();
testNodeImport.unlock();
}
}
public void testImportXMLCheckConstraintViolationException() throws ItemExistsException, PathNotFoundException,
VersionException, ConstraintViolationException, LockException, RepositoryException, IOException
{
Node testNode = root.addNode("testNode");
testNode.setProperty("exo:title", "testNode");
testNode.addMixin("mix:versionable");
root.addNode("someNode", "exo:myTypeJCR1703");
session.save();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
testNode.getSession().exportDocumentView(testNode.getPath(), bos, false, false);
ByteArrayInputStream is = new ByteArrayInputStream(bos.toByteArray());
try
{
session.importXML("/someNode/exo:myChildNode", is, 1);
fail();
}
catch (ConstraintViolationException e)
{
}
}
public void testGetNodeByIdentifierWhenNodeNotFound() throws ItemExistsException, PathNotFoundException,
VersionException, ConstraintViolationException, LockException, RepositoryException
{
try
{
session.getNodeByIdentifier("someidentifier");
fail();
}
catch (ItemNotFoundException e)
{
}
}
public void testSetNamespacePrefix() throws RepositoryException
{
try
{
session.setNamespacePrefix("nt", "http://www.jcp.org/jcr/1.0");
fail();
}
catch (NamespaceException e)
{
}
}
}