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 */
019package org.crsh.vfs.spi.file;
020
021import org.crsh.vfs.Path;
022import org.crsh.vfs.spi.FSMountFactory;
023import org.crsh.vfs.spi.Mount;
024
025import java.io.File;
026import java.io.IOException;
027
028/**
029 * @author Julien Viet
030 */
031public class FileMountFactory implements FSMountFactory<File> {
032
033  /** . */
034  private final File root;
035
036  /** . */
037  private final File absoluteRoot;
038
039  public FileMountFactory(File root) throws IOException {
040    if (root == null) {
041      throw new NullPointerException();
042    }
043
044    //
045    File absoluteRoot = root;
046    while (true) {
047      File parent = absoluteRoot.getParentFile();
048      if (parent != null && parent.isDirectory()) {
049        absoluteRoot = parent;
050      } else {
051        break;
052      }
053    }
054
055    //
056    this.root = root;
057    this.absoluteRoot = absoluteRoot;
058  }
059
060  @Override
061  public Mount<File> create(Path path) throws IOException {
062    File file = path.isAbsolute() ? absoluteRoot : root;
063
064    for (int i = 0; i < path.getSize(); i++) {
065      String name = path.nameAt(i);
066      if(i == 0 && isWindow() && name.length() == 2 && name.charAt(1) == ':') {
067        file = new File(name + File.separatorChar);
068      } else {
069        file = new File(file, name);
070      }
071    }
072
073    // Always use absolute path here
074    return new Mount<File>(new FileDriver(file), "file:" + file.getAbsolutePath());
075  }
076
077  private static String OS = System.getProperty("os.name").toLowerCase();
078  private static boolean isWindow() {
079    return (OS.indexOf("win") >= 0);
080  }
081}