/*
* PosixFileSystemContext.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.core.client.files;
import org.rstudio.core.client.regex.Match;
import org.rstudio.core.client.regex.Pattern;
import java.util.ArrayList;
public abstract class PosixFileSystemContext implements FileSystemContext
{
public PosixFileSystemContext()
{
workingDir_ = "~";
}
public void setCallbacks(Callbacks callbacks)
{
callbacks_ = callbacks;
}
public String combine(String root, String name)
{
if (name == null || name.length() == 0)
return root;
// Is it absolute?
if (isAbsolute(name))
return name;
if (root == null || root.length() == 0)
return name;
if (root.endsWith("/"))
return root + name;
else
return root + "/" + name;
}
public FileSystemItem[] parseDir(String dirPath)
{
ArrayList<FileSystemItem> results = new ArrayList<FileSystemItem>();
if (dirPath.startsWith("/"))
results.add(FileSystemItem.createDir("/"));
Pattern pattern = Pattern.create("[^/]+");
Match m = pattern.match(dirPath, 0);
while (m != null)
{
results.add(FileSystemItem.createDir(
dirPath.substring(0, m.getIndex() + m.getValue().length())));
m = m.nextMatch();
}
return results.toArray(new FileSystemItem[0]);
}
public boolean isAbsolute(String path)
{
if (path.startsWith("/") || path.startsWith("~/") || path.equals("~"))
return true;
// Detect if this is a Windows root--necessary for Windows RDesktop.
if (path.length() >= 2
&& isAsciiLetter(path.charAt(0))
&& path.charAt(1) == ':')
{
return true;
}
return false;
}
private boolean isAsciiLetter(char c)
{
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
public String pwd()
{
return workingDir_;
}
public FileSystemItem pwdItem()
{
return FileSystemItem.createDir(workingDir_);
}
public FileSystemItem[] ls()
{
return contents_;
}
public String validatePathElement(String name, boolean forCreation)
{
if (name == null || name.length() == 0)
return "Name is empty";
if (name.startsWith(" ") || name.endsWith(" "))
return "Names should not start or end with spaces";
if (name.contains("/"))
return "Illegal character: /";
if (forCreation && (name.equals(".") || name.equals("..")))
return "Illegal name";
return null;
}
public FileSystemItem itemForName(String name,
boolean onlyIfExists,
boolean createAsDirectory)
{
assert validatePathElement(name, true) == null;
if (contents_ == null)
return null;
for (FileSystemItem fsi : contents_)
if (fsi.getName().equalsIgnoreCase(name))
return fsi;
if (onlyIfExists)
return null;
else
{
String path = combine(workingDir_, name);
if (createAsDirectory)
return FileSystemItem.createDir(path);
else
return FileSystemItem.createFile(path);
}
}
public boolean isRoot(FileSystemItem item)
{
return item.isDirectory() && item.getPath().equals("~");
}
protected String workingDir_;
protected FileSystemItem[] contents_;
protected Callbacks callbacks_;
}