// Copyright 2012 Citrix Systems, Inc. Licensed under the
// Apache License, Version 2.0 (the "License"); you may not use this
// file except in compliance with the License. Citrix Systems, Inc.
// reserves all rights not expressly granted by 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.
//
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.storage;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.ejb.Local;
import javax.naming.ConfigurationException;
@Local(value=StorageLayer.class)
public class JavaStorageLayer implements StorageLayer {
String _name;
boolean _makeWorldWriteable = true;
public JavaStorageLayer() {
super();
}
public JavaStorageLayer(boolean makeWorldWriteable) {
this();
this._makeWorldWriteable = makeWorldWriteable;
}
@Override
public boolean cleanup(String path, String rootPath) throws IOException {
assert path.startsWith(rootPath) : path + " does not start with " + rootPath;
synchronized(path) {
File file = new File(path);
if (!file.delete()) {
return false;
}
int index = -1;
long rootLength = rootPath.length();
while ((index = path.lastIndexOf(File.separator)) != -1 && path.length() > rootLength) {
file = new File(path.substring(0, index));
String[] children = file.list();
if (children != null && children.length > 0) {
break;
}
if (!file.delete()) {
throw new IOException("Unable to delete " + file.getAbsolutePath());
}
}
return true;
}
}
@Override
public boolean create(String path, String filename) throws IOException {
synchronized (path.intern()) {
String newFile = path + File.separator + filename;
File file = new File(newFile);
if (file.exists()) {
return true;
}
return file.createNewFile();
}
}
@Override
public boolean delete(String path) {
synchronized(path.intern()) {
File file = new File(path);
return file.delete();
}
}
@Override
public boolean deleteDir(String dir) {
File Dir = new File(dir);
if ( !Dir.isDirectory() ) {
return false;
}
synchronized(dir.intern()) {
File[] files = Dir.listFiles();
for( File file : files) {
if(!file.delete() ) {
return false;
}
}
}
return true;
}
@Override
public boolean exists(String path) {
synchronized(path.intern()) {
File file = new File(path);
return file.exists();
}
}
@Override
public long getTotalSpace(String path) {
File file = new File(path);
return file.getTotalSpace();
}
@Override
public long getUsableSpace(String path) {
File file = new File(path);
return file.getUsableSpace();
}
@Override
public String[] listFiles(String path) {
File file = new File(path);
File[] files = file.listFiles();
if (files == null) {
return new String[0];
}
String[] paths = new String[files.length];
for (int i = 0; i < files.length; i++) {
paths[i] = files[i].getAbsolutePath();
}
return paths;
}
@Override
public boolean mkdir(String path) {
synchronized(path.intern()) {
File file = new File(path);
if (file.exists()) {
return file.isDirectory();
}
if (_makeWorldWriteable) {
return (file.mkdirs() && setWorldReadableAndWriteable(file));
} else {
return file.mkdirs();
}
}
}
@Override
public long getSize(String path) {
File file = new File(path);
return file.length();
}
@Override
public boolean mkdirs(String path) {
synchronized(path.intern()) {
File dir = new File(path);
if (dir.exists()) {
return dir.isDirectory();
}
boolean success = true;
List<String> dirPaths = listDirPaths(path);
for (String dirPath : dirPaths) {
dir = new File(dirPath);
if (!dir.exists()) {
success = dir.mkdir();
if (_makeWorldWriteable)
success = success && setWorldReadableAndWriteable(dir);
}
}
return success;
}
}
private List<String> listDirPaths(String path) {
String[] dirNames = path.split("/");
List<String> dirPaths = new ArrayList<String>();
String currentPath = "";
for (int i = 0; i < dirNames.length; i++) {
String currentName = dirNames[i].trim();
if (!currentName.isEmpty()) {
currentPath += "/" + currentName;
dirPaths.add(currentPath);
}
}
return dirPaths;
}
public boolean setWorldReadableAndWriteable(File file) {
return (file.setReadable(true, false) && file.setWritable(true, false));
}
@Override
public boolean isDirectory(String path) {
File file = new File(path);
return file.isDirectory();
}
@Override
public boolean isFile(String path) {
File file = new File(path);
return file.isFile();
}
@Override
public File getFile(String path) {
return new File(path);
}
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_name = name;
return true;
}
@Override
public String getName() {
return _name;
}
@Override
public boolean start() {
return true;
}
@Override
public boolean stop() {
return true;
}
@Override
public long getUsedSpace(String path) {
File file = new File(path);
return file.getTotalSpace() - file.getFreeSpace();
}
}