001 /*
002 * Copyright (C) 2010 eXo Platform SAS.
003 *
004 * This is free software; you can redistribute it and/or modify it
005 * under the terms of the GNU Lesser General Public License as
006 * published by the Free Software Foundation; either version 2.1 of
007 * the License, or (at your option) any later version.
008 *
009 * This software is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * You should have received a copy of the GNU Lesser General Public
015 * License along with this software; if not, write to the Free
016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018 */
019
020 package org.crsh.vfs;
021
022 import org.crsh.vfs.spi.FSDriver;
023 import org.crsh.vfs.spi.file.FileDriver;
024 import org.crsh.vfs.spi.jarurl.JarURLDriver;
025 import org.crsh.vfs.spi.mount.MountDriver;
026 import org.crsh.vfs.spi.servlet.ServletContextDriver;
027
028 import javax.servlet.ServletContext;
029 import java.io.IOException;
030 import java.net.JarURLConnection;
031 import java.net.URISyntaxException;
032 import java.net.URL;
033 import java.util.ArrayList;
034 import java.util.Enumeration;
035 import java.util.List;
036
037 /**
038 * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
039 * @version $Revision$
040 */
041 public class FS {
042
043 /** . */
044 final List<Mount<?>> mounts;
045
046 public FS() {
047 this.mounts = new ArrayList<Mount<?>>();
048 }
049
050 public File get(Path path) throws IOException {
051 return new File(this, path);
052 }
053
054 public <H> FS mount(FSDriver<H> driver, Path path) {
055 if (driver == null) {
056 throw new NullPointerException();
057 }
058 if (path.equals(Path.get("/"))) {
059 mounts.add(Mount.wrap(driver));
060 } else {
061 mounts.add(Mount.wrap(new MountDriver<H>(path, driver)));
062 }
063 return this;
064 }
065
066 public <H> FS mount(FSDriver<H> driver, String path) {
067 return mount(driver, Path.get(path));
068 }
069
070 public <H> FS mount(FSDriver<H> driver) {
071 return mount(driver, "/");
072 }
073
074 public FS mount(java.io.File root) {
075 return mount(new FileDriver(root));
076 }
077
078 public FS mount(ClassLoader cl, Path path) throws IOException, URISyntaxException {
079 if (cl == null) {
080 throw new NullPointerException();
081 }
082 if (path == null) {
083 throw new NullPointerException();
084 }
085 if (!path.isDir()) {
086 throw new IllegalArgumentException("Path " + path + " must be a dir");
087 }
088 Enumeration<URL> en = cl.getResources(path.getValue().substring(1));
089 while (en.hasMoreElements()) {
090 URL url = en.nextElement();
091 String protocol = url.getProtocol();
092 if ("file".equals(protocol)) {
093 java.io.File root = new java.io.File(url.toURI());
094 mount(root);
095 } else if ("jar".equals(protocol)) {
096 JarURLConnection conn = (JarURLConnection)url.openConnection();
097 JarURLDriver jarDriver = new JarURLDriver(cl, conn);
098 mount(jarDriver, path);
099 }
100 }
101 return this;
102 }
103
104 public FS mount(Class<?> clazz) throws IOException, URISyntaxException {
105 if (clazz == null) {
106 throw new NullPointerException();
107 }
108 URL url = clazz.getProtectionDomain().getCodeSource().getLocation();
109 String protocol = url.getProtocol();
110 FSDriver<?> driver;
111 if (protocol.equals("file")) {
112 driver = new FileDriver(new java.io.File(url.toURI()));
113 } else if (protocol.equals("jar")) {
114 JarURLConnection conn = (JarURLConnection)url.openConnection();
115 driver = new JarURLDriver(clazz.getClassLoader(), conn);
116 } else {
117 throw new IllegalArgumentException("Protocol " + protocol + " not supported");
118 }
119 return mount(driver);
120 }
121 }