001 /* 002 * Copyright (C) 2012 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.url.URLDriver; 025 026 import java.io.IOException; 027 import java.net.URISyntaxException; 028 import java.net.URL; 029 import java.util.ArrayList; 030 import java.util.Enumeration; 031 import java.util.List; 032 033 public class FS { 034 035 /** . */ 036 final List<Mount<?>> mounts; 037 038 public FS() { 039 this.mounts = new ArrayList<Mount<?>>(); 040 } 041 042 public File get(Path path) throws IOException { 043 return new File(this, path); 044 } 045 046 public <H> FS mount(FSDriver<H> driver) { 047 if (driver == null) { 048 throw new NullPointerException(); 049 } 050 mounts.add(Mount.wrap(driver)); 051 return this; 052 } 053 054 public FS mount(java.io.File root) { 055 return mount(new FileDriver(root)); 056 } 057 058 public FS mount(ClassLoader cl, Path path) throws IOException, URISyntaxException { 059 if (cl == null) { 060 throw new NullPointerException(); 061 } 062 if (path == null) { 063 throw new NullPointerException(); 064 } 065 if (!path.isDir()) { 066 throw new IllegalArgumentException("Path " + path + " must be a dir"); 067 } 068 URLDriver driver = new URLDriver(); 069 // Add the resources 070 Enumeration<URL> en = cl.getResources(path.getValue().substring(1)); 071 while (en.hasMoreElements()) { 072 URL url = en.nextElement(); 073 driver.merge(url); 074 } 075 076 return mount(driver); 077 } 078 079 public FS mount(Class<?> clazz) throws IOException, URISyntaxException { 080 if (clazz == null) { 081 throw new NullPointerException(); 082 } 083 URL url = clazz.getProtectionDomain().getCodeSource().getLocation(); 084 URLDriver driver = new URLDriver(); 085 driver.merge(url); 086 return mount(driver); 087 } 088 }