Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 12463 invoked from network); 24 Sep 2007 22:25:17 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 24 Sep 2007 22:25:17 -0000 Received: (qmail 17369 invoked by uid 500); 24 Sep 2007 22:25:08 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 17344 invoked by uid 500); 24 Sep 2007 22:25:08 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 17332 invoked by uid 99); 24 Sep 2007 22:25:08 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 24 Sep 2007 15:25:08 -0700 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 24 Sep 2007 22:25:15 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 2214D1A9832; Mon, 24 Sep 2007 15:24:52 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r578997 - in /jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping: ./ src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/ src/main/java/org/apache/jackrabbit/ocm/manager/impl/ src/main/java/org/apache/jackrabbi... Date: Mon, 24 Sep 2007 22:20:16 -0000 To: commits@jackrabbit.apache.org From: clombart@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20070924222453.2214D1A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: clombart Date: Mon Sep 24 15:19:48 2007 New Revision: 578997 URL: http://svn.apache.org/viewvc?rev=578997&view=rev Log: Reorganise the ocm project - second step : Remove all Jackrabbit dependencies. right now, Jackrabbit is only used for the unit tests. RepositoryUtil has been split into 2 distincts classes : 1/ NodeUtil : utility class for managing jcr nodes. 2/ RepositoryUtil : utility class to connect & setup a Jackrabbit repo. This could be rename into JackrabbitRepoUtil :-) Added: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/repository/NodeUtil.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/NodeUtilTest.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/RepositoryUtil.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/security/ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/security/SimpleAccessManager.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/security/SimpleLoginModule.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/transaction/ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/transaction/jackrabbit/ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/transaction/jackrabbit/UserTransactionImpl.java Removed: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/repository/RepositoryUtil.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/security/ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/transaction/ Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/pom.xml jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectContentManagerImpl.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/TestBase.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/AllTests.java jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/RepositoryUtilTest.java Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/pom.xml?rev=578997&r1=578996&r2=578997&view=diff ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/pom.xml (original) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/pom.xml Mon Sep 24 15:19:48 2007 @@ -1,178 +1,193 @@ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> - 4.0.0 + 4.0.0 - - - - - org.apache.jackrabbit - jackrabbit - 1.4-SNAPSHOT - - jackrabbit-ocm - jar - Jackrabbit Object Content Mapping - This Jackrabbit subproject is an object/JCR persistence and query service. This tools lets you to persist java objects into a JCR compliant repository - including association, inheritance, polymorphism, composition, and the Java collections framework. Furthermore, this jcr-mapping allows you to express queries in Java-based Criteria, as well as in JCR query language. It offers also features like version support and object locking. - 2007 - - - - - - - - true - maven-compiler-plugin - - 1.5 - 1.5 - - - - org.apache.maven.plugins - maven-surefire-plugin - - -Xmx256m - - - - - - - - - - - javax.jcr - jcr - 1.0 - - - org.apache.jackrabbit - jackrabbit-api - 1.4-SNAPSHOT - - - org.apache.jackrabbit - jackrabbit-core - 1.4-SNAPSHOT - - - org.apache.jackrabbit - jackrabbit-jcr-commons - 1.4-SNAPSHOT - - - org.apache.lucene - lucene-core - 2.2.0 - - - commons-collections - commons-collections - 3.1 - - - commons-logging - commons-logging - 1.0.2 - - - commons-lang - commons-lang - 2.1 - - - - org.slf4j - slf4j-log4j12 - 1.0 - - - cglib - cglib - 2.1_3 - - - commons-beanutils - commons-beanutils - 1.7.0 - - - log4j - log4j - 1.2.8 - - - - geronimo-spec - geronimo-spec-jta - 1.0-M1 - test - - - xerces - xercesImpl - 2.6.2 - test - - - xerces - xmlParserAPIs - 2.0.2 - test - - - org.apache.derby - derby - 10.2.1.6 - test - - - commons-digester - commons-digester - 1.7 - - - junit - junit - 3.8.1 - test - - - - - - scm:svn:http://svn.apache.org/repos/asf/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping - - - scm:svn:https://svn.apache.org/repos/asf/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping - - - http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping - - + + + + + org.apache.jackrabbit + jackrabbit + 1.4-SNAPSHOT + + jackrabbit-ocm + jar + Jackrabbit Object Content Mapping + + This Jackrabbit subproject is an object/JCR persistence and + query service. This tools lets you to persist java objects into + a JCR compliant repository - including association, inheritance, + polymorphism, composition, and the Java collections framework. + Furthermore, this jcr-mapping allows you to express queries in + Java-based Criteria, as well as in JCR query language. It offers + also features like version support and object locking. + + 2007 + + + + + + + + true + maven-compiler-plugin + + 1.5 + 1.5 + + + + org.apache.maven.plugins + maven-surefire-plugin + + -Xmx256m + + + + + + + + + + + javax.jcr + jcr + 1.0 + + + commons-collections + commons-collections + 3.1 + + + commons-logging + commons-logging + 1.0.2 + + + commons-lang + commons-lang + 2.1 + + + + org.slf4j + slf4j-log4j12 + 1.0 + + + cglib + cglib + 2.1_3 + + + commons-beanutils + commons-beanutils + 1.7.0 + + + log4j + log4j + 1.2.8 + + + + + + org.apache.jackrabbit + jackrabbit-api + 1.4-SNAPSHOT + test + + + org.apache.jackrabbit + jackrabbit-core + 1.4-SNAPSHOT + test + + + org.apache.jackrabbit + jackrabbit-jcr-commons + 1.4-SNAPSHOT + test + + + org.apache.lucene + lucene-core + 2.2.0 + test + + + + geronimo-spec + geronimo-spec-jta + 1.0-M1 + test + + + xerces + xercesImpl + 2.6.2 + test + + + xerces + xmlParserAPIs + 2.0.2 + test + + + org.apache.derby + derby + 10.2.1.6 + test + + + commons-digester + commons-digester + 1.7 + + + junit + junit + 3.8.1 + test + + + + + + scm:svn:http://svn.apache.org/repos/asf/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping + + + scm:svn:https://svn.apache.org/repos/asf/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping + + + http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping + + Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java?rev=578997&r1=578996&r2=578997&view=diff ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java (original) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/NTCollectionConverterImpl.java Mon Sep 24 15:19:48 2007 @@ -18,8 +18,6 @@ package org.apache.jackrabbit.ocm.manager.collectionconverter.impl; -import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -47,7 +45,6 @@ import org.apache.jackrabbit.ocm.mapper.model.ClassDescriptor; import org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor; import org.apache.jackrabbit.ocm.reflection.ReflectionUtils; -import org.apache.jackrabbit.util.ISO9075; /** * Collection Mapping/convertion based on node type. Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectContentManagerImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectContentManagerImpl.java?rev=578997&r1=578996&r2=578997&view=diff ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectContentManagerImpl.java (original) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectContentManagerImpl.java Mon Sep 24 15:19:48 2007 @@ -61,7 +61,6 @@ import org.apache.jackrabbit.ocm.query.Query; import org.apache.jackrabbit.ocm.query.QueryManager; import org.apache.jackrabbit.ocm.query.impl.QueryManagerImpl; -import org.apache.jackrabbit.ocm.repository.RepositoryUtil; import org.apache.jackrabbit.ocm.version.Version; import org.apache.jackrabbit.ocm.version.VersionIterator; /** @@ -120,7 +119,6 @@ this.requestObjectCache = new RequestObjectCacheImpl(); this.objectConverter = new ObjectConverterImpl(mapper, converterProvider, new ProxyManagerImpl(), requestObjectCache); - RepositoryUtil.setupSession(session); } catch (RepositoryException e) { @@ -148,8 +146,7 @@ this.queryManager = new QueryManagerImpl(mapper, atomicTypeConverters, session.getValueFactory()); this.requestObjectCache = new RequestObjectCacheImpl(); this.objectConverter = new ObjectConverterImpl(mapper, converterProvider, new ProxyManagerImpl(), requestObjectCache); - - RepositoryUtil.setupSession(session); + } catch (RepositoryException e) { @@ -178,7 +175,6 @@ this.requestObjectCache = new RequestObjectCacheImpl(); this.objectConverter = new ObjectConverterImpl(mapper, converterProvider, new ProxyManagerImpl(), requestObjectCache); - RepositoryUtil.setupSession(session); } catch (RepositoryException e) { @@ -207,8 +203,7 @@ this.objectConverter = converter; this.queryManager = queryManager; this.requestObjectCache = requestObjectCache; - - RepositoryUtil.setupSession(session); + } /** Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java?rev=578997&r1=578996&r2=578997&view=diff ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java (original) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java Mon Sep 24 15:19:48 2007 @@ -49,7 +49,7 @@ import org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor; import org.apache.jackrabbit.ocm.mapper.model.FieldDescriptor; import org.apache.jackrabbit.ocm.reflection.ReflectionUtils; -import org.apache.jackrabbit.ocm.repository.RepositoryUtil; +import org.apache.jackrabbit.ocm.repository.NodeUtil; /** * Default implementation for {@link ObjectConverterImpl} @@ -139,8 +139,8 @@ public void insert(Session session, Object object) { String path = this.getPath(session, object); try { - String parentPath = RepositoryUtil.getParentPath(path); - String nodeName = RepositoryUtil.getNodeName(path); + String parentPath = NodeUtil.getParentPath(path); + String nodeName = NodeUtil.getNodeName(path); Node parentNode = (Node) session.getItem(parentPath); this.insert(session, parentNode, nodeName, object); @@ -227,8 +227,8 @@ public void update(Session session, Object object) { String path = this.getPath(session, object); try { - String parentPath = RepositoryUtil.getParentPath(path); - String nodeName = RepositoryUtil.getNodeName(path); + String parentPath = NodeUtil.getParentPath(path); + String nodeName = NodeUtil.getNodeName(path); Node parentNode = (Node) session.getItem(parentPath); this.update(session, parentNode, nodeName, object); } catch (PathNotFoundException pnfe) { Added: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/repository/NodeUtil.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/repository/NodeUtil.java?rev=578997&view=auto ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/repository/NodeUtil.java (added) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/main/java/org/apache/jackrabbit/ocm/repository/NodeUtil.java Mon Sep 24 15:19:48 2007 @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.jackrabbit.ocm.repository; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jackrabbit.ocm.exception.JcrMappingException; +import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException; + +/** +* Utility class for managing JCR nodes. +* +* +* @author Lombart Christophe +* @version $Id: Exp $ +*/ +public class NodeUtil +{ + + + /** Item path separator */ + public static final String PATH_SEPARATOR = "/"; + + private final static Log log = LogFactory.getLog(NodeUtil.class); + + + /** + * Check if a path is valid + * + * @param path The path to validate + * @return true if the path is valid, else false + */ + public static boolean isValidPath(String path) + { + if ((path == null) || + (path.equals(PATH_SEPARATOR)) || + (path.endsWith(PATH_SEPARATOR)) || + (! path.startsWith(PATH_SEPARATOR)) || + (path.equals(""))) + { + return false; + } + return true; + } + + /** + * Get the parent path + * @param path The path from wich the parent path has to be returned + * @return The parent path + * + * @throws ObjectContentManagerException when the path is invalid + */ + public static String getParentPath(String path) throws ObjectContentManagerException + { + String parentPath = ""; + + if (!isValidPath(path)) + { + throw new JcrMappingException("Invalid path : " + path); + } + + String[] pathElements = path.split(PATH_SEPARATOR); + + // Firts path element should be = empty string because a uri always start with '/' + // So, if len=2, means it is a root folder like '/foo'. + // In this case the uri has not parent folder => return "/" + if (pathElements.length == 2) + { + return PATH_SEPARATOR; + } + + for(int i=0; i < pathElements.length -1; i++) + { + if (! pathElements[i].equals("")) + { + parentPath += PATH_SEPARATOR + pathElements[i]; + } + } + return parentPath; + } + + /** + * Get the node name + * @param path The path from which the node name has to be retrieved + * @return The node name + * + * @throws ObjectContentManagerException when the path is invalid + */ + public static String getNodeName(String path) throws ObjectContentManagerException + { + + String[] pathElements = path.split(PATH_SEPARATOR); + + if (! isValidPath(path)) + { + throw new JcrMappingException("Invalid path : " + path); + } + return pathElements[pathElements.length-1]; + } + + +} Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/TestBase.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/TestBase.java?rev=578997&r1=578996&r2=578997&view=diff ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/TestBase.java (original) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/TestBase.java Mon Sep 24 15:19:48 2007 @@ -98,6 +98,7 @@ if (!isInit) { initObjectContentManager(); + RepositoryUtil.setupSession(getSession()); registerNodeTypes(getSession()); isInit = true; } @@ -129,6 +130,7 @@ if (ocm == null) { initObjectContentManager(); + RepositoryUtil.setupSession(getSession()); registerNodeTypes(getSession()); } return ocm; Modified: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/AllTests.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/AllTests.java?rev=578997&r1=578996&r2=578997&view=diff ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/AllTests.java (original) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/AllTests.java Mon Sep 24 15:19:48 2007 @@ -37,6 +37,7 @@ TestSuite suite= new TestSuite("Test for org.apache.jackrabbit.ocm.repository"); //$JUnit-BEGIN$ suite.addTestSuite(RepositoryUtilTest.class); + suite.addTestSuite(NodeUtilTest.class); //$JUnit-END$ Added: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/NodeUtilTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/NodeUtilTest.java?rev=578997&view=auto ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/NodeUtilTest.java (added) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/NodeUtilTest.java Mon Sep 24 15:19:48 2007 @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.jackrabbit.ocm.repository; + +import junit.extensions.TestSetup; +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** Testcase for RepositoryUtil. + * + * @author Christophe Lombart + * @author Alexandru Popescu + */ +public class NodeUtilTest extends TestCase +{ + + /** + *

Defines the test case name for junit.

+ * @param testName The test case name. + */ + public NodeUtilTest(String testName) + { + super(testName); + } + + /** + * @see junit.framework.TestCase#setUp() + */ + protected void setUp() throws Exception + { + super.setUp(); + } + + /** + * @see junit.framework.TestCase#tearDown() + */ + public void tearDown() throws Exception + { + super.tearDown(); + } + + public static Test suite() + { + TestSuite suite = new TestSuite(NodeUtilTest.class); + // All methods starting with "test" will be executed in the test suite. + return new TestSetup(suite) { + protected void setUp() throws Exception { + super.setUp(); + RepositoryUtil.registerRepository("repositoryTest", "./src/test/test-config/repository-derby.xml", "target/repository"); + } + + protected void tearDown() throws Exception { + RepositoryUtil.unRegisterRepository("repositoryTest"); + super.tearDown(); + } + + }; + } + + + /** + * Test for getParentPath() + * + */ + public void testGetParentPath() + { + try + { + String parentPath = NodeUtil.getParentPath("/test"); + assertNotNull("parent path is null for /test", parentPath); + assertTrue("parent path is incorrect for /test", parentPath.equals("/")); + + parentPath = NodeUtil.getParentPath("/test/test2"); + assertNotNull("parent path is null for /test/test2", parentPath); + assertTrue("parent path is incorrect for /test/test2", parentPath.equals("/test")); + + } + catch (Exception e) + { + e.printStackTrace(); + fail("Unable to find the repository : " + e); + } + } + + /** + * Test for getNodeName() + * + */ + public void testGetNodeName() + { + try + { + String nodeName = NodeUtil.getNodeName("/test"); + assertNotNull("node name is null for /test", nodeName); + assertTrue("node name is incorrect for /test", nodeName.equals("test")); + + nodeName = NodeUtil.getNodeName("/test/test2"); + assertNotNull("node name is null for /test/test2", nodeName); + assertTrue("node name is incorrect for /test/test2", nodeName.equals("test2")); + + } + catch (Exception e) + { + e.printStackTrace(); + fail("Unable to find the repository : " + e); + } + } + + +} \ No newline at end of file Added: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/RepositoryUtil.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/RepositoryUtil.java?rev=578997&view=auto ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/RepositoryUtil.java (added) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/repository/RepositoryUtil.java Mon Sep 24 15:19:48 2007 @@ -0,0 +1,227 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.jackrabbit.ocm.repository; + +import java.util.Hashtable; + +import javax.jcr.Repository; +import javax.jcr.Session; +import javax.jcr.SimpleCredentials; +import javax.naming.Context; +import javax.naming.InitialContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jackrabbit.core.jndi.RegistryHelper; +import org.apache.jackrabbit.ocm.exception.JcrMappingException; +import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException; +import org.apache.jackrabbit.ocm.exception.RepositoryException; +import org.apache.jackrabbit.util.ISO9075; +import org.apache.jackrabbit.util.Text; + +/** +* Utility class for managing JCR repositories. +* Note: most of the utility methods in this class can be used only with Jackrabbit. +* +* @author Lombart Christophe +* @version $Id: Exp $ +*/ +public class RepositoryUtil +{ + + /** namespace prefix constant */ + public static final String OCM_NAMESPACE_PREFIX = "ocm"; + + /** namespace constant */ + public static final String OCM_NAMESPACE = "http://jackrabbit.apache.org/ocm"; + + /** Item path separator */ + public static final String PATH_SEPARATOR = "/"; + + private final static Log log = LogFactory.getLog(RepositoryUtil.class); + + /** + * Register a new repository + * + * @param repositoryName The repository unique name + * @param configFile The JCR config file + * @param homeDir The directory containing the complete repository settings (workspace, node types, ...) + * + * @throws RepositoryException when it is not possible to register the repository + */ + public static void registerRepository(String repositoryName, String configFile, String homeDir) throws RepositoryException + { + try + { + Hashtable env = new Hashtable(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory"); + env.put(Context.PROVIDER_URL, "localhost"); + InitialContext ctx = new InitialContext(env); + + RegistryHelper.registerRepository(ctx, repositoryName, configFile, homeDir, true); + } + catch (Exception e) + { + throw new RepositoryException("Impossible to register the respository : " + + repositoryName + " - config file : " + configFile, e); + } + + } + + + /** + * Unregister a repository + * + * @param repositoryName The repository unique name + * + * @throws RepositoryException when it is not possible to unregister the repository + */ + public static void unRegisterRepository(String repositoryName) throws RepositoryException + { + try + { + Hashtable env = new Hashtable(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory"); + env.put(Context.PROVIDER_URL, "localhost"); + InitialContext ctx = new InitialContext(env); + + RegistryHelper.unregisterRepository(ctx, repositoryName); + } + catch (Exception e) + { + throw new RepositoryException("Impossible to unregister the respository : " + + repositoryName , e); + } + + } + + /** + * Get a repository + * + * @param repositoryName The repository name + * @return a JCR repository reference + * + * @throws RepositoryException when it is not possible to get the repository. + * Before calling this method, the repository has to be registered (@see RepositoryUtil#registerRepository(String, String, String) + */ + public static Repository getRepository(String repositoryName) throws RepositoryException + { + try + { + Hashtable env = new Hashtable(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory"); + env.put(Context.PROVIDER_URL, "localhost"); + InitialContext ctx = new InitialContext(env); + + Repository repository = (Repository) ctx.lookup(repositoryName); + return repository; + } + catch (Exception e) + { + throw new RepositoryException("Impossible to get the repository : " + repositoryName, e); + } + } + + /** + * Connect to a JCR repository + * + * @param repository The JCR repository + * @param user The user name + * @param password The password + * @return a valid JCR session + * + * @throws RepositoryException when it is not possible to connect to the JCR repository + */ + public static Session login(Repository repository, String user, String password) throws RepositoryException + { + try + { + Session session = repository.login(new SimpleCredentials(user, password.toCharArray()), null); + + + return session; + } + catch (Exception e) + { + throw new RepositoryException("Impossible to login ", e); + } + } + + + + + + /** + * Setup the session. + * Until now, we check only if the namespace prefix exist in the repository + * + */ + public static void setupSession(Session session) throws RepositoryException + { + try + { + log.info("Setup Jcr session setup ..."); + + String[] jcrNamespaces = session.getWorkspace().getNamespaceRegistry().getPrefixes(); + boolean createNamespace = true; + for (int i = 0; i < jcrNamespaces.length; i++) + { + if (jcrNamespaces[i].equals(OCM_NAMESPACE_PREFIX)) + { + createNamespace = false; + log.debug("Jackrabbit OCM namespace exists."); + } + } + + if (createNamespace) + { + session.getWorkspace().getNamespaceRegistry().registerNamespace(OCM_NAMESPACE_PREFIX, OCM_NAMESPACE); + log.info("Successfully created Jackrabbit OCM namespace."); + } + + if (session.getRootNode() != null) + { + log.info("Jcr session setup successfull."); + } + + + } + catch (Exception e) + { + log.error("Error while setting up the jcr session.", e); + throw new RepositoryException(e.getMessage()); + } + } + + /** + * Encode a path + * @TODO : drop Jackrabbit dependency + * + * @param path the path to encode + * @return the encoded path + * + */ + public static String encodePath(String path) + { + String[] pathElements = Text.explode(path, '/'); + for (int i=0;iSimpleAccessManager ... + */ +public class SimpleAccessManager implements AccessManager +{ + + private static Logger log = Logger.getLogger(SimpleAccessManager.class); + + /** + * Subject whose access rights this AccessManager should reflect + */ + protected Subject subject; + + /** + * hierarchy manager used for ACL-based access control model + */ + protected HierarchyManager hierMgr; + + private boolean initialized; + + protected boolean system; + + protected boolean anonymous; + + /** + * Empty constructor + */ + public SimpleAccessManager() + { + initialized = false; + anonymous = false; + system = false; + } + + //--------------------------------------------------------< AccessManager > + /** + * {@inheritDoc} + */ + public void init(AMContext context) throws AccessDeniedException, Exception + { + if (initialized) + { + throw new IllegalStateException("already initialized"); + } + + subject = context.getSubject(); + hierMgr = context.getHierarchyManager(); + anonymous = !subject.getPrincipals(AnonymousPrincipal.class).isEmpty(); + system = !subject.getPrincipals(SystemPrincipal.class).isEmpty(); + + // @todo check permission to access given workspace based on principals + initialized = true; + } + + /** + * {@inheritDoc} + */ + public synchronized void close() throws Exception + { + if (!initialized) + { + throw new IllegalStateException("not initialized"); + } + + initialized = false; + } + + /** + * {@inheritDoc} + */ + public void checkPermission(ItemId id, int permissions) throws AccessDeniedException, ItemNotFoundException, RepositoryException + { + if (!initialized) + { + throw new IllegalStateException("not initialized"); + } + + if (system) + { + // system has always all permissions + return; + } + else if (anonymous) + { + // anonymous is always denied WRITE & REMOVE premissions + if ((permissions & WRITE) == WRITE || (permissions & REMOVE) == REMOVE) + { + throw new AccessDeniedException(); + } + } + // @todo check permission based on principals + } + + /** + * {@inheritDoc} + */ + public boolean isGranted(ItemId id, int permissions) throws ItemNotFoundException, RepositoryException + { + if (!initialized) + { + throw new IllegalStateException("not initialized"); + } + + if (system) + { + // system has always all permissions + return true; + } + else if (anonymous) + { + // anonymous is always denied WRITE & REMOVE premissions + if ((permissions & WRITE) == WRITE || (permissions & REMOVE) == REMOVE) + { + return false; + } + } + + // @todo check permission based on principals + return true; + + + } + + /** + * {@inheritDoc} + */ + public boolean canAccess(String workspaceName) throws NoSuchWorkspaceException, RepositoryException + { + // @todo check permission to access given workspace based on principals + return true; + } +} Added: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/security/SimpleLoginModule.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/security/SimpleLoginModule.java?rev=578997&view=auto ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/security/SimpleLoginModule.java (added) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/security/SimpleLoginModule.java Mon Sep 24 15:19:48 2007 @@ -0,0 +1,221 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.jackrabbit.ocm.security; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.jcr.Credentials; +import javax.jcr.SimpleCredentials; +import javax.security.auth.Subject; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; +import javax.security.auth.login.FailedLoginException; +import javax.security.auth.login.LoginException; +import javax.security.auth.spi.LoginModule; + +import org.apache.jackrabbit.core.security.AnonymousPrincipal; +import org.apache.jackrabbit.core.security.CredentialsCallback; +import org.apache.jackrabbit.core.security.SecurityConstants; +import org.apache.jackrabbit.core.security.UserPrincipal; +import org.apache.log4j.Logger; + +/** + * A SimpleLoginModule ... + */ +public class SimpleLoginModule implements LoginModule +{ + + private static Logger log = Logger.getLogger(SimpleLoginModule.class); + + /** + * Name of the anonymous user id option in the LoginModule configuration + */ + private static final String OPT_ANONYMOUS = "anonymousId"; + + /** + * The default user id for anonymous login + */ + private static final String DEFAULT_ANONYMOUS_ID = "anonymous"; + + // initial state + private Subject subject; + + private CallbackHandler callbackHandler; + + private Map sharedState; + + private Map options; + + // configurable options + //private boolean someOpt = false; + + // local authentication state: + // the principals, i.e. the authenticated identities + private final Set principals = new HashSet(); + + /** + * Id of an anonymous user login + */ + private String anonymousUserId = DEFAULT_ANONYMOUS_ID; + + /** + * Constructor + */ + public SimpleLoginModule() + { + } + + //----------------------------------------------------------< LoginModule > + /** + * {@inheritDoc} + */ + public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) + { + this.subject = subject; + this.callbackHandler = callbackHandler; + this.sharedState = sharedState; + this.options = options; + + // initialize any configured options + //someOpt = "true".equalsIgnoreCase((String)options.get("someOpt")); + String userId = (String) options.get(OPT_ANONYMOUS); + if (userId != null) + { + anonymousUserId = userId; + } + } + + /** + * {@inheritDoc} + */ + public boolean login() throws LoginException + { + // prompt for a user name and password + if (callbackHandler == null) + { + throw new LoginException("no CallbackHandler available"); + } + + Callback[] callbacks = new Callback[] + { new CredentialsCallback() }; + + boolean authenticated = false; + principals.clear(); + try + { + callbackHandler.handle(callbacks); + // credentials + CredentialsCallback ccb = (CredentialsCallback) callbacks[0]; + Credentials creds = ccb.getCredentials(); + if (creds != null) + { + if (creds instanceof SimpleCredentials) + { + SimpleCredentials sc = (SimpleCredentials) creds; + // authenticate + + Object attr = sc.getAttribute(SecurityConstants.IMPERSONATOR_ATTRIBUTE); + if (attr != null && attr instanceof Subject) + { + Subject impersonator = (Subject) attr; + // @todo check privileges to 'impersonate' the user represented by the supplied credentials + } + else + { + // @todo implement simple username/password authentication + } + + if (anonymousUserId.equals(sc.getUserID())) + { + principals.add(new AnonymousPrincipal()); + } + else + { + // else assume the user we authenticated is the UserPrincipal + principals.add(new UserPrincipal(sc.getUserID())); + } + authenticated = true; + } + } + } + catch (java.io.IOException ioe) + { + throw new LoginException(ioe.toString()); + } + catch (UnsupportedCallbackException uce) + { + throw new LoginException(uce.getCallback().toString() + " not available"); + } + + if (authenticated) + { + return !principals.isEmpty(); + } + else + { + // authentication failed: clean out state + principals.clear(); + throw new FailedLoginException(); + } + } + + /** + * {@inheritDoc} + */ + public boolean commit() throws LoginException + { + if (principals.isEmpty()) + { + return false; + } + else + { + // add a principals (authenticated identities) to the Subject + subject.getPrincipals().addAll(principals); + return true; + } + } + + /** + * {@inheritDoc} + */ + public boolean abort() throws LoginException + { + if (principals.isEmpty()) + { + return false; + } + else + { + logout(); + } + return true; + } + + /** + * {@inheritDoc} + */ + public boolean logout() throws LoginException + { + subject.getPrincipals().removeAll(principals); + principals.clear(); + return true; + } +} Added: jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/transaction/jackrabbit/UserTransactionImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/transaction/jackrabbit/UserTransactionImpl.java?rev=578997&view=auto ============================================================================== --- jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/transaction/jackrabbit/UserTransactionImpl.java (added) +++ jackrabbit/trunk/contrib/jackrabbit-jcr-mapping/jcr-mapping/src/test/java/org/apache/jackrabbit/ocm/transaction/jackrabbit/UserTransactionImpl.java Mon Sep 24 15:19:48 2007 @@ -0,0 +1,213 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.jackrabbit.ocm.transaction.jackrabbit; + +import javax.jcr.Session; +import javax.transaction.HeuristicMixedException; +import javax.transaction.HeuristicRollbackException; +import javax.transaction.NotSupportedException; +import javax.transaction.RollbackException; +import javax.transaction.Status; +import javax.transaction.SystemException; +import javax.transaction.UserTransaction; +import javax.transaction.xa.XAException; +import javax.transaction.xa.XAResource; +import javax.transaction.xa.Xid; + +import org.apache.jackrabbit.core.XASession; + +/** + * Internal {@link javax.transaction.UserTransaction} implementation. + */ +public class UserTransactionImpl implements UserTransaction { + + /** + * Global transaction id counter + */ + private static byte counter = 0; + + /** + * XAResource + */ + private final XAResource xares; + + /** + * Xid + */ + private Xid xid; + + /** + * Status + */ + private int status = Status.STATUS_NO_TRANSACTION; + + /** + * Create a new instance of this class. Takes a session as parameter. + * @param session session. If session is not of type + * {@link XASession}, an IllegalArgumentException + * is thrown + */ + public UserTransactionImpl(Session session) { + if (session instanceof XASession) { + xares = ((XASession) session).getXAResource(); + } else { + throw new IllegalArgumentException("Session not of type XASession"); + } + } + + /** + * @see javax.transaction.UserTransaction#begin + */ + public void begin() throws NotSupportedException, SystemException { + if (status != Status.STATUS_NO_TRANSACTION) { + throw new IllegalStateException("Transaction already active"); + } + + try { + xid = new XidImpl(counter++); + xares.start(xid, XAResource.TMNOFLAGS); + status = Status.STATUS_ACTIVE; + + } catch (XAException e) { + + throw new SystemException("Unable to begin transaction: " + + "XA_ERR=" + e.errorCode); + } + } + + /** + * @see javax.transaction.UserTransaction#commit + */ + public void commit() throws HeuristicMixedException, + HeuristicRollbackException, IllegalStateException, + RollbackException, SecurityException, SystemException { + + if (status != Status.STATUS_ACTIVE) { + throw new IllegalStateException("Transaction not active"); + } + + try { + xares.end(xid, XAResource.TMSUCCESS); + + status = Status.STATUS_PREPARING; + xares.prepare(xid); + status = Status.STATUS_PREPARED; + + status = Status.STATUS_COMMITTING; + xares.commit(xid, false); + status = Status.STATUS_COMMITTED; + + } catch (XAException e) { + + if (e.errorCode >= XAException.XA_RBBASE && + e.errorCode <= XAException.XA_RBEND) { + throw new RollbackException(); + } else { + throw new SystemException("Unable to commit transaction: " + + "XA_ERR=" + e.errorCode); + } + } + } + + /** + * @see javax.transaction.UserTransaction#getStatus + */ + public int getStatus() throws SystemException { + return status; + } + + /** + * @see javax.transaction.UserTransaction#rollback + */ + public void rollback() throws IllegalStateException, SecurityException, + SystemException { + + if (status != Status.STATUS_ACTIVE && + status != Status.STATUS_MARKED_ROLLBACK) { + + throw new IllegalStateException("Transaction not active"); + } + + try { + xares.end(xid, XAResource.TMFAIL); + + status = Status.STATUS_ROLLING_BACK; + xares.rollback(xid); + status = Status.STATUS_ROLLEDBACK; + + } catch (XAException e) { + + throw new SystemException("Unable to rollback transaction: " + + "XA_ERR=" + e.errorCode); + } + } + + /** + * @see javax.transaction.UserTransaction#setRollbackOnly() + */ + public void setRollbackOnly() throws IllegalStateException, SystemException { + if (status != Status.STATUS_ACTIVE) { + throw new IllegalStateException("Transaction not active"); + } + status = Status.STATUS_MARKED_ROLLBACK; + } + + /** + * @see javax.transaction.UserTransaction#setTransactionTimeout + */ + public void setTransactionTimeout(int seconds) throws SystemException {} + + + /** + * Internal {@link Xid} implementation. + */ + class XidImpl implements Xid { + + /** Global transaction id */ + private final byte[] globalTxId; + + /** + * Create a new instance of this class. Takes a global + * transaction number as parameter + * @param globalTxNumber global transaction number + */ + public XidImpl(byte globalTxNumber) { + this.globalTxId = new byte[] { globalTxNumber }; + } + + /** + * @see javax.transaction.xa.Xid#getFormatId() + */ + public int getFormatId() { + return 0; + } + + /** + * @see javax.transaction.xa.Xid#getBranchQualifier() + */ + public byte[] getBranchQualifier() { + return new byte[0]; + } + + /** + * @see javax.transaction.xa.Xid#getGlobalTransactionId() + */ + public byte[] getGlobalTransactionId() { + return globalTxId; + } + } +}