001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie.action.hadoop;
016
017 import java.io.IOException;
018 import java.net.URI;
019 import java.net.URISyntaxException;
020
021 import org.apache.hadoop.fs.FileStatus;
022 import org.apache.hadoop.fs.FileSystem;
023 import org.apache.hadoop.fs.Path;
024 import org.apache.hadoop.conf.Configuration;
025 import org.apache.oozie.DagELFunctions;
026 import org.apache.oozie.client.WorkflowJob;
027 import org.apache.oozie.service.HadoopAccessorException;
028 import org.apache.oozie.service.Services;
029 import org.apache.oozie.service.HadoopAccessorService;
030
031 /**
032 * EL function for fs action executor.
033 */
034 public class FsELFunctions {
035
036 private static FileSystem getFileSystem(URI uri) throws HadoopAccessorException {
037 WorkflowJob workflow = DagELFunctions.getWorkflow();
038 String user = workflow.getUser();
039 String group = workflow.getGroup();
040 return Services.get().get(HadoopAccessorService.class).
041 createFileSystem(user, group, uri, new Configuration());
042 }
043
044 /**
045 * Get file status.
046 *
047 * @param pathUri fs path uri
048 * @return file status
049 * @throws URISyntaxException
050 * @throws IOException
051 * @throws Exception
052 */
053 private static FileStatus getFileStatus(String pathUri) throws Exception {
054 URI uri = new URI(pathUri);
055 String path = uri.getPath();
056 FileSystem fs = getFileSystem(uri);
057 Path p = new Path(path);
058 return fs.exists(p) ? fs.getFileStatus(p) : null;
059 }
060
061 /**
062 * Return if a path exists.
063 *
064 * @param pathUri file system path uri.
065 * @return <code>true</code> if the path exists, <code>false</code> if it does not.
066 * @throws Exception
067 */
068 public static boolean fs_exists(String pathUri) throws Exception {
069 URI uri = new URI(pathUri);
070 String path = uri.getPath();
071 FileSystem fs = getFileSystem(uri);
072 return fs.exists(new Path(path));
073 }
074
075 /**
076 * Return if a path is a directory.
077 *
078 * @param pathUri fs path uri.
079 * @return <code>true</code> if the path exists and it is a directory, <code>false</code> otherwise.
080 * @throws Exception
081 */
082 public static boolean fs_isDir(String pathUri) throws Exception {
083 boolean isDir = false;
084 FileStatus fileStatus = getFileStatus(pathUri);
085 if (fileStatus != null) {
086 isDir = fileStatus.isDir();
087 }
088 return isDir;
089 }
090
091 /**
092 * Return the len of a file.
093 *
094 * @param pathUri file system path uri.
095 * @return the file len in bytes, -1 if the file does not exist or if it is a directory.
096 * @throws Exception
097 */
098 public static long fs_fileSize(String pathUri) throws Exception {
099 long len = -1;
100 FileStatus fileStatus = getFileStatus(pathUri);
101 if (fileStatus != null) {
102 len = fileStatus.getLen();
103 }
104 return len;
105 }
106
107 /**
108 * Return the size of all files in the directory, it is not recursive.
109 *
110 * @param pathUri file system path uri.
111 * @return the size of all files in the directory, -1 if the directory does not exist or if it is a file.
112 * @throws Exception
113 */
114 public static long fs_dirSize(String pathUri) throws Exception {
115 URI uri = new URI(pathUri);
116 String path = uri.getPath();
117 long size = -1;
118 try {
119 FileSystem fs = getFileSystem(uri);
120 Path p = new Path(path);
121 if (fs.exists(p) && !fs.isFile(p)) {
122 FileStatus[] stati = fs.listStatus(p);
123 size = 0;
124 if (stati != null) {
125 for (FileStatus status : stati) {
126 if (!status.isDir()) {
127 size += status.getLen();
128 }
129 }
130 }
131 }
132 }
133 catch (Exception ex) {
134 throw new RuntimeException(ex);
135 }
136 return size;
137 }
138
139 /**
140 * Return the file block size in bytes.
141 *
142 * @param pathUri file system path uri.
143 * @return the block size of the file in bytes, -1 if the file does not exist or if it is a directory.
144 * @throws Exception
145 */
146 public static long fs_blockSize(String pathUri) throws Exception {
147 long blockSize = -1;
148 FileStatus fileStatus = getFileStatus(pathUri);
149 if (fileStatus != null) {
150 blockSize = fileStatus.getBlockSize();
151 }
152 return blockSize;
153 }
154
155 }