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