/* * * 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 com.ejie.x38.webdav; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.Principal; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ejie.x38.webdav.exceptions.WebdavException; /** * Reference Implementation of WebdavStore * * @author joa * @author re */ public class LocalFileSystemStore implements IWebdavStore { private Logger LOG = LoggerFactory.getLogger(LocalFileSystemStore.class); private static int BUF_SIZE = 65536; private File _root = null; private String rootPath; public void setRootPath(String rootPath) { this.rootPath = rootPath; } public LocalFileSystemStore(File root) { _root = root; } public LocalFileSystemStore() { } @PostConstruct public void init(){ if (_root==null){ if(rootPath!=null && rootPath!=""){ if (rootPath.equals("*WAR-FILE-ROOT*")) { String file = LocalFileSystemStore.class.getProtectionDomain() .getCodeSource().getLocation().getFile().replace('\\', '/'); if (file.charAt(0) == '/' && System.getProperty("os.name").indexOf("Windows") != -1) { file = file.substring(1, file.length()); } int ix = file.indexOf("/WEB-INF/"); if (ix != -1) { rootPath = file.substring(0, ix).replace('/', File.separatorChar); } else { throw new WebdavException( "Could not determine root of war file. Can't extract from path '" + file + "' for this web container"); } } _root = new File(rootPath); } } } public ITransaction begin(Principal principal) throws WebdavException { LOG.debug("LocalFileSystemStore.begin()"); if (!_root.exists()) { if (!_root.mkdirs()) { throw new WebdavException("root path: " + _root.getAbsolutePath() + " does not exist and could not be created"); } } return null; } public void checkAuthentication(ITransaction transaction) throws SecurityException { LOG.debug("LocalFileSystemStore.checkAuthentication()"); // do nothing } public void commit(ITransaction transaction) throws WebdavException { // do nothing LOG.debug("LocalFileSystemStore.commit()"); } public void rollback(ITransaction transaction) throws WebdavException { // do nothing LOG.debug("LocalFileSystemStore.rollback()"); } public void createFolder(ITransaction transaction, String uri) throws WebdavException { LOG.debug("LocalFileSystemStore.createFolder(" + uri + ")"); File file = new File(_root, uri); if (!file.mkdir()) throw new WebdavException("cannot create folder: " + uri); } public void createResource(ITransaction transaction, String uri) throws WebdavException { LOG.debug("LocalFileSystemStore.createResource(" + uri + ")"); File file = new File(_root, uri); try { if (!file.createNewFile()) throw new WebdavException("cannot create file: " + uri); } catch (IOException e) { LOG .error("LocalFileSystemStore.createResource(" + uri + ") failed"); throw new WebdavException(e); } } public long setResourceContent(ITransaction transaction, String uri, InputStream is, String contentType, String characterEncoding) throws WebdavException { LOG.debug("LocalFileSystemStore.setResourceContent(" + uri + ")"); File file = new File(_root, uri); try { OutputStream os = new BufferedOutputStream(new FileOutputStream( file), BUF_SIZE); try { int read; byte[] copyBuffer = new byte[BUF_SIZE]; while ((read = is.read(copyBuffer, 0, copyBuffer.length)) != -1) { os.write(copyBuffer, 0, read); } } finally { try { is.close(); } finally { os.close(); } } } catch (IOException e) { LOG.error("LocalFileSystemStore.setResourceContent(" + uri + ") failed"); throw new WebdavException(e); } long length = -1; try { length = file.length(); } catch (SecurityException e) { LOG.error("LocalFileSystemStore.setResourceContent(" + uri + ") failed" + "\nCan't get file.length"); } return length; } public String[] getChildrenNames(ITransaction transaction, String uri) throws WebdavException { LOG.debug("LocalFileSystemStore.getChildrenNames(" + uri + ")"); File file = new File(_root, uri); String[] childrenNames = null; if (file.isDirectory()) { File[] children = file.listFiles(); List<String> childList = new ArrayList<String>(); String name = null; for (int i = 0; i < children.length; i++) { name = children[i].getName(); childList.add(name); LOG.debug("Child " + i + ": " + name); } childrenNames = new String[childList.size()]; childrenNames = (String[]) childList.toArray(childrenNames); } return childrenNames; } public void removeObject(ITransaction transaction, String uri) throws WebdavException { File file = new File(_root, uri); boolean success = file.delete(); LOG.debug("LocalFileSystemStore.removeObject(" + uri + ")=" + success); if (!success) { throw new WebdavException("cannot delete object: " + uri); } } public InputStream getResourceContent(ITransaction transaction, String uri) throws WebdavException { LOG.debug("LocalFileSystemStore.getResourceContent(" + uri + ")"); File file = new File(_root, uri); InputStream in; try { in = new BufferedInputStream(new FileInputStream(file)); } catch (IOException e) { LOG.error("LocalFileSystemStore.getResourceContent(" + uri + ") failed"); throw new WebdavException(e); } return in; } public long getResourceLength(ITransaction transaction, String uri) throws WebdavException { LOG.debug("LocalFileSystemStore.getResourceLength(" + uri + ")"); File file = new File(_root, uri); return file.length(); } public StoredObject getStoredObject(ITransaction transaction, String uri) { StoredObject so = null; File file = new File(_root, uri); if (file.exists()) { so = new StoredObject(); so.setFolder(file.isDirectory()); so.setLastModified(new Date(file.lastModified())); so.setCreationDate(new Date(file.lastModified())); so.setResourceLength(getResourceLength(transaction, uri)); } return so; } }