/* * Copyright 2004 The Apache Software Foundation * * 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. * */ package org.modeshape.webdav; import java.io.InputStream; import java.security.Principal; import java.util.List; import java.util.Map; import org.modeshape.webdav.exceptions.WebdavException; /** * Interface for simple implementation of any store for the WebdavServlet * <p> * based on the BasicWebdavStore from Oliver Zeigermann, that was part of the Webdav Construcktion Kit from slide */ public interface IWebdavStore { /** * Life cycle method, called by WebdavServlet's destroy() method. Should be used to clean up resources. */ void destroy(); /** * Indicates that a new request or transaction with this store involved has been started. The request will be terminated by * either {@link #commit(ITransaction)} or {@link #rollback(ITransaction)}. If only non-read methods have been called, the * request will be terminated by a {@link #commit(ITransaction)}. This method will be called by (@link WebdavStoreAdapter} at * the beginning of each request. * * @param principal the principal that started this request or <code>null</code> if there is non available * @throws WebdavException * @return a new {@link ITransaction transaction} */ ITransaction begin( Principal principal ); /** * Checks if authentication information passed in is valid. If not throws an exception. * * @param transaction indicates that the method is within the scope of a WebDAV transaction */ void checkAuthentication( ITransaction transaction ); /** * Indicates that all changes done inside this request shall be made permanent and any transactions, connections and other * temporary resources shall be terminated. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @throws WebdavException if something goes wrong on the store level */ void commit( ITransaction transaction ); /** * Indicates that all changes done inside this request shall be undone and any transactions, connections and other temporary * resources shall be terminated. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @throws WebdavException if something goes wrong on the store level */ void rollback( ITransaction transaction ); /** * Creates a folder at the position specified by <code>folderUri</code>. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @param folderUri URI of the folder * @throws WebdavException if something goes wrong on the store level */ void createFolder( ITransaction transaction, String folderUri ); /** * Creates a content resource at the position specified by <code>resourceUri</code>. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @param resourceUri URI of the content resource * @throws WebdavException if something goes wrong on the store level */ void createResource( ITransaction transaction, String resourceUri ); /** * Gets the content of the resource specified by <code>resourceUri</code>. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @param resourceUri URI of the content resource * @return input stream you can read the content of the resource from * @throws WebdavException if something goes wrong on the store level */ InputStream getResourceContent( ITransaction transaction, String resourceUri ); /** * Sets / stores the content of the resource specified by <code>resourceUri</code>. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @param resourceUri URI of the resource where the content will be stored * @param content input stream from which the content will be read from * @param contentType content type of the resource or <code>null</code> if unknown * @param characterEncoding character encoding of the resource or <code>null</code> if unknown or not applicable * @return lenght of resource * @throws WebdavException if something goes wrong on the store level */ long setResourceContent( ITransaction transaction, String resourceUri, InputStream content, String contentType, String characterEncoding ); /** * Gets the names of the children of the folder specified by <code>folderUri</code>. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @param folderUri URI of the folder * @return a (possibly empty) list of children, or <code>null</code> if the uri points to a file * @throws WebdavException if something goes wrong on the store level */ String[] getChildrenNames( ITransaction transaction, String folderUri ); /** * Gets the length of the content resource specified by <code>resourceUri</code>. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @param resourceUri URI of the resource for which the length should be retrieved * @return length of the resource in bytes, <code>-1</code> declares this value as invalid and asks the adapter to try to set * it from the properties if possible * @throws WebdavException if something goes wrong on the store level */ long getResourceLength( ITransaction transaction, String resourceUri ); /** * Removes the object specified by <code>uri</code>. * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @param uri URI of the object, i.e. content resource or folder * @throws WebdavException if something goes wrong on the store level */ void removeObject( ITransaction transaction, String uri ); /** * Gets the storedObject specified by <code>uri</code> * * @param transaction indicates that the method is within the scope of a WebDAV transaction * @param uri URI * @return StoredObject */ StoredObject getStoredObject( ITransaction transaction, String uri ); /** * Updates the custom properties on the given resource. NOTE: Nested properties are <b>not</b> supported * * @param transaction the {@link org.modeshape.webdav.ITransaction} within which the operation takes place; may not be null * @param resourceUri the URI of the object on which the properties should be updated; may not be null * @param propertiesToSet a map of (propertyName, propertyValue) pairs which should be set on the object; may not be null; If * the name of a property contains a namespace, it is expected to be in the [namespaceUri]:[localPropertyName] format. * @param propertiesToRemove a set of property name representing the properties which should be removed * @return a Map of (property name, error message) for the properties which could not changed (either set or removed). If the * operation was successful, this may be null. */ Map<String, String> setCustomProperties( ITransaction transaction, String resourceUri, Map<String, Object> propertiesToSet, List<String> propertiesToRemove ); /** * Returns the map of (propertyName, propertyValue) of custom properties of the given resource. NOTE: Nested properties are * <b>not</b> supported * * @param transaction the {@link ITransaction} within which the operation takes place; may not be null * @param resourceUri the URI of the object on which the properties should be updated; may not be null * @return a Map of (property name, property value) pairs; may not be null; if the property name is namespace-aware it is * expected to have the [namespaceUri]:[localPropertyName] format */ Map<String, Object> getCustomProperties( ITransaction transaction, String resourceUri ); /** * Returns a map of custom namespaces that are specific to the store. * * @param transaction the {@link ITransaction} within which the operation takes place; may not be null * @param resourceUri resourceUri the URI of the object on which the properties should be updated; may not be null * @return a Map of (namespaceUri, namespacePrefix) pairs;may not be null; */ Map<String, String> getCustomNamespaces( ITransaction transaction, String resourceUri ); }