Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 34939 invoked from network); 27 Feb 2007 09:16:41 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 27 Feb 2007 09:16:41 -0000 Received: (qmail 92259 invoked by uid 500); 27 Feb 2007 09:16:50 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 92175 invoked by uid 500); 27 Feb 2007 09:16:50 -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 92166 invoked by uid 99); 27 Feb 2007 09:16:50 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 27 Feb 2007 01:16:50 -0800 X-ASF-Spam-Status: No, hits=-99.5 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 27 Feb 2007 01:16:40 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id 352631A981D; Tue, 27 Feb 2007 01:16:20 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r512186 - in /jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons: AbstractSession.java AbstractWorkspace.java DefaultContentHandler.java Date: Tue, 27 Feb 2007 09:16:19 -0000 To: commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070227091620.352631A981D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jukka Date: Tue Feb 27 01:16:18 2007 New Revision: 512186 URL: http://svn.apache.org/viewvc?view=rev&rev=512186 Log: JCR-742: Added abstract base classes for sessions and workspaces Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java (with props) jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java (with props) jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java (with props) Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java?view=auto&rev=512186 ============================================================================== --- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java (added) +++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java Tue Feb 27 01:16:18 2007 @@ -0,0 +1,243 @@ +/* + * 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.commons; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.jcr.Credentials; +import javax.jcr.Item; +import javax.jcr.Node; +import javax.jcr.PathNotFoundException; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.sax.TransformerHandler; +import javax.xml.transform.stream.StreamResult; + +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; + +/** + * Abstract base class for implementing the JCR {@link Session} interface. + */ +public abstract class AbstractSession implements Session { + + /** + * Calls {@link Session#exportDocumentView(String, ContentHandler, boolean, boolean)} + * with the given arguments and a {@link ContentHandler} that serializes + * SAX events to the given output stream. + * + * @param absPath passed through + * @param out output stream to which the SAX events are serialized + * @param skipBinary passed through + * @param noRecurse passed through + * @throws IOException if the SAX serialization failed + * @throws RepositoryException if another error occurs + */ + public void exportDocumentView( + String absPath, OutputStream out, + boolean skipBinary, boolean noRecurse) + throws IOException, RepositoryException { + try { + ContentHandler handler = getExportContentHandler(out); + exportDocumentView(absPath, handler, skipBinary, noRecurse); + } catch (SAXException e) { + Exception exception = e.getException(); + if (exception instanceof RepositoryException) { + throw (RepositoryException) exception; + } else if (exception instanceof IOException) { + throw (IOException) exception; + } else { + throw new RepositoryException( + "Error serializing document view XML", e); + } + } + } + + /** + * Calls {@link Session#exportSystemView(String, ContentHandler, boolean, boolean)} + * with the given arguments and a {@link ContentHandler} that serializes + * SAX events to the given output stream. + * + * @param absPath passed through + * @param out output stream to which the SAX events are serialized + * @param skipBinary passed through + * @param noRecurse passed through + * @throws IOException if the SAX serialization failed + * @throws RepositoryException if another error occurs + */ + public void exportSystemView( + String absPath, OutputStream out, + boolean skipBinary, boolean noRecurse) + throws IOException, RepositoryException { + try { + ContentHandler handler = getExportContentHandler(out); + exportSystemView(absPath, handler, skipBinary, noRecurse); + } catch (SAXException e) { + Exception exception = e.getException(); + if (exception instanceof RepositoryException) { + throw (RepositoryException) exception; + } else if (exception instanceof IOException) { + throw (IOException) exception; + } else { + throw new RepositoryException( + "Error serializing system view XML", e); + } + } + } + + /** + * Parses the given input stream as an XML document and processes the + * SAX events using the {@link ContentHandler} returned by + * {@link Session#getImportContentHandler(String, int)}. + * + * @param parentAbsPath passed through + * @param in input stream to be parsed as XML and imported + * @param uuidBehavior passed through + * @throws IOException if an I/O error occurs + * @throws RepositoryException if another error occurs + */ + public void importXML( + String parentAbsPath, InputStream in, int uuidBehavior) + throws IOException, RepositoryException { + ContentHandler handler = + getImportContentHandler(parentAbsPath, uuidBehavior); + new DefaultContentHandler(handler).parse(in); + } + + /** + * Returns the node or property at the given path. + *

+ * The default implementation: + *

    + *
  • Throws a {@link PathNotFoundException} if the given path + * does not start with a slash. + *
  • Returns the root node if the given path is "/" + *
  • Calls {@link Node#getNode(String)} on the root node with the + * part of the given path after the first slash + *
  • Calls {@link Node#getProperty(String)} similarly in case the + * above call fails with a {@link PathNotFoundException} + *
+ * + * @param absPath absolute path + * @return the node or property with the given path + * @throws PathNotFoundException if the given path is invalid or not found + * @throws RepositoryException if another error occurs + */ + public Item getItem(String absPath) + throws PathNotFoundException, RepositoryException { + if (!absPath.startsWith("/")) { + throw new PathNotFoundException("Not an absolute path: " + absPath); + } + + Node root = getRootNode(); + String relPath = absPath.substring(1); + if (relPath.length() == 0) { + return root; + } + + try { + return root.getNode(relPath); + } catch (PathNotFoundException e) { + return root.getProperty(relPath); + } + } + + /** + * Calls {@link #getItem(String)} with the given path and returns + * true if the call succeeds. Returns false + * if a {@link PathNotFoundException} was thrown. Other exceptions are + * passed through. + * + * @param absPath absolute path + * @return true if an item exists at the given path, + * false otherwise + * @throws RepositoryException if an error occurs + */ + public boolean itemExists(String absPath) throws RepositoryException { + try { + getItem(absPath); + return true; + } catch (PathNotFoundException e) { + return false; + } + } + + /** + * Logs in the same workspace with the given credentials. + *

+ * The default implementation: + *

    + *
  • Retrieves the {@link Repository} instance using + * {@link Session#getRepository()} + *
  • Retrieves the current workspace using {@link Session#getWorkspace()} + *
  • Retrieves the name of the current workspace using + * {@link Workspace#getName()} + *
  • Calls {@link Repository#login(Credentials, String)} on the + * retrieved repository with the given credentials and the retrieved + * workspace name. + *
+ * + * @param credentials login credentials + * @return logged in session + * @throws RepositoryException if an error occurs + */ + public Session impersonate(Credentials credentials) + throws RepositoryException { + return getRepository().login(credentials, getWorkspace().getName()); + } + + //-------------------------------------------------------------< private > + + /** + * Creates a {@link ContentHandler} instance that serializes the + * received SAX events to the given output stream. + * + * @param stream output stream to which the SAX events are serialized + * @return SAX content handler + * @throws RepositoryException if an error occurs + */ + private ContentHandler getExportContentHandler(OutputStream stream) + throws RepositoryException { + try { + SAXTransformerFactory stf = (SAXTransformerFactory) + SAXTransformerFactory.newInstance(); + TransformerHandler handler = stf.newTransformerHandler(); + + Transformer transformer = handler.getTransformer(); + transformer.setParameter(OutputKeys.METHOD, "xml"); + transformer.setParameter(OutputKeys.ENCODING, "UTF-8"); + transformer.setParameter(OutputKeys.INDENT, "no"); + + handler.setResult(new StreamResult(stream)); + return handler; + } catch (TransformerFactoryConfigurationError e) { + throw new RepositoryException( + "SAX transformer implementation not available", e); + } catch (TransformerException e) { + throw new RepositoryException( + "Error creating an XML export content handler", e); + } + } + +} Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java ------------------------------------------------------------------------------ svn:eol-style = native Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java?view=auto&rev=512186 ============================================================================== --- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java (added) +++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java Tue Feb 27 01:16:18 2007 @@ -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.commons; + +import java.io.IOException; +import java.io.InputStream; + +import javax.jcr.RepositoryException; +import javax.jcr.Workspace; + +import org.xml.sax.ContentHandler; + +/** + * Abstract base class for implementing the JCR {@link Workspace} interface. + */ +public abstract class AbstractWorkspace implements Workspace { + + /** + * Parses the given input stream as an XML document and processes the + * SAX events using the {@link ContentHandler} returned by + * {@link Workspace#getImportContentHandler(String, int)}. + * + * @param parentAbsPath passed through + * @param in input stream to be parsed as XML and imported + * @param uuidBehavior passed through + * @throws IOException if an I/O error occurs + * @throws RepositoryException if another error occurs + */ + public void importXML( + String parentAbsPath, InputStream in, int uuidBehavior) + throws IOException, RepositoryException { + ContentHandler handler = + getImportContentHandler(parentAbsPath, uuidBehavior); + new DefaultContentHandler(handler).parse(in); + } + +} Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java ------------------------------------------------------------------------------ svn:eol-style = native Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java?view=auto&rev=512186 ============================================================================== --- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java (added) +++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java Tue Feb 27 01:16:18 2007 @@ -0,0 +1,219 @@ +/* + * 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.commons; + +import java.io.IOException; +import java.io.InputStream; + +import javax.jcr.InvalidSerializedDataException; +import javax.jcr.RepositoryException; +import javax.xml.parsers.FactoryConfigurationError; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * Adapter class for exposing a {@link ContentHandler} instance as + * {@link DefaultHandler} object. + */ +class DefaultContentHandler extends DefaultHandler { + + /** + * The adapted content handler instance. + */ + private final ContentHandler handler; + + /** + * Creates a {@link DefaultHandler} adapter for the given content + * handler. + * + * @param handler content handler + */ + public DefaultContentHandler(ContentHandler handler) { + this.handler = handler; + } + + /** + * Utility method that parses the given input stream using this handler. + * + * @param in XML input stream + * @throws IOException if an I/O error occurs + * @throws RepositoryException if another error occurs + */ + public void parse(InputStream in) throws IOException, RepositoryException { + try { + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setNamespaceAware(true); + factory.setFeature( + "http://xml.org/sax/features/namespace-prefixes", false); + + SAXParser parser = factory.newSAXParser(); + parser.parse(new InputSource(in), this); + } catch (FactoryConfigurationError e) { + throw new RepositoryException( + "SAX parser implementation not available", e); + } catch (ParserConfigurationException e) { + throw new RepositoryException("SAX parser configuration error", e); + } catch (SAXException e) { + Exception exception = e.getException(); + if (exception instanceof RepositoryException) { + throw (RepositoryException) exception; + } else if (exception instanceof IOException) { + throw (IOException) exception; + } else { + throw new InvalidSerializedDataException( + "Error parsing XML import", e); + } + } + } + + //------------------------------------------------------< ContentHandler > + + /** + * Delegated to {@link #handler}. + * + * @param ch passed through + * @param start passed through + * @param length passed through + * @throws SAXException if an error occurs + */ + public void characters(char[] ch, int start, int length) + throws SAXException { + handler.characters(ch, start, length); + } + + /** + * Delegated to {@link #handler}. + * + * @throws SAXException if an error occurs + */ + public void endDocument() throws SAXException { + handler.endDocument(); + } + + /** + * Delegated to {@link #handler}. + * + * @param namespaceURI passed through + * @param localName passed through + * @param qName passed through + * @throws SAXException if an error occurs + */ + public void endElement( + String namespaceURI, String localName, String qName) + throws SAXException { + handler.endElement(namespaceURI, localName, qName); + } + + /** + * Delegated to {@link #handler}. + * + * @param prefix passed through + * @throws SAXException if an error occurs + */ + public void endPrefixMapping(String prefix) throws SAXException { + handler.endPrefixMapping(prefix); + } + + /** + * Delegated to {@link #handler}. + * + * @param ch passed through + * @param start passed through + * @param length passed through + * @throws SAXException if an error occurs + */ + public void ignorableWhitespace(char[] ch, int start, int length) + throws SAXException { + handler.ignorableWhitespace(ch, start, length); + } + + /** + * Delegated to {@link #handler}. + * + * @param target passed through + * @param data passed through + * @throws SAXException if an error occurs + */ + public void processingInstruction(String target, String data) + throws SAXException { + handler.processingInstruction(target, data); + } + + /** + * Delegated to {@link #handler}. + * + * @param locator passed through + */ + public void setDocumentLocator(Locator locator) { + handler.setDocumentLocator(locator); + } + + /** + * Delegated to {@link #handler}. + * + * @param name passed through + * @throws SAXException if an error occurs + */ + public void skippedEntity(String name) throws SAXException { + handler.skippedEntity(name); + } + + /** + * Delegated to {@link #handler}. + * + * @throws SAXException if an error occurs + */ + public void startDocument() throws SAXException { + handler.startDocument(); + } + + /** + * Delegated to {@link #handler}. + * + * @param namespaceURI passed through + * @param localName passed through + * @param qName passed through + * @param atts passed through + * @throws SAXException if an error occurs + */ + public void startElement( + String namespaceURI, String localName, String qName, + Attributes atts) throws SAXException { + handler.startElement(namespaceURI, localName, qName, atts); + } + + /** + * Delegated to {@link #handler}. + * + * @param prefix passed through + * @param uri passed through + * @throws SAXException if an error occurs + */ + public void startPrefixMapping(String prefix, String uri) + throws SAXException { + handler.startPrefixMapping(prefix, uri); + } + +} Propchange: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java ------------------------------------------------------------------------------ svn:eol-style = native