Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 15543 invoked from network); 12 Jul 2006 13:34:29 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 12 Jul 2006 13:34:29 -0000 Received: (qmail 25327 invoked by uid 500); 12 Jul 2006 13:34:27 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 25227 invoked by uid 500); 12 Jul 2006 13:34:27 -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 25145 invoked by uid 99); 12 Jul 2006 13:34:26 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Jul 2006 06:34:26 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 12 Jul 2006 06:34:19 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 8348D1A981A; Wed, 12 Jul 2006 06:33:59 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r421270 [1/23] - in /jackrabbit/trunk/contrib/spi: ./ commons/ commons/src/ commons/src/main/ commons/src/main/java/ commons/src/main/java/org/ commons/src/main/java/org/apache/ commons/src/main/java/org/apache/jackrabbit/ commons/src/main/... Date: Wed, 12 Jul 2006 13:33:27 -0000 To: commits@jackrabbit.apache.org From: angela@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060712133359.8348D1A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: angela Date: Wed Jul 12 06:33:19 2006 New Revision: 421270 URL: http://svn.apache.org/viewvc?rev=421270&view=rev Log: SPI Contribution Added: jackrabbit/trunk/contrib/spi/ (with props) jackrabbit/trunk/contrib/spi/FAQ.txt (with props) jackrabbit/trunk/contrib/spi/LICENSE.txt (with props) jackrabbit/trunk/contrib/spi/NOTICE.txt (with props) jackrabbit/trunk/contrib/spi/README.txt (with props) jackrabbit/trunk/contrib/spi/TODO.txt (with props) jackrabbit/trunk/contrib/spi/commons/ jackrabbit/trunk/contrib/spi/commons/maven.xml (with props) jackrabbit/trunk/contrib/spi/commons/project.properties (with props) jackrabbit/trunk/contrib/spi/commons/project.xml (with props) jackrabbit/trunk/contrib/spi/commons/src/ jackrabbit/trunk/contrib/spi/commons/src/main/ jackrabbit/trunk/contrib/spi/commons/src/main/java/ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystem.java (with props) jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemException.java (with props) jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemPathUtil.java (with props) jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemResource.java (with props) jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/RandomAccessOutputStream.java (with props) jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/value/ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/value/QValue.java (with props) jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/value/ValueFormat.java (with props) jackrabbit/trunk/contrib/spi/jcr-spi.ipr jackrabbit/trunk/contrib/spi/jcr2spi/ jackrabbit/trunk/contrib/spi/jcr2spi/maven.xml (with props) jackrabbit/trunk/contrib/spi/jcr2spi/project.properties (with props) jackrabbit/trunk/contrib/spi/jcr2spi/project.xml (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/CachingHierarchyManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/DefaultIdKeyMap.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/IdKeyMap.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemLifeCycleListener.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ItemManagerImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/LazyItemIterator.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ManagerProvider.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/PropertyImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/RepositoryImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionListener.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/XASession.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/XASessionImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ZombieHierarchyManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/config/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/config/RepositoryConfig.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/DefaultLockManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/lock/LockManagerImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/CachingNamespaceResolver.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/LocalNamespaceMappings.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/DefinitionValidator.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeType.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeTypeCache.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/EffectiveNodeTypeImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/InvalidConstraintException.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/InvalidNodeTypeDefException.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ItemDefinitionImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ItemDefinitionManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeDefinitionImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeConflictException.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistry.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistryImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeRegistryListener.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeStorage.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/PropertyDefinitionImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/ValueConstraint.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/EventFilter.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/EventImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/FilteredEventIterator.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/InternalEventListener.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AbstractCopy.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AbstractOperation.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AddLabel.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AddNode.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/AddProperty.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Checkin.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Checkout.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Clone.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Copy.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/LockOperation.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/LockRefresh.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/LockRelease.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Merge.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Move.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Operation.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/OperationVisitor.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Remove.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/RemoveLabel.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ReorderNodes.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ResolveMergeConflict.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Restore.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/SetMixin.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/SetPropertyValue.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Update.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/NodeIteratorImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryManagerImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/QueryResultImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/RowIteratorImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/query/ScoreNodeIterator.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/AccessManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/SecurityConstants.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/CachingItemStateManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChangeLog.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateException.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateListener.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateValidator.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NoSuchItemStateException.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeReferences.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeStateListener.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyState.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/StaleItemStateException.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateListener.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientItemStateManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/UpdatableItemStateManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/util/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/util/Dumpable.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/util/ReferenceChangeTracker.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/DefaultVersionManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionHistoryImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManager.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/version/VersionManagerImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/AbstractSAXEventGenerator.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/DocViewImportHandler.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/DocViewSAXEventGenerator.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/ImportHandler.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/Importer.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/ImporterImpl.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SysViewImportHandler.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SysViewSAXEventGenerator.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/TargetImportHandler.java (with props) jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/WorkspaceContentHandler.java (with props) jackrabbit/trunk/contrib/spi/maven.xml (with props) jackrabbit/trunk/contrib/spi/project.properties (with props) jackrabbit/trunk/contrib/spi/project.xml (with props) jackrabbit/trunk/contrib/spi/spi/ jackrabbit/trunk/contrib/spi/spi/maven.xml (with props) jackrabbit/trunk/contrib/spi/spi/project.properties (with props) jackrabbit/trunk/contrib/spi/spi/project.xml (with props) jackrabbit/trunk/contrib/spi/spi/src/ jackrabbit/trunk/contrib/spi/spi/src/main/ jackrabbit/trunk/contrib/spi/spi/src/main/java/ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/Batch.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/Event.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/EventIterator.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/EventListener.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/IdIterator.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/ItemId.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/ItemInfo.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/LockInfo.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/NodeId.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/NodeInfo.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/PropertyId.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/PropertyInfo.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/QItemDefinition.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/QNodeDefinition.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/QNodeTypeDefinition.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/QNodeTypeDefinitionIterator.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/QPropertyDefinition.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/QueryInfo.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/SessionInfo.java (with props) jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/XASessionInfo.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/ (with props) jackrabbit/trunk/contrib/spi/spi2dav/maven.xml (with props) jackrabbit/trunk/contrib/spi/spi2dav/project.properties (with props) jackrabbit/trunk/contrib/spi/spi2dav/project.xml (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/ jackrabbit/trunk/contrib/spi/spi2dav/src/main/ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventIteratorImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ExceptionConverter.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdFactoryImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ItemInfoImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IteratorHelper.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/LockInfoImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/NodeInfoImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/PropertyInfoImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QItemDefinitionImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QNodeDefinitionImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QNodeTypeDefinitionImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QPropertyDefinitionImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/QueryInfoImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/SessionInfoImpl.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolver.java (with props) jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ValueFactoryImpl.java (with props) Propchange: jackrabbit/trunk/contrib/spi/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Wed Jul 12 06:33:19 2006 @@ -0,0 +1,6 @@ +target +*.log +*.iws +*.ipr +*.iml +junit*.properties Added: jackrabbit/trunk/contrib/spi/FAQ.txt URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/FAQ.txt?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/FAQ.txt (added) +++ jackrabbit/trunk/contrib/spi/FAQ.txt Wed Jul 12 06:33:19 2006 @@ -0,0 +1,94 @@ +=============================================================================== +Apache Jackrabbit SPI - FAQ +=============================================================================== + +Q: why defining a SPI? +A: see README.txt + + +Q: why doesn't it work? +A: please note the the SPI contribution is still in an early stage and work + in progress. interfaces and implementations are still matter to change + and up to now almost no tests have been performed. + As soon as the SPI is more or less stable the normal JCR test suite can + be used to assert JSR 170 compliance. + + +Q: Is there a working plan for the SPI? +A: No. we work in this as time permits. + + +Q: Is there any schedule for the SPI project? +A: No. See above. + + +Q: What is the difference between JCR API and the SPI? They look similar. +A: The SPI is basically a low level API that covers all the functionality + provided by the existing JCR API but does not require implementing + the transient layer of the JCR stack. + + +Q: What is the status of the SPI project? +A: The SPI is still in an early draft version. The next step would be to + complete the prototype (jcr2spi) in order test the feasibility of the SPI. + + +Q: Can the SPI be addressed directly by clients? And what would this mean for + the current SPI api? +A: Up to now, we considered, that clients should use the JSR 170 API and should + not operate on the SPI directly. + + +Q: why does the core project not use the SPI? +A: The jackrabbit core project represents the reference implementation of + JSR 170. Introducing an SPI is a recent approach that hopefully allows to + provide a JCR client covering the transient layer only. See also the + README.txt for some rationals regarding defining a SPI. + + +Q: why does the SPI subproject have a dependency to jackrabbit commons? +A: see next Q. + + +Q: why do the SPI interfaces used a final QName/Path class instead of defining + interfaces? +A: this has been matter of long discussions. + originally no QName/Path classes were present in the SPI. instead they were + represented by Strings. + In a second step we introduced QName and QPath interfaces to the SPI + and added the implementation to our own 'commons' project. + While preparing the existing efforts for a checkin into jackrabbit, we + decided, that there should be only one commons project within Jackrabbit. + therefore we removed the interfaces again from the SPI project, since it would + not be possible to have jackrabbit code depend on a contribution. + -> we will probably address this issue again. + + +Q: jcr2spi looks like jackrabbit/core code. why are all the classes copied? +A: originally we planned to use jackrabbit/core for the jcr2spi implementation. + however, we realized that its not feasible to plug different implementations + of the crucial interfaces in the core. Therefore we decided to copy over + the code and modify it according to the needs of the SPI. + we tried to keep track of modifications by adding a lot of //DIFF comments, + indication areas, where the original jackrabbit code has been modified. + + +Some questions arising from issues still being discussed: + +Q: Why does the RepositoryService does not provide methods batch reads? +Q: Is there need for special handling of very large values in SPI? +Q: Should the SPI define a XASessionInfo or should the transaction handling + be left out from the interfaces? +Q: Should credentials, workspaceName and all kind of tokens be passed to every + RepositoryService call instead of having a SessionInfo? + (currently we don't thinks so. we had that in the beginning). +Q: RepositoryService.executeQuery(): should it take an offset? +Q: QueryInfo: should it take a flag rating the results? +Q: QueryInfo: should it rather return NodeInfos instead of Ids? + + + + + + + Propchange: jackrabbit/trunk/contrib/spi/FAQ.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/FAQ.txt ------------------------------------------------------------------------------ svn:keywords = author date id revision Added: jackrabbit/trunk/contrib/spi/LICENSE.txt URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/LICENSE.txt?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/LICENSE.txt (added) +++ jackrabbit/trunk/contrib/spi/LICENSE.txt Wed Jul 12 06:33:19 2006 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. Propchange: jackrabbit/trunk/contrib/spi/LICENSE.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/LICENSE.txt ------------------------------------------------------------------------------ svn:keywords = author date id revision Added: jackrabbit/trunk/contrib/spi/NOTICE.txt URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/NOTICE.txt?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/NOTICE.txt (added) +++ jackrabbit/trunk/contrib/spi/NOTICE.txt Wed Jul 12 06:33:19 2006 @@ -0,0 +1,8 @@ +Apache Jackrabbit +Copyright 2006 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Based on source code originally developed by +Day Software (http://www.day.com/). Propchange: jackrabbit/trunk/contrib/spi/NOTICE.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/NOTICE.txt ------------------------------------------------------------------------------ svn:keywords = author date id revision Added: jackrabbit/trunk/contrib/spi/README.txt URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/README.txt?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/README.txt (added) +++ jackrabbit/trunk/contrib/spi/README.txt Wed Jul 12 06:33:19 2006 @@ -0,0 +1,110 @@ +=============================================================================== +Welcome to Apache Jackrabbit - SPI +=============================================================================== + +License (see also LICENSE.txt) +=============================================================================== + +Collective work: Copyright 2006 The Apache Software Foundation. + +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. + + + +Introduction +=============================================================================== + +This contribution within the Jackrabbit project contains a Service Provider +Interface (SPI) and an example implementation: + +- JCR2SPI : implementation of the JSR170 API covering the transient layer + +- SPI2DAV : SPI implementation on top of WebDAV currently connecting to + a Jackrabbit Jcr-Server. + +This means that the current environment contains the following layers + + JCR -> SPI -> WebDAV -> JCR + +In a next step the JCR layer at the end of the chain will be replaced +by another SPI implementation, avoiding the extra costs caused by +having JCR (including transient space and Session management) again: + + JCR -> SPI -> WebDAV -> SPI (WebDAV only being an example). + + + +Aim of the SPI +=============================================================================== + +The goal of JSR-170 was to specify an API that is easy to use and intuitive +for a java "application" developer. This means that the API is designed to +cover the needs of the "consumer" of the API. +Having an additional SPI layer would allow to cover network protocol mappings +in an abstract manner and also lower the bar for a JCR implementation. + +The SPI is layered underneith the transient space, and is not designed +to be used by the application programmer directly. +Instead it is implemented by a "repository server" (still missing) and used +by a "repository client" (JCR2SPI) which exposes the JCR API to the +application programmer. + +The original design goal was to define a mostly flat, non-"object oriented" +API. The reasons for this are: + +(1) Defined support of a client/server architecture +A flat SPI-API lends itself to protocol mappings to protocols +like WebDAV, SOAP or others in a straightforward yet meaningful way. +An SPI allows that a repository client and a repository server +can interact without explicitely specifying protocol mappings. + +(2) Implementation Support +Drawing the boundaries between the repository client and the +repository server allows repository implementation to implement +only the "server" portion and leverage existing generic +(opensource) clients for things like the "transient space" etc. +This should ease the implementation of the JSR-170 api. + + + +Requirements +=============================================================================== + +This project assumes that you have already successfully compiled and +installed the Jackrabbit commons module as well as the Jackrabbit +Jcr-Server into your maven repository. If this is not the case: + +> cd ../../jackrabbit/modules/commons +> maven jar:install + +> cd ../../../jcr-server +> maven + +> cd ../contrib/spi +> maven + + + +Limitations +=============================================================================== + +The SPI contribution is still under development and not yet tested. +This applies to the API as well as to the implementations. + + + + + Propchange: jackrabbit/trunk/contrib/spi/README.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/README.txt ------------------------------------------------------------------------------ svn:keywords = author date id revision Added: jackrabbit/trunk/contrib/spi/TODO.txt URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/TODO.txt?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/TODO.txt (added) +++ jackrabbit/trunk/contrib/spi/TODO.txt Wed Jul 12 06:33:19 2006 @@ -0,0 +1,142 @@ +=============================================================================== +Apache Jackrabbit SPI - TODOs +=============================================================================== + +NOTE: This list only contains major open issues. + Minor known issues and problems are marked throughout the code with TODO. + + +1) RepositoryService (missing) + + missing implementation for: + > Clone + > RegisterNodeType + > ReregisterNodeTypes + > UnregisterNodeType + > Subscribe/Unsubscribe und Event retrieval + + +2) RepositoryService, Batch (improve) + + > check consistency of throw clauses. + + +3) Usage of SPI ids instead of JR-ids in jcr2spi (missing) + + a) using SPI NodeIds which don't have a mandatory UUID, requires fundamental + rework of the transient space (modified after jackrabbit code). + this mainly affects the following methods: + > remove + > move + > reorder + > refresh + + see 10) AccessManager + + b) all maps and caches using ItemId as key must be refactored in order + to account for the differences between SPI id and Jackrabbit/core-Ids. + This affects the following classes: + + > ItemManagerImpl + > LockManagerImpl + > ChangeLog + + c) all references to the root id + + > WorkspaceManager + > SessionItemStateManager + > HierarchyManagerImpl + + + Currently the original maps where replaced by a non-functional IdKeyMap, + in order to easily detect this issue within the jcr2spi project. + In addition the code has been marked with // TODO: TO-BE-FIXED comments. + + +5) Locking: SessionScoped locks (missing) + + Up to now, the SPI does not provide the possibility to transport the lock + scope. We would argue, that the 'server' does not have to care about the + scope of a lock. + + Therefore Lock.isSessionScoped does not return the proper value unless the + Session is the lock holder. + + If the scope flag is included in RepositoryService.lock the following steps + are required: + + > RS.lock -> additional param + > RSImpl.lock + iss=fales -> scope = Scope.EXCLUSIVE + iss=true -> ItemResourceConstants.EXLUSIVE_SESSION + > LockInfo -> additional method + > LockInfoImpl -> retrieve scope from lockDiscovery + > LockImpl -> mod. constructor (no iss flag) + -> retrive isSessionScoped flag from the lockInfo + -> remove todo bei getLock() methode, der + zur zeit 'iss' auf false setzt. + + +6) Locking: Handling of LockTokens (problem) + + There are 2 methods in JSR 170 that deal with handling of LockTokens: + Session.addLockToken, Session.removeLockToken. The spec defines, that + + a) session-scoped locks may not be transfered to another session + b) only one Session object must be lock holder. adding a token that is + still present with another session is not possible. + + This causes the following issues with the SPI + + a) session-scoped locks are currently not implemented properly (see 5) + b) no session info is transfered over the SPI boundary nor are the addLT/ + removeLT methods passed over the SPI. + consequently its (with the current design) not possible to detect, whether + the given locktoken is still hold by another Session object. + + +7) Observation (missing) + + - RepositoryService: return value (events) von RS-calls + - RepositoryService: subscription/event-discovery completely missing + + - EventImpl: with the current setup spi2dav connects to a default + jackrabbit jcr-server reflecting JCR calls. consequently event discovery + will only return JCR events. + Additional information defined by the SPI Event interface cannot be + retrieved from the information sent by jcr-server. + + +8) AddNode (problem) + + In order to be able to return the created Node, it would be required to + now its Id if the operation succeeded, since the Node name passed to the + call may not identify the new Node in case of same-name-siblings. + + +9) Merge (problem) + + similar to 8) + The call defines a NodeIterator as return value. + + +10) AccessManager (improve) + + isGranted(NodeId, QPath, String[]) is redundant, since SPI to non-existing + Items can be created from the parent Id and a relative path pointing to the + Item to be checked. + + -> remove method and replaces usage. + + +11) Transactions (work in progress) + + Definition of XASessionInfo must be reviewed. + + + + + + + + Propchange: jackrabbit/trunk/contrib/spi/TODO.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/TODO.txt ------------------------------------------------------------------------------ svn:keywords = author date id revision Added: jackrabbit/trunk/contrib/spi/commons/maven.xml URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/commons/maven.xml?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/commons/maven.xml (added) +++ jackrabbit/trunk/contrib/spi/commons/maven.xml Wed Jul 12 06:33:19 2006 @@ -0,0 +1,27 @@ + + + + + + + + Propchange: jackrabbit/trunk/contrib/spi/commons/maven.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: jackrabbit/trunk/contrib/spi/commons/project.properties URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/commons/project.properties?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/commons/project.properties (added) +++ jackrabbit/trunk/contrib/spi/commons/project.properties Wed Jul 12 06:33:19 2006 @@ -0,0 +1,2 @@ +maven.javadoc.links=http://java.sun.com/j2se/1.4.2/docs/api/,http://www.day.com/maven/jsr170/javadocs/jcr-0.16.1-pfd/ +maven.repo.remote = http://www.ibiblio.org/maven/,http://www.day.com/maven/ Propchange: jackrabbit/trunk/contrib/spi/commons/project.properties ------------------------------------------------------------------------------ svn = Propchange: jackrabbit/trunk/contrib/spi/commons/project.properties ------------------------------------------------------------------------------ svn:eol-style = native Added: jackrabbit/trunk/contrib/spi/commons/project.xml URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/commons/project.xml?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/commons/project.xml (added) +++ jackrabbit/trunk/contrib/spi/commons/project.xml Wed Jul 12 06:33:19 2006 @@ -0,0 +1,70 @@ + + + + + + + ${basedir}/../project.xml + jackrabbit-spi-commons + Jackrabbit SPI Commons + Extensions to the Jackrabbit commons package. + org.apache.jackrabbit.* + + + + + + + + org.apache.jackrabbit + jackrabbit-jcr-commons + ${jackrabbit.build.version.jackrabbit} + + + + jsr170 + jcr + ${jackrabbit.build.version.jcr} + http://jcp.org/en/jsr/detail?id=170 + + + + + + + + ${basedir}/src/main/java + src/test/java + + + **/*Test.java + + + + + src/main/java + + **/*.xml + **/*.xsd + **/*.properties + **/*.dtd + + + + + Propchange: jackrabbit/trunk/contrib/spi/commons/project.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystem.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystem.java?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystem.java (added) +++ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystem.java Wed Jul 12 06:33:19 2006 @@ -0,0 +1,247 @@ +/* + * 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.fs; + +import java.io.InputStream; +import java.io.OutputStream; + +/** + * The FileSystem interface is an abstraction of a virtual + * file system. The similarities of its method names with with the methods + * of the java.io.File class are intentional. + *
+ * Implementations of this interface expose a file system-like resource. + * File system-like resources include WebDAV-enabled servers, local file systems, + * and so forth. + */ +public interface FileSystem { + + /** + * File separator + */ + String SEPARATOR = "/"; + + /** + * File separator character + */ + char SEPARATOR_CHAR = '/'; + + /** + * Initialize the file system + * + * @throws FileSystemException if the file system initialization fails + */ + void init() throws FileSystemException; + + /** + * Close the file system. After calling this method, the file system is no + * longer accessible. + * + * @throws FileSystemException + */ + void close() throws FileSystemException; + + /** + * Returns an input stream of the contents of the file denoted by this path. + * + * @param filePath the path of the file. + * @return an input stream of the contents of the file. + * @throws FileSystemException if the file does not exist + * or if it cannot be read from + */ + InputStream getInputStream(String filePath) throws FileSystemException; + + /** + * Returns an output stream for writing bytes to the file denoted by this path. + * The file will be created if it doesn't exist. If the file exists, its contents + * will be overwritten. + * + * @param filePath the path of the file. + * @return an output stream for writing bytes to the file. + * @throws FileSystemException if the file cannot be written to or created + */ + OutputStream getOutputStream(String filePath) throws FileSystemException; + + /** + * Returns an output stream for writing bytes to the file denoted by this path. + * The file will be created if it doesn't exist. The current position of the + * file pointer is set to 0. See also + * {@link RandomAccessOutputStream#seek(long)}; + * + * @param filePath the path of the file. + * @return an random access output stream for writing bytes to the file. + * @throws FileSystemException if the file could not be created or + * if the output stream cannot be obtained. + * @throws UnsupportedOperationException if the implementation does + * not support file access through a + * {@link RandomAccessOutputStream}. + */ + RandomAccessOutputStream getRandomAccessOutputStream(String filePath) + throws FileSystemException, UnsupportedOperationException; + + /** + * Creates the folder named by this path, including any necessary but + * nonexistent parent folders. Note that if this operation fails it + * may have succeeded in creating some of the necessary parent folders. + * + * @param folderPath the path of the folder to be created. + * @throws FileSystemException if a file system entry denoted by path + * already exists or if another error occurs. + */ + void createFolder(String folderPath) throws FileSystemException; + + /** + * Tests whether the file system entry denoted by this path exists. + * + * @param path the path of a file system entry. + * @return true if the file system entry at path is a file; false otherwise. + * @throws FileSystemException + */ + boolean exists(String path) throws FileSystemException; + + /** + * Tests whether the file system entry denoted by this path is a file. + * + * @param path the path of a file system entry. + * @return true if the file system entry at path is a file; false otherwise. + * @throws FileSystemException + */ + boolean isFile(String path) throws FileSystemException; + + /** + * Tests whether the file system entry denoted by this path is a folder. + * + * @param path the path of a file system entry. + * @return true if the file system entry at path is a folder; false otherwise. + * @throws FileSystemException + */ + boolean isFolder(String path) throws FileSystemException; + + /** + * Tests whether the file system entry denoted by this path has child entries. + * + * @param path the path of a file system entry. + * @return true if the file system entry at path has child entries; false otherwise. + * @throws FileSystemException + */ + boolean hasChildren(String path) throws FileSystemException; + + /** + * Returns the length of the file denoted by this path. + * + * @param filePath the path of the file. + * @return The length, in bytes, of the file denoted by this path, + * or -1L if the length can't be determined. + * @throws FileSystemException if the path does not denote an existing file. + */ + long length(String filePath) throws FileSystemException; + + /** + * Returns the time that the file system entry denoted by this path + * was last modified. + * + * @param path the path of a file system entry. + * @return A long value representing the time the file system entry was + * last modified, measured in milliseconds since the epoch + * (00:00:00 GMT, January 1, 1970), or 0L if the modification + * time can't be determined. + * @throws FileSystemException if the file system entry does not exist. + */ + long lastModified(String path) throws FileSystemException; + + /** + * Set the modified time of an existing file to now. + * + * @param filePath the path of the file. + * @throws FileSystemException if the path does not denote an existing file. + */ + void touch(String filePath) throws FileSystemException; + + /** + * Returns an array of strings naming the files and folders + * in the folder denoted by this path. + * + * @param folderPath the path of the folder whose contents is to be listed. + * @return an array of strings naming the files and folders + * in the folder denoted by this path. + * @throws FileSystemException if this path does not denote a folder or if + * another error occurs. + */ + String[] list(String folderPath) throws FileSystemException; + + /** + * Returns an array of strings naming the files in the folder + * denoted by this path. + * + * @param folderPath the path of the folder whose contents is to be listed. + * @return an array of strings naming the files in the folder + * denoted by this path. + * @throws FileSystemException if this path does not denote a folder or if + * another error occurs. + */ + String[] listFiles(String folderPath) throws FileSystemException; + + /** + * Returns an array of strings naming the folders in the folder + * denoted by this path. + * + * @param folderPath the path of the folder whose contents is to be listed. + * @return an array of strings naming the folders in the folder + * denoted by this path. + * @throws FileSystemException if this path does not denote a folder or if + * another error occurs. + */ + String[] listFolders(String folderPath) throws FileSystemException; + + /** + * Deletes the file denoted by this path. + * + * @param filePath the path of the file to be deleted. + * @throws FileSystemException if this path does not denote a file or if + * another error occurs. + */ + void deleteFile(String filePath) throws FileSystemException; + + /** + * Deletes the folder denoted by this path. Any contents of this folder + * (folders and files) will be deleted recursively. + * + * @param folderPath the path of the folder to be deleted. + * @throws FileSystemException if this path does not denote a folder or if + * another error occurs. + */ + void deleteFolder(String folderPath) throws FileSystemException; + + /** + * Moves a file or folder to a new location. + * + * @param srcPath the path of the file or folder to be moved. + * @param destPath the destination path to which the file or folder is to be moved. + * @throws FileSystemException if the move fails + */ + void move(String srcPath, String destPath) throws FileSystemException; + + /** + * Copies a file or folder to a new location. + * + * @param srcPath the path of the file or folder to be copied. + * @param destPath the destination path to which the file or folder is to be copied. + * @throws FileSystemException if the copy fails + */ + void copy(String srcPath, String destPath) throws FileSystemException; + +} Propchange: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystem.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystem.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemException.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemException.java?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemException.java (added) +++ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemException.java Wed Jul 12 06:33:19 2006 @@ -0,0 +1,51 @@ +/* + * 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.fs; + +import org.apache.jackrabbit.BaseException; + +/** + * The FileSystemException signals an error within a file system + * operation. FileSystemExceptions are thrown by {@link FileSystem} + * implementations. + */ +public class FileSystemException extends BaseException { + + /** + * Constructs a new instance of this class with the specified detail + * message. + * + * @param message the detail message. The detail message is saved for + * later retrieval by the {@link #getMessage()} method. + */ + public FileSystemException(String message) { + super(message); + } + + /** + * Constructs a new instance of this class with the specified detail + * message and root cause. + * + * @param message the detail message. The detail message is saved for + * later retrieval by the {@link #getMessage()} method. + * @param rootCause root failure cause + */ + public FileSystemException(String message, Throwable rootCause) { + super(message, rootCause); + } + +} Propchange: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemException.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemException.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemPathUtil.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemPathUtil.java?rev=421270&view=auto ============================================================================== --- jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemPathUtil.java (added) +++ jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemPathUtil.java Wed Jul 12 06:33:19 2006 @@ -0,0 +1,226 @@ +/* + * 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.fs; + +import java.io.ByteArrayOutputStream; +import java.util.BitSet; + +/** + * Utility class for handling paths in a file system. + */ +public final class FileSystemPathUtil { + + /** + * Array of lowercase hexadecimal characters used in creating hex escapes. + */ + private static final char[] HEX_TABLE = "0123456789abcdef".toCharArray(); + + /** + * The escape character used to mark hex escape sequences. + */ + private static final char ESCAPE_CHAR = '%'; + + /** + * The list of characters that are not encoded by the escapeName(String) + * and unescape(String) methods. They contains the characters + * which can safely be used in file names: + */ + public static final BitSet SAFE_NAMECHARS; + + /** + * The list of characters that are not encoded by the escapePath(String) + * and unescape(String) methods. They contains the characters + * which can safely be used in file paths: + */ + public static final BitSet SAFE_PATHCHARS; + + static { + // build list of valid name characters + SAFE_NAMECHARS = new BitSet(256); + int i; + for (i = 'a'; i <= 'z'; i++) { + SAFE_NAMECHARS.set(i); + } + for (i = 'A'; i <= 'Z'; i++) { + SAFE_NAMECHARS.set(i); + } + for (i = '0'; i <= '9'; i++) { + SAFE_NAMECHARS.set(i); + } + SAFE_NAMECHARS.set('-'); + SAFE_NAMECHARS.set('_'); + SAFE_NAMECHARS.set('.'); + + // build list of valid path characters (inlcudes name characters) + SAFE_PATHCHARS = (BitSet) SAFE_NAMECHARS.clone(); + SAFE_PATHCHARS.set(FileSystem.SEPARATOR_CHAR); + } + + /** + * private constructor + */ + private FileSystemPathUtil() { + } + + /** + * Escapes the given string using URL encoding for all bytes not included + * in the given set of safe characters. + * + * @param s the string to escape + * @param safeChars set of safe characters (bytes) + * @return escaped string + */ + private static String escape(String s, BitSet safeChars) { + byte[] bytes = s.getBytes(); + StringBuffer out = new StringBuffer(bytes.length); + for (int i = 0; i < bytes.length; i++) { + int c = bytes[i] & 0xff; + if (safeChars.get(c) && c != ESCAPE_CHAR) { + out.append((char) c); + } else { + out.append(ESCAPE_CHAR); + out.append(HEX_TABLE[(c >> 4) & 0x0f]); + out.append(HEX_TABLE[(c) & 0x0f]); + } + } + return out.toString(); + } + + /** + * Encodes the specified path. Same as + * {@link #escapeName(String)} except that the separator + * character / is regarded as a legal path character + * that needs no escaping. + * + * @param path the path to encode. + * @return the escaped path + */ + public static String escapePath(String path) { + return escape(path, SAFE_PATHCHARS); + } + + /** + * Encodes the specified name. Same as + * {@link #escapePath(String)} except that the separator character + * / is regarded as an illegal character that needs + * escaping. + * + * @param name the name to encode. + * @return the escaped name + */ + public static String escapeName(String name) { + return escape(name, SAFE_NAMECHARS); + } + + /** + * Decodes the specified path/name. + * + * @param pathOrName the escaped path/name + * @return the unescaped path/name + */ + public static String unescape(String pathOrName) { + ByteArrayOutputStream out = new ByteArrayOutputStream(pathOrName.length()); + for (int i = 0; i < pathOrName.length(); i++) { + char c = pathOrName.charAt(i); + if (c == ESCAPE_CHAR) { + try { + out.write(Integer.parseInt(pathOrName.substring(i + 1, i + 3), 16)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + i += 2; + } else { + out.write(c); + } + } + return new String(out.toByteArray()); + } + + /** + * Tests whether the specified path represents the root path, i.e. "/". + * + * @param path path to test + * @return true if the specified path represents the root path; false otherwise. + */ + public static boolean denotesRoot(String path) { + return path.equals(FileSystem.SEPARATOR); + } + + /** + * Checks if path is a valid path. + * + * @param path the path to be checked + * @throws FileSystemException If path is not a valid path + */ + public static void checkFormat(String path) throws FileSystemException { + if (path == null) { + throw new FileSystemException("null path"); + } + + // path must be absolute, i.e. starting with '/' + if (!path.startsWith(FileSystem.SEPARATOR)) { + throw new FileSystemException("not an absolute path: " + path); + } + + // trailing '/' is not allowed (except for root path) + if (path.endsWith(FileSystem.SEPARATOR) && path.length() > 1) { + throw new FileSystemException("malformed path: " + path); + } + + String[] names = path.split(FileSystem.SEPARATOR); + for (int i = 1; i < names.length; i++) { + // name must not be empty + if (names[i].length() == 0) { + throw new FileSystemException("empty name: " + path); + } + // leading/trailing whitespace is not allowed + String trimmed = names[i].trim(); + if (!trimmed.equals(names[i])) { + throw new FileSystemException("illegal leading or trailing whitespace in name: " + path); + } + } + } + + /** + * Returns the parent directory of the specified path. + * + * @param path a file system path denoting a directory or a file. + * @return the parent directory. + */ + public static String getParentDir(String path) { + int pos = path.lastIndexOf(FileSystem.SEPARATOR_CHAR); + if (pos > 0) { + return path.substring(0, pos); + } + return FileSystem.SEPARATOR; + } + + /** + * Returns the name of the specified path. + * + * @param path a file system path denoting a directory or a file. + * @return the name. + */ + public static String getName(String path) { + int pos = path.lastIndexOf(FileSystem.SEPARATOR_CHAR); + if (pos != -1) { + return path.substring(pos + 1); + } + return path; + } + +} Propchange: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemPathUtil.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/trunk/contrib/spi/commons/src/main/java/org/apache/jackrabbit/fs/FileSystemPathUtil.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url