You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2005/07/03 13:58:39 UTC

svn commit: r208906 [5/5] - in /incubator/jackrabbit/trunk/contrib/phpcr: ./ PHPCR/ PHPCR/lock/ PHPCR/nodetype/ PHPCR/observation/ PHPCR/query/ PHPCR/util/ PHPCR/version/

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/observation/ObservationManager.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/observation/ObservationManager.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/observation/ObservationManager.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/observation/ObservationManager.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,110 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/RepositoryException.php';
+require_once 'PHPCR/observation/EventListener.php';
+require_once 'PHPCR/observation/EventListenerIterator.php';
+
+
+/**
+ * The ObservationManager object.
+ * <p>
+ * Allows for the registration and deregistration of event listeners.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage observation
+ */
+interface ObservationManager
+{
+    /**
+     * Adds an event listener that listens for the specified <code>eventTypes</code> (a combination of one or more
+     * event types encoded as a bit mask value).
+     * <p>
+     * The set of events can be filtered by specifying restrictions based on characteristics of the node associated
+     * with the event. In the case of  event types <code>NODE_ADDED</code> and <code>NODE_REMOVED</code>, the node
+     * associated with an event is the node at (or formerly at) the path returned by <code>Event.getPath</code>.
+     * In the case of  event types <code>PROPERTY_ADDED</code>,  <code>PROPERTY_REMOVED</code> and
+     * <code>PROPERTY_CHANGED</code>, the node associated with an event is the parent node of the property at
+     * (or formerly at) the path returned by <code>Event.getPath</code>:
+     * <ul>
+     *   <li>
+     *     <code>absPath</code>, <code>isDeep</code>: Only events whose associated node is at
+     *     <code>absPath</code> (or within its subtree, if <code>isDeep</code> is <code>true</code>) will be received.
+     *     It is permissible to register a listener for a path where no node currently exists.
+     *   </li>
+     *   <li>
+     *     <code>uuid</code>: Only events whose associated node has one of the UUIDs in this list will be
+     *     received. If his parameter is <code>null</code> then no UUID-related restriction is placed on events
+     *     received.
+     *   </li>
+     *   <li>
+     *     <code>nodeTypeName</code>: Only events whose associated node has one of the node types
+     *     (or a subtype of one of the node types) in this list will be received. If his parameter is
+     *     <code>null</code> then no node type-related restriction is placed on events received.
+     *   </li>
+     * </ul>
+     * The restrictions are "ANDed" together. In other words, for a particular node to be "listened to" it must meet all the restrictions.
+     * <p>
+     * Additionally, if <code>noLocal</code> is <code>true</code>, then events generated by the session through which
+     * the listener was registered are ignored. Otherwise, they are not ignored.
+     * <p>
+     * The filters of an already-registered <code>EventListener</code> can be changed at runtime by re-registering the
+     * same <code>EventListener</code> object (i.e. the same actual Java object) with a new set of filter arguments.
+     * The implementation must ensure that no events are lost during the changeover.
+     *
+     * @param listener an {@link EventListener} object.
+     * @param eventTypes A combination of one or more event type constants encoded as a bitmask.
+     * @param absPath an absolute path.
+     * @param isDeep a <code>boolean</code>.
+     * @param uuid array of UUIDs.
+     * @param nodeTypeName array of node type names.
+     * @param noLocal a <code>boolean</code>.
+     * @throws RepositoryException If an error occurs.
+     */
+    public function addEventListener( EventListener $listener, $eventTypes, $absPath, $isDeep, $uuid, $nodeTypeName, $noLocal );
+
+    /**
+     * Deregisters an event listener.
+     * <p>
+     * A listener may be deregistered while it is being executed. The
+     * deregistration method will block until the listener has completed
+     * executing. An exception to this rule is a listener which deregisters
+     * itself from within the <code>onEvent</code> method. In this case, the
+     * deregistration method returns immediately, but deregistration will
+     * effectively be delayed until the listener completes.
+     *
+     * @param listener The listener to deregister.
+     *
+     * @throws RepositoryException If an error occurs.
+     */
+    public function removeEventListener( EventListener $listener );
+
+    /**
+     * Returns all event listeners that have been registered through this session.
+     * If no listeners have been registered, an empty iterator is returned.
+     *
+     * @return an <code>EventListenerIterator</code>.
+     * @throws RepositoryException
+     */
+    public function getRegisteredEventListeners();
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/InvalidQueryException.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/InvalidQueryException.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/InvalidQueryException.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/InvalidQueryException.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/RepositoryException.php';
+
+
+/**
+ * Thrown by methods of <code>Query</code>.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage query
+ */
+class InvalidQueryException extends RepositoryException
+{
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/Query.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/Query.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/Query.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/Query.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,157 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/ItemExistsException.php';
+require_once 'PHPCR/PathNotFoundException.php';
+require_once 'PHPCR/RepositoryException.php';
+require_once 'PHPCR/nodetype/ConstraintViolationException.php';
+require_once 'PHPCR/lock/LockException.php';
+
+
+/**
+ * A <code>Query</code> object.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage query
+ */
+interface Query
+{
+    /**
+     * A String constant representing the XPath query language applied to the <i>document view</i>
+     * XML mapping of the workspace.
+     * <p/>
+     * This language must be supported in level 1 repositories.
+     * <p/>
+     * Used when defining a query using {@link QueryManager#createQuery}.
+     * Also among the strings returned by {@link QueryManager#getSupportedQueryLanguages}.
+     */
+    const XPATH = "xpath";
+
+    /**
+     * A String constant representing the SQL query language applied to the <i>database view</i>
+     * of the workspace.
+     * <p/>
+     * This language is optional.
+     * <p/>
+     * Used when defining a query using {@link QueryManager#createQuery}.
+     * Also among the strings returned by {@link QueryManager#getSupportedQueryLanguages}.
+     */
+    const SQL = "sql";
+
+
+    /**
+     * Executes this query and returns a <code>{@link QueryResult}</code>.
+     *
+     * @return a <code>QueryResult</code>
+     * @throws RepositoryException if an error occurs
+     */
+    public function execute();
+
+    /**
+     * Returns the statement set for this query. Returns <code>null</code>
+     * if no statement is currently set.
+     *
+     * @return the query statement.
+     */
+    public function getStatement();
+
+    /**
+     * Returns the language set for this query. This will be one of the
+     * QueryLanguage constants returned by
+     * QueryManager.getSupportedQueryLanguages(). If the query was created
+     * using a mechanism outside the specification, this method may return 0.
+     *
+     * @return the query language.
+     */
+    public function getLanguage();
+
+    /**
+     * If this is a Query object that has been stored using
+     * <code>storeAsNode($string)</code> (regardless of whether it has
+     * been saved yet) or retrieved using
+     * <code>QueryManager.getQuery($node)</code>), then this method returns
+     * the path of the <code>nt:query</code> node that stores the query. If
+     * this is a transient query (that is, a <code>Query</code> object created
+     * with <code>QueryManager.createQuery($string, $string)</code> but not
+     * yet stored) then this method throws an ItemNotFoundException.
+     *
+     * @return path of persisted node representing this query in content.
+     */
+    public function getStoredQueryPath();
+
+    /**
+     * Creates a node representing this Query in content.
+     *
+     * In a level 1 repository this method throws an
+     * UnsupportedRepositoryOperationException.
+     *
+     * In a level 2 repository it creates a node of type nt:query at absPath
+     * and returns that node.
+     *
+     * In order to persist the newly created node, a save must be performed
+     * that includes the parent of this new node within its scope. In other
+     * words, either a Session.save or an Item.save on the parent or
+     * higher-degree ancestor of absPath must be performed.
+     *
+     * An ItemExistsException will be thrown either immediately (by this
+     * method), or on save, if an item at the specified path already exists
+     * and same-name siblings are not allowed. Implementations may differ
+     * on when this validation is performed.
+     *
+     * A PathNotFoundException will be thrown either immediately , or on
+     * save, if the specified path implies intermediary nodes that do not
+     * exist. Implementations may differ on when this validation is performed.
+     *
+     * A ConstraintViolationExceptionwill be thrown either immediately or
+     * on save, if adding the node would violate a node type or
+     * implementation-specific constraintor if an attempt is made to add
+     * a node as the child of a property. Implementations may differ on when
+     * this validation is performed.
+     *
+     * A VersionException will be thrown either immediately (by this method),
+     * or on save, if the node to which the new child is being added is
+     * versionable and checked-in or is non-versionable but its nearest
+     * versionable ancestor is checked-in. Implementations may differ on when
+     * this validation is performed.
+     *
+     * A LockException will be thrown either immediately (by this method), or
+     * on save, if a lock prevents the addition of the node. Implementations
+     * may differ on when this validation is performed.
+     *
+     * @param absPath path at which to persist this query.
+     * @return the newly created node.
+     * @throws ItemExistsException If an item already exists at the indicated position
+     * @throws PathNotFoundException If the path cannot be found
+     * @throws ConstraintViolationException If creating the node would violate a
+     * node type (or other implementation specific) constraint.
+     * @throws VersionException f the node to which the new child is being
+     * added is versionable and checked-in or is non-versionable but its
+     * nearest versionable ancestor is checked-in and this implementation
+     * performs this validation immediately instead of waiting until save.
+     * @throws LockException if a lock prevents the addition of the node and
+     * this implementation performs this validation immediately instead of
+     * waiting until save.
+     * @throws RepositoryException If another error occurs.
+     */
+    public function storeAsNode( $absPath );
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/QueryManager.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/QueryManager.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/QueryManager.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/QueryManager.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/RepositoryException.php';
+require_once 'PHPCR/Node.php';
+require_once 'PHPCR/query/Query.php';
+require_once 'PHPCR/query/InvalidQueryException.php';
+
+
+/**
+ * This interface encapsulates methods for the management of search queries.
+ * Provides methods for the creation and retrieval of search queries.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage query
+ */
+interface QueryManager
+{
+    /**
+     * Creates a new query by specifying the query statement itself and the
+     * language in which the query is stated.  If the query statement is
+     * syntactically invalid, given the language specified, an
+     * InvalidQueryException is thrown. language must specify a query language
+     * from among those returned by QueryManager.getSupportedQueryLanguages(); if it is not
+     * then an InvalidQueryException is thrown.
+     *
+     * @throws InvalidQueryException if statement is invalid or language is unsupported.
+     * @throws RepositoryException if another error occurs
+     * @return A <code>Query</code> object.
+     */
+    public function createQuery( $statement, $language );
+
+    /**
+     * Retrieves an existing persistent query. If <code>node</code>
+     * is not a valid persisted query (that is, a node of type
+     * <code>nt:query</code>), an <code>InvalidQueryException</code>
+     * is thrown.
+     * <p/>
+     * Persistent queries are created by first using <code>QueryManager.createQuery</code>
+     * to create a <code>Query</code> object and then calling <code>Query.save</code> to
+     * persist the query to a location in the workspace.
+     *
+     * @param node a persisted query (that is, a node of type <code>nt:query</code>).
+     * @throws InvalidQueryException If <code>node</code> is not a valid persisted query
+     * (that is, a node of type <code>nt:query</code>).
+     * @throws RepositoryException if another error occurs
+     * @return a <code>Query</code> object.
+     */
+    public function getQuery( Node $node );
+
+    /**
+     * Returns an array of integers identifying the supported query languages.
+     * See QueryLanguage.
+     *
+     * @return An string array.
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getSupportedQueryLanguages();
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/QueryResult.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/QueryResult.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/QueryResult.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/QueryResult.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/NodeIterator.php';
+require_once 'PHPCR/query/RowIterator.php';
+require_once 'PHPCR/RepositoryException.php';
+
+
+/**
+ * A QueryResult object. Returned in an iterator by query.Query#execute()
+ * Query.execute()
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage query
+ */
+interface QueryResult
+{
+    /**
+     * Returns an array of all the property names (column names) in this result set.
+     *
+     * @return array of strings
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getColumnNames();
+
+    /**
+     * Returns an iterator over the <code>Row</code>s of the query result table.
+     * If an <code>ORDER BY</code> clause was specified in the query, then the
+     * order of the returned properties in the iterator will reflect the order
+     * specified in that clause. If no items match, an empty iterator is returned.
+     *
+     * @return a <code>RowIterator</code>
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getRows();
+
+    /**
+     * Returns an iterator over all nodes that match the query. If an <code>ORDER BY</code>
+     * clause was specified in the query, then the order of the returned nodes in the iterator
+     * will reflect the order specified in that clause. If no nodes match, an empty iterator
+     * is returned.
+     *
+     * @return a <code>NodeIterator</code>
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getNodes();
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/Row.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/Row.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/Row.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/Row.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/Value.php';
+require_once 'PHPCR/RepositoryException.php';
+require_once 'PHPCR/ItemNotFoundException.php';
+
+
+/**
+ * A row in the query result table.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage query
+ */
+interface Row
+{
+    /**
+     * Returns an array of all the values in the same order as the property names
+     * (column names) returned by {@link QueryResult#getPropertyNames()}.
+     *
+     * @return a <code>Value</code> array.
+     * @throws RepositoryException if an error occurs
+     */
+    public function getValues();
+
+    /**
+     * Returns the value of the indicated  property in this <code>Row</code>.
+     * <p/>
+     * If <code>propertyName</code> is not among the column names of the query result
+     * table, an <code>ItemNotFoundException</code> is thrown.
+     *
+     * @return a <code>Value</code>
+     * @throws ItemNotFoundException if <code>propertyName</code> s not among the
+     * column names of the query result table
+     * @throws RepositoryException if anopther error occurs.
+     */
+    public function getValue( $propertyName );
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/RowIterator.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/RowIterator.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/RowIterator.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/query/RowIterator.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/RangeIterator.php';
+require_once 'PHPCR/query/Row.php';
+require_once 'PHPCR/NoSuchElementException.php';
+
+
+
+/**
+ * @package phpcr
+ * @subpackage query
+ */
+interface RowIterator extends RangeIterator
+{
+    /**
+     * Returns the next <code>Row</code> in the iteration.
+     *
+     * @return the next <code>Row</code> in the iteration.
+     * @throws NoSuchElementException if iteration has no more <code>Row</code>s.
+     */
+    public function nextRow();
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/util/ISO8601.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/util/ISO8601.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/util/ISO8601.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/util/ISO8601.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+/**
+ * The <code>ISO8601</code> utility class provides helper methods
+ * to deal with date/time formatting using a specific ISO8601-compliant
+ * format (see <a href="http://www.w3.org/TR/NOTE-datetime">ISO 8601</a>).
+ * <p/>
+ * Currently we only support the format <code>yyyy-mm-ddThh:mm:ss</code>,
+ * which includes the complete date plus hours, minutes, seconds and a decimal
+ * fraction of a second. Currently there is no timezone support
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @todo Timezone support
+ * @package phpcr
+ * @subpackage util
+ */
+final class ISO8601
+{
+    /**
+     * Parses a ISO8601-compliant date/time string.
+     *
+     * @param  text the date/time string to be parsed
+     * @return <code>date</code>, or <code>null</code> if the input could
+     *         not be parsed
+     * @return mixed date or false if an parsing error occured
+     * @static
+     */
+    public static function parse( $text ) {
+        $year   = substr( $iso,  0, 4 );
+        $month  = substr( $iso,  4, 2 );
+        $day    = substr( $iso,  6, 2 );
+        $hour   = substr( $iso,  9, 2 );
+        $minute = substr( $iso, 12, 2 );
+        $second = substr( $iso, 15, 2 );
+
+        // correctly parsed? if not, return false
+        return $year . $month . $day . 'T' . $hour . ':' . $minute . ':' . $second;
+    }
+
+    /**
+     * Returns ISO formatted date
+     *
+     * @access public
+     */
+    public function format( $val ) {
+        // TODO
+    }
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/util/TraversingItemVisitor.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/util/TraversingItemVisitor.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/util/TraversingItemVisitor.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/util/TraversingItemVisitor.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,201 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/ItemVisitor.php';
+require_once 'PHPCR/Property.php';
+require_once 'PHPCR/RepositoryException.php';
+require_once 'PHPCR/Node.php';
+
+
+/**
+ * An implementaion of <code>ItemVisitor</code>.
+ * <p/>
+ * <b>Level 1 and 2</b>
+ * <p/>
+ * <code>TraversingItemVisitor</code> is an abstract utility class
+ * which allows to easily traverse an <code>Item</code> hierarchy.
+ * <p/>
+ * <p><code>TraversingItemVisitor</code> makes use of the Visitor Pattern
+ * as described in the book 'Design Patterns' by the Gang Of Four
+ * (Gamma et al.).
+ * <p/>
+ * <p>Tree traversal is done observing the left-to-right order of
+ * child <code>Item</code>s if such an order is supported and exists.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage util
+ */
+abstract class TraversingItemVisitor implements ItemVisitor
+{
+    /**$currentQueue
+     * indicates if traversal should be done in a breadth-first
+     * manner rather than depth-first (which is the default)
+     *
+     * @var bool
+     */
+    protected $breadthFirst = false;
+
+    /**
+     * the 0-based level up to which the hierarchy should be traversed
+     * (if it's -1, the hierarchy will be traversed until there are no
+     * more children of the current item)
+     *
+     * @var int
+     */
+    protected $maxLevel = -1;
+
+    /**
+     * queues used to implement breadth-first traversal
+     *
+     * @var array
+     */
+    private $currentQueue;
+    private $nextQueue;
+
+    /**
+     * used to track hierarchy level of item currently being processed
+     *
+     * @var int
+     */
+    private $currentLevel;
+
+
+    /**
+     * Constructs a new instance of this class.
+     *
+     * @param breadthFirst if <code>breadthFirst</code> is true then traversal
+     *                     is done in a breadth-first manner; otherwise it is done in a
+     *                     depth-first manner (which is the default behaviour).
+     */
+    public function __construct( $breadthFirst = false, $maxLevel = -1 ) {
+        $this->breadthFirst = $breadthFirst;
+
+        if ( $this->breadthFirst === true ) {
+            $this->currentQueue = array();
+            $this->nextQueue    = array();
+        }
+
+        $this->currentLevel = 0;
+        $this->maxLevel = $maxLevel;
+    }
+
+
+    /**
+     * Implement this method to add behaviour performed before a
+     * <code>Property</code> or <code>Node</code> is visited.
+     *
+     * @param  entry that is accepting this visitor.
+     * @param  level    hierarchy level of this property (the root node starts at level 0)
+     * @throws RepositoryException if an error occurrs
+     */
+    protected abstract function entering( $entry, $level );
+
+    /**
+     * Implement this method to add behaviour performed after a
+     * <code>Property</code> is visited.
+     *
+     * @param  entry the <code>Property</code> that is accepting this visitor.
+     * @param  level    hierarchy level of this property (the root node starts at level 0)
+     * @throws RepositoryException if an error occurrs
+     */
+    protected abstract function leaving( $entry, $level );
+
+    /**
+     * Called when the Visitor is passed to a <code>Node</code>.
+     * <p/>
+     * It calls <code>TraversingItemVisitor.entering(Node, int)</code> followed by
+     * <code>TraversingItemVisitor.leaving(Node, int)</code>. Implement these abstract methods to
+     * specify behaviour on 'arrival at' and 'after leaving' the <code>Node</code>.
+     * <p/>
+     * If this method throws, the visiting process is aborted.
+     *
+     * @param Either Node or Property that is accepting this visitor.
+     * @throws RepositoryException if an error occurrs
+     */
+    public function visit( $entry ) {
+        if ( $entry instanceof Property ) {
+            $this->entering( $entry, $this->currentLevel );
+            $this->leaving( $entry, $this->currentLevel );
+        } else {
+            try {
+                if ( !$this->breadthFirst ) {
+                    // depth-first traversal
+                    $this->entering( $entry, $this->currentLevel );
+
+                    if ( $this->maxLevel == -1 || $this->currentLevel < $this->maxLevel ) {
+                        $this->currentLevel++;
+
+                        $nodeIter = $entry->getNodes();
+
+                        while ( $nodeIter->hasNext() ) {
+                            $nodeIter->nextNode()->accept( $this );
+                        }
+
+                        $propIter = $entry->getProperties();
+
+                        while ( $propIter->hasNext()) {
+                            $propIter->nextProperty()->accept( $this );
+                        }
+
+                        $currentLevel--;
+                    }
+
+                    $this->leaving( $entry, $this->currentLevel );
+                } else {
+                    // breadth-first traversal
+                    $this->entering( $entry, $this->currentLevel );
+                    $this->leaving( $entry, $this->currentLevel );
+
+                    if ( $this->maxLevel == -1 || $this->currentLevel < $this->maxLevel ) {
+                        $nodeIter = $entry->getNodes();
+
+                        while ( $nodeIter->hasNext() ) {
+                            $this->nextQueue[] = $nodeIter->nextNode();
+                        }
+
+                        $propIter = $entry->getProperties();
+
+                        while ( $propIter->hasNext() ) {
+                            $this->nextQueue[] = $propIter->nextProperty();
+                        }
+                    }
+
+                    while ( !empty( $this->currentQueue ) || !empty( $this->nextQueue ) ) {
+                        if ( empty( $this->currentQueue ) ) {
+                            $this->currentLevel++;
+                            $this->currentQueue = $this->nextQueue;
+                            $this->nextQueue = array();
+                        }
+
+                        $this->currentQueue = array_shift( $this->currentQueue );
+                    }
+
+                    $this->currentLevel = 0;
+               }
+            } catch ( RepositoryException $re ) {
+                $this->currentLevel = 0;
+                throw $re;
+            }
+        }
+    }
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/OnParentVersionAction.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/OnParentVersionAction.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/OnParentVersionAction.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/OnParentVersionAction.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,279 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/IllegalArgumentException.php';
+
+
+/**
+ * The possible actions specified by the <code>onParentVersion</code> attribute
+ * in a property definition within a node type definition.
+ * <p>
+ * <b>Level 2 only</b>
+ * <p>
+ * This interface defines the following actions:
+ * <UL>
+ *    <LI>COPY
+ *    <LI>VERSION
+ *    <LI>INITIALIZE
+ *    <LI>COMPUTE
+ *    <LI>IGNORE
+ *    <LI>ABORT
+ * </UL>
+ * <p>
+ * Every item (node or property) in the repository has a status indicator that
+ * governs what happens to that item when its parent node is versioned. This
+ * status is defined by the onParentVersion attribute in the PropertyDef or
+ * NodeDef that applies to the item in question. This PropertyDef or NodeDef is
+ * part of the NodeType of the parent node of the item in question.
+ * <p>
+ * For example, let N be a versionable node in workspace W of repository R.
+ * Furthermore, let N be of node type T, where T is a sub-type of
+ * nt:versionable and T allows N to have one property called P and one child
+ * node called C.
+ * <p>
+ * What happens to P and C when N is versioned depends on their respective
+ * OnParentVersion attribute as defined in the PropertyDef for P and the
+ * NodeDef for C, found in the definition of node type T.
+ * <p>
+ * The possible values for the OnParentVersion attribute are: COPY, VERSION,
+ * INITIALIZE, COMPUTE, NOTHING and FORBIDDEN.
+ * <p>
+ * The sections below describe, for each possible value of the OnParentVersion
+ * attribute, what happens to C and P when,
+ * <ul>
+ * <li>N.checkin() is performed, creating the new version VN and adding to the
+ * version history.
+ * <li>N.restore(VN)  is performed, restoring the version VN.
+ * </ul>
+ * <p>
+ * COPY
+ * <p>
+ * Child Node
+ * <p>
+ * On checkin of N, C and all its descendent items, down to the leaves of the
+ * subtree, will be copied to the version storage as a child subtree of VN. The
+ * copy of C and its subtree will not have its own version history but will be
+ * part of the state preserved in VN. C itself need not be versionable.
+ * <p>
+ * On restore of VN, the copy of C and its subtree stored will be restored as
+ * well, replacing the current C and its subtree in the workspace.
+ * <p>
+ * Property
+ * <p>
+ * On checkin of N, P will be copied to the version storage as a child of VN.
+ * This copy of P is part of the state preserved in VN.
+ * <p>
+ * On restore of VN, the copy of P stored as its child will be restored as
+ * well, replacing the current P in the workspace.
+ * <p>
+ * VERSION
+ * <p>
+ * Child Node
+ * <p>
+ * On checkin of N, the node VN will get a child reference to the version
+ * history of C (not to C or any actual version of C). In practice, this means
+ * that the root version of C's version history becomes the child of VN
+ * because, as mentioned before, the root version is used as the referent when
+ * a reference to the version history as a whole is required. This also
+ * requires that C itself be versionable (otherwise it would not have a version
+ * history). If C is not versionable then behavior of IGNORE applies on checkin
+ * (see below).
+ * <p>
+ * On restore of VN, if the workspace currently has an already existing node
+ * corresponding to C's version history, then that instance of C becomes the
+ * child of the restored N. If the workspace does not have an instance of C
+ * then one is restored from C's version history. The workspace in which the
+ * restore is being performed will determine which particular version of C will
+ * be restored. This determination depends on the configuration of the
+ * workspace and is outside the scope of this specification.
+ * <p>
+ * Property
+ * <p>
+ * In the case of properties, an OnParentVersion attribute of VERSION has the
+ * same effect as COPY.
+ * <p>
+ * INITIALIZE
+ * <p>
+ * Child Node
+ * <p>
+ * On checkin of N, a new node C will be created and placed in version storage
+ * as a child of VN. This new C will be initialized just as it would be if
+ * created normally in a workspace. No state information of the current C in
+ * the workspace is preserved. The new C will not have its own version history
+ * but will be part of the state preserved in VN. C itself need not be
+ * versionable.
+ * <p>
+ * On restore of VN, the C stored as its child will be restored as well,
+ * replacing the current C in the workspace.
+ * <p>
+ * Property
+ * <p>
+ * On checkin of N, a new P will be created and placed in version storage as a
+ * child of VN. The new P will be initialized just as it would be if created
+ * normally in a workspace. The new P is part of the state preserved in VN.
+ * <p>
+ * On restore of VN, the P stored as its child will be restored as well,
+ * replacing the current P in the workspace.
+ * <p>
+ * COMPUTE
+ * <p>
+ * Child Node
+ * <p>
+ * On checkin of N, a new node C will be created and placed in version storage
+ * as a child of VN. This new C will be initialized according to some
+ * configuration-specific procedure beyond the scope of this specification. The
+ * new C will not have its own version history but will be part of the state
+ * preserved in VN. C itself need not be versionable.
+ * <p>
+ * On restore of VN, the C stored as its child will be restored as well,
+ * replacing the current C in the workspace.
+ * <p>
+ * Property
+ * <p>
+ * On checkin of N, a new P will be created and placed in version storage as a
+ * child of VN. The new P will be initialized according to some
+ * configuration-specific procedure beyond the scope of this specification. The
+ * new P is part of the state preserved in VN.
+ * <p>
+ * On restore of VN, the P stored as its child will be restored as well,
+ * replacing the current P in the workspace.
+ * <p>
+ * IGNORE
+ * <p>
+ * Child Node
+ * <p>
+ * On checkin of N, no state information about C will be stored in VN.
+ * <p>
+ * On restore of VN, the child node C of the current N will remain and not be
+ * removed, despite not being included in the state recorded in VN, since its
+ * IGNORE status tells the system to leave it alone.
+ * <p>
+ * Property
+ * <p>
+ * On checkin of N, no state information about P will be stored in VN.
+ * <p>
+ * On restore of VN, the property P of the current N will remain and not be
+ * removed, despite not being included in the state of recorded in VN, since
+ * its IGNORE status tells the system to leave it alone.
+ * <p>
+ * ABORT
+ * <p>
+ * Child Node or Property
+ * <p>
+ * On checkin of N an exception will be thrown. Having a child node or property
+ * with an OnParentVersion attribute of ABORT prevents the parent node from
+ * being checked-in.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage version
+ */
+final class OnParentVersionAction
+{
+    /**
+     * The action constants.
+     */
+    const COPY       = 1;
+    const VERSION    = 2;
+    const INITIALIZE = 3;
+    const COMPUTE    = 4;
+    const IGNORE     = 5;
+    const ABORT      = 6;
+
+    /**
+     * The names of the defined on-version actions,
+     * as used in serialization.
+     */
+    const ACTIONNAME_COPY       = "COPY";
+    const ACTIONNAME_VERSION    = "VERSION";
+    const ACTIONNAME_INITIALIZE = "INITIALIZE";
+    const ACTIONNAME_COMPUTE    = "COMPUTE";
+    const ACTIONNAME_IGNORE     = "IGNORE";
+    const ACTIONNAME_ABORT      = "ABORT";
+
+
+    /**
+     * Private constructor to prevent instantiation
+     */
+    private function __construct() {
+    }
+
+
+    /**
+     * Returns the name of the specified <code>action</code>,
+     * as used in serialization.
+     * @param  int    $action the on-version action
+     * @return string the name of the specified <code>action</code>
+     * @throws IllegalArgumentException if <code>action</code>
+     * is not a valid on-version action.
+     */
+    public static function nameFromValue( $action ) {
+        switch ( $action ) {
+            case self::COPY:
+               return self::ACTIONNAME_COPY;
+
+            case self::VERSION:
+                return self::ACTIONNAME_VERSION;
+
+            case self::INITIALIZE:
+                return self::ACTIONNAME_INITIALIZE;
+
+            case self::COMPUTE:
+                return self::ACTIONNAME_COMPUTE;
+
+            case self::IGNORE:
+                return self::ACTIONNAME_IGNORE;
+
+            case self::ABORT:
+                return self::ACTIONNAME_ABORT;
+
+            default:
+               throw new IllegalArgumentException("unknown on-version action: " + $action);
+        }
+    }
+
+    /**
+     * Returns the numeric constant value of the on-version action with the
+     * specified name.
+     * @param  string $name the name of the on-version action
+     * @return int    the numeric constant value
+     * @throws IllegalArgumentException if <code>name</code>
+     * is not a valid on-version action name.
+     */
+    public static function valueFromName( $name ) {
+        if ( $name == self::ACTIONNAME_COPY ) {
+            return self::COPY;
+        } else if ( $name == self::ACTIONNAME_VERSION ) {
+            return self::VERSION;
+        } else if ( $name == self::ACTIONNAME_INITIALIZE ) {
+            return self::INITIALIZE;
+        } else if ( $name == self::ACTIONNAME_COMPUTE ) {
+            return self::COMPUTE;
+        } else if ( $name == self::ACTIONNAME_IGNORE ) {
+            return self::IGNORE;
+        } else if ( $name == self::ACTIONNAME_ABORT ) {
+            return self::ABORT;
+        } else {
+            throw new IllegalArgumentException( "unknown on-version action: " + $name );
+        }
+    }
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/Version.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/Version.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/Version.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/Version.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/Node.php';
+require_once 'PHPCR/version/VersionHistory.php';
+require_once 'PHPCR/RepositoryException.php';
+
+
+/**
+ * A <code>Version</code> object wraps an <code>nt:version</code> node. It
+ * provides convenient access to version information.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage version
+ */
+interface Version extends Node
+{
+    /**
+     * Returns the <code>VersionHistory</code> that contains this <code>Version</code>.
+     * @return the <code>VersionHistory</code> that contains this <code>Version</code>.
+     * @throws RepositoryException if an error occurs.
+     */
+     public function getContainingHistory();
+
+    /**
+     * Returns the date this version was created. This corresponds to the value
+     * of the <code>jcr:created</code> property in the <code>nt:version</code>
+     * node that represents this version.
+     *
+     * @return date
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getCreated();
+
+    /**
+     * Returns the successor versions of this version. This corresponds to
+     * returning all the <code>nt:version</code> nodes referenced by the
+     * <code>jcr:successors</code> multi-value property in the
+     * <code>nt:version</code> node that represents this version.
+     *
+     * @return a <code>Version</code> array.
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getSuccessors();
+
+    /**
+     * Returns the predecessor versions of this version. This corresponds to
+     * returning all the <code>nt:version</code> nodes whose
+     * <code>jcr:successors</code> property includes a reference to the
+     * <code>nt:version</code> node that represents this version.
+     *
+     * @return a <code>Version</code> array.
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getPredecessors();
+}
+
+?>

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionException.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionException.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionException.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionException.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/RepositoryException.php';
+
+
+/**
+ * Exception thrown by Version.addSuccessor if an invalid
+ * version graph operation is attempted.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage version
+ */
+class VersionException extends RepositoryException
+{
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionHistory.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionHistory.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionHistory.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionHistory.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,212 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/RepositoryException.php';
+require_once 'PHPCR/version/Version.php';
+require_once 'PHPCR/version/VersionIterator.php';
+require_once 'PHPCR/ReferentialIntegrityException.php';
+require_once 'PHPCR/AccessDeniedException.php';
+require_once 'PHPCR/UnsupportedRepositoryOperationException.php';
+require_once 'PHPCR/version/VersionException.php';
+
+
+/**
+ * A <code>VersionHistory</code> object wraps an <code>nt:versionHistory</code>
+ * node. It provides convenient access to version history information.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage version
+ */
+interface VersionHistory
+{
+    /**
+     * Returns the UUID of the versionable node for which this is the version history.
+     *
+     * @return the UUID of the versionable node for which this is the version history.
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getVersionableUUID();
+
+    /**
+     * Returns the root version of this version history.
+     *
+     * @return a <code>Version</code> object.
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getRootVersion();
+
+    /**
+     * Returns an iterator over all the versions within this version history
+     * The order of the returned objects will not necessarily correspond to the
+     * order of versions in terms of the successor relation. To traverse the
+     * version graph one must traverse the <code>jcr:successor REFERENCE</code>
+     * properties starting with the root version. A version history will always
+     * have at least one version, the root version. Therefore, this method will
+     * always return an iterator of at least size 1.
+     *
+     * @return a <code>VersionIterator</code> object.
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getAllVersions();
+
+    /**
+     * Retrieves a particular version from this version history by version name.
+     * <p/>
+     * Throws a <code>VersionException</code> if the specified version is not in
+     * this version history.
+     *
+     * @param versionName a version name
+     * @return a <code>Version</code> object.
+     * @throws VersionException if the specified version is not in this version history.
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getVersion( $versionName );
+
+    /**
+     * Retrieves a particular version from this version history by version label.
+     * <p/>
+     * Throws a <code>VersionException</code> if the specified <code>label</code> is not in
+     * this version history.
+     *
+     * @param label a version label
+     * @return a <code>Version</code> object.
+     * @throws VersionException if the specified <code>label</code> is not in this version history.
+     * @throws RepositoryException if an error occurs.
+     */
+    public function getVersionByLabel( $label );
+
+    /**
+     * Adds the specified label to the specified version. This corresponds to adding a
+     * value to the <code>jcr:versionLabels</code> multi-value property of the
+     * <code>nt:version</code> node that represents the specified version.
+     * <p/>
+     * Note that this change is made immediately; there is no need to call <code>save</code>.
+     * In fact, since the the version storage is read-only with respect to normal repository
+     * methods, <code>save</code> does not even function in this context.
+     * <p/>
+     * Within a particular version history, a given label may appear a maximum of once.
+     * If the specified label is already assigned to a version in this history and
+     * <code>moveLabel</code> is <code>true</code> then the label is removed from its
+     * current location and added to the version with the specified <code>versionName</code>.
+     * If <code>moveLabel</code> is <code>false</code>, then an attempt to add a label that
+     * already exists in this version history will throw a <code>VersionException</code>.
+     *
+     * @param versionName the name of the version to which the label is to be added.
+     * @param label the label to be added.
+     * @param moveLabel if <code>true</code>, then if <code>label</code> is already assigned to a version in
+     * this version history, it is moved to the new version specified; if <code>false</code>, then attempting
+     * to assign an already used label will throw a <code>VersionException</code>.
+     *
+     * @throws VersionException if an attempt is made to add an existing label to a version history
+     * and <code>moveLabel</code> is <code>false</code> or if the specifed version does not exisit in
+     * this version history.
+     * @throws RepositoryException if another error occurs.
+     */
+    public function addVersionLabel( $versionName, $label, $moveLabel );
+
+    /**
+     * Removes the specified label from among the labels of this version history.
+     * This corresponds to removing a property from the <code>jcr:versionLabels</code>
+     * child node of the <code>nt:versionHistory</code> node that represents this version
+     * history.
+     * <p/>
+     * Note that this change is made immediately; there is no need to call <code>save</code>.
+     * In fact, since the the version storage is read-only with respect to normal repository
+     * methods, <code>save</code> does not even function in this context.
+     * <p/>
+     * If a label is specified that does not exist in this version history,
+     * a <code>VersionException</code> is thrown.
+     *
+     * @param label a version label
+     * @throws VersionException if the name labvel does not exist in this version history.
+     * @throws RepositoryException if another error occurs.
+     */
+    public function removeVersionLabel( $label );
+
+    /**
+     * Returns true if the given version has the given <code>label</code>.
+     * @param version a Version object
+     * @param label a version label
+     * @return a <code>boolean</code>.
+     * @throws VersionException if the specified <code>version</code> is not of this version history.
+     * @throws RepositoryException if another error occurs.
+     *
+     */
+    public function hasVersionLabel( Version $version, $label );
+
+    /**
+     * Returns all version labels of the given <code>version</code> - empty array if none.
+     * Throws a <code>VersionException</code> if the specified <code>version</code> is not
+     * in this version history.
+     * @param version
+     * @return a <code>String</code> array containing all the labels of the given version
+     * @throws VersionException if the specified <code>version</code> is not in this version history.
+     * @throws RepositoryException if another error occurs.
+     */
+    public function getVersionLabels( Version $version );
+
+    /**
+     * Removes the named version from this version history and automatically
+     * repairs the version graph. If the version to be removed is <code>V</code>, <code>V</code>'s
+     * predecessor set is <code>P</code> and <code>V</code>'s successor set is <code>S</code>, then
+     * the version graph is repaired s follows:
+     * <ul>
+     * <li>For each member of <code>P</code>, remove the reference to <code>V</code> from its
+     * successor list and add references to each member of <code>S</code>.
+     * <li>For each member of <code>S</code>, remove the reference to <code>V</code> from its
+     * predecessor list and add references to each member of <code>P</code>.
+     * </ul>
+     * Note that this change is made immediately; there is no need to call <code>save</code>.
+     * In fact, since the the version storage is read-only with respect to normal repository
+     * methods, <code>save</code> does not even function in this context.
+     * <p/>
+     * A <code>ReferentialIntegrityException</code> will be thrown if the specified version is
+     * currently the target of a <code>REFERENCE</code> property elsewhere in the repository
+     * (not just in this workspace) and the current <code>Session</code> has read access to
+     * that <code>REFERENCE</code> property.
+     * <p/>
+     * An <code>AccessDeniedException</code> will be thrown if the current <code>Session</code>
+     * does not have permission to remove the specified version or if the specified version is
+     * currently the target of a <code>REFERENCE</code> property elsewhere in the repository
+     * (not just in this workspace) and the current <code>Session</code> does not have read
+     * access to that <code>REFERENCE</code> property.
+     * <p/>
+     * Throws an <code>UnsupportedRepositoryOperationException</code> if this operation is
+     * not supported by the implementation.
+     * <p/>
+     * Throws a <code>VersionException</code> if the named version is not in this <code>VersionHistory</code>.
+     *
+     * @param versionName the name of a version in this version history.
+     * @throws ReferentialIntegrityException if the specified version is currently the target of a
+     * <code>REFERENCE</code> property elsewhere in the repository (not necessarily in this workspace)
+     * and the current <code>Session</code> has read access to that <code>REFERENCE</code> property.
+     * @throws AccessDeniedException if the current Session does not have permission to remove the
+     * specified version or if the specified version is currently the target of a <code>REFERENCE</code>
+     * property elsewhere in the repository (not just in this workspace) and the current <code>Session</code>
+     * does not have read access to that <code>REFERENCE</code> property.
+     * @throws UnsupportedRepositoryOperationException if this operation is not supported by the implementation.
+     * @throws VersionException if the named version is not in this version history.
+     * @throws RepositoryException if another error occurs.
+     */
+    public function removeVersion( $versionName );
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionIterator.php
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionIterator.php?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionIterator.php (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/PHPCR/version/VersionIterator.php Sun Jul  3 04:58:33 2005
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * 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.
+ */
+
+
+require_once 'PHPCR/RangeIterator.php';
+require_once 'PHPCR/version/Version.php';
+require_once 'PHPCR/NoSuchElementException.php';
+
+
+/**
+ * Allows easy iteration through a list of <code>Version</code> objects
+ * with <code>nextNode</code> as well as a <code>skip</code> method inherited from
+ * <code>RangeIterator</code>.
+ *
+ * @author Markus Nix <mn...@mayflower.de>
+ * @package phpcr
+ * @subpackage version
+ */
+interface VersionIterator extends RangeIterator
+{
+     /**
+      * Returns the next <code>Version</code> in the iteration.
+      *
+      * @return the next <code>Version</code> in the iteration.
+      * @throws NoSuchElementException if iteration has no more <code>Version</code>s.
+     */
+    public function nextVersion();
+}
+
+?>
\ No newline at end of file

Added: incubator/jackrabbit/trunk/contrib/phpcr/package.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/phpcr/package.xml?rev=208906&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/phpcr/package.xml (added)
+++ incubator/jackrabbit/trunk/contrib/phpcr/package.xml Sun Jul  3 04:58:33 2005
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE package SYSTEM "http://pear.php.net/dtd/package-1.0">
+<package version="1.0">
+  <name>PHPCR</name>
+  <summary>Port of JSR-170 Specification to PHP</summary>
+  <description>
+    The JSR-170 API defines how an application and a content
+    repository interact with respect to a number of content services.
+    For example the versioning facilities of a content repository are
+    clearly defined, so an application knows how to browse the version
+    history, check in and check out content items, or update and merge
+    content in a standard fashion. This is the PHP pot of the API.
+  </description>
+  <maintainers>
+    <maintainer>
+      <user>mnix</user>
+      <name>Markus Nix</name>
+      <email>mnix@docuverse.de</email>
+      <role>lead</role>
+    </maintainer>
+  </maintainers>
+  <release>
+    <version>0.2</version>
+    <date>2005-06-15</date>
+    <license>Apache License</license>
+    <state>alpha</state>
+    <notes>Changes reflect most of the latest changes in the JCR spec.</notes>
+    <deps>
+      <dep type="php" rel="ge" version="5.0.0" optional="no"/>
+    </deps>
+    <filelist>
+      <dir name="PHPCR" role="php">
+        <file>AccessDeniedException.php</file>
+        <file>Credentials.php</file>
+        <file>IllegalArgumentException.php</file>
+        <file>IllegalStateException.php</file>
+        <file>InvalidItemStateException.php</file>
+        <file>InvalidSerializedDataException.php</file>
+        <file>IOException.php</file>
+        <file>Item.php</file>
+        <file>ItemExistsException.php</file>
+        <file>ItemNotFoundException.php</file>
+        <file>ItemVisitor.php</file>
+        <file>LoginException.php</file>
+        <file>MergeException.php</file>
+        <file>NamespaceException.php</file>
+        <file>NamespaceRegistry.php</file>
+        <file>Node.php</file>
+        <file>NodeIterator.php</file>
+        <file>NoSuchElementException.php</file>
+        <file>NoSuchWorkspaceException.php</file>
+        <file>NumberFormatException.php</file>
+        <file>PathNotFoundException.php</file>
+        <file>Property.php</file>
+        <file>PropertyIterator.php</file>
+        <file>PropertyType.php</file>
+        <file>RangeIterator.php</file>
+        <file>ReferentialIntegrityException.php</file>
+        <file>Repository.php</file>
+        <file>RepositoryException.php</file>
+        <file>SAXException.php</file>
+        <file>Session.php</file>
+        <file>SimpleCredentials.php</file>
+        <file>UnsupportedRepositoryOperationException.php</file>
+        <file>Value.php</file>
+        <file>ValueFormatException.php</file>
+        <file>Workspace.php</file>
+        <file>lock/Lock.php</file>
+        <file>lock/LockException.php</file>
+        <file>nodetype/ConstraintViolationException.php</file>
+        <file>nodetype/NodeType.php</file>
+        <file>nodetype/NodeTypeIterator.php</file>
+        <file>nodetype/NodeTypeManager.php</file>
+        <file>nodetype/NoSuchNodeTypeException.php</file>
+        <file>nodetype/ItemDefinition.php</file>
+        <file>nodetype/NodeDefinition.php</file>
+        <file>nodetype/PropertyDefinition.php</file>
+        <file>observation/Event.php</file>
+        <file>observation/EventIterator.php</file>
+        <file>observation/EventListener.php</file>
+        <file>observation/EventListenerIterator.php</file>
+        <file>observation/ObservationManager.php</file>
+        <file>query/InvalidQueryException.php</file>
+        <file>query/Query.php</file>
+        <file>query/QueryManager.php</file>
+        <file>query/QueryResult.php</file>
+        <file>query/Row.php</file>
+        <file>query/RowIterator.php</file>
+        <file>util/ISO8601.php</file>
+        <file>util/TraversingItemVisitor.php</file>
+        <file>version/OnParentVersionAction.php</file>
+        <file>version/Version.php</file>
+        <file>version/VersionException.php</file>
+        <file>version/VersionHistory.php</file>
+        <file>version/VersionIterator.php</file>
+      </dir>
+    </filelist>
+  </release>
+  <changelog>
+    <release>
+      <version>0.1</version>
+      <date>2005-05-06</date>
+      <license>Apache License</license>
+      <state>alpha</state>
+    </release>
+  </changelog>
+</package>

Propchange: incubator/jackrabbit/trunk/contrib/phpcr/package.xml
------------------------------------------------------------------------------
    svn:eol-style = native