/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * 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. */ package com.google.dart.engine.utilities.io; import com.google.dart.engine.AnalysisEngine; import com.google.dart.engine.utilities.logging.Logger; import com.google.dart.engine.utilities.translation.DartExpressionBody; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; /** * The class {@code FileUtilities} implements utility methods used to create and manipulate files. * * @coverage dart.engine.utilities */ public final class FileUtilities { /** * Ensure that the given file exists and is executable. If it exists but is not executable, then * make it executable and log that it was necessary for us to do so. * * @return {@code true} if the file exists and is executable, else {@code false}. */ public static boolean ensureExecutable(File file) { if (file == null || !file.exists()) { return false; } if (!file.canExecute()) { Logger logger = AnalysisEngine.getInstance().getLogger(); if (!makeExecutable(file)) { logger.logError(file + " cannot be made executable"); return false; } logger.logError(file + " was not executable"); } return true; } /** * Return the contents of the given file, interpreted as a string. * * @param file the file whose contents are to be returned * @return the contents of the given file, interpreted as a string * @throws IOException if the file contents could not be read */ public static String getContents(File file) throws IOException { FileReader fileReader = new FileReader(file); try { BufferedReader reader = new BufferedReader(fileReader); return getContents(reader); } finally { fileReader.close(); } } /** * Return the contents of the given reader, interpreted as a string. The client is responsible for * closing the reader. * * @param reader the reader whose contents are to be returned * @return the contents of the given reader, interpreted as a string * @throws IOException if the reader could not be read */ public static String getContents(Reader reader) throws IOException { StringBuilder builder = new StringBuilder(); int nextChar = reader.read(); while (nextChar >= 0) { builder.append((char) nextChar); nextChar = reader.read(); } return builder.toString(); } /** * Return the extension from the given file name, or an empty string if the file name has no * extension. The extension is the portion of the name that occurs after the final period when a * file name is assumed to be of the form <code>baseName '.' extension</code>. * * @return the extension from the given file name */ public static String getExtension(String fileName) { if (fileName == null) { return ""; } int index = fileName.lastIndexOf('.'); if (index >= 0) { return fileName.substring(index + 1); } return ""; } /** * Attempt to make the given file executable. * * @param file the file to be made executable * @return {@code true} if the file is executable */ public static boolean makeExecutable(File file) { // Try to make the file executable for all users. if (file.setExecutable(true, false)) { return true; } // If that fails, then try to make it executable for the current user. return file.setExecutable(true, true); } /** * Verify that the given executable file exists and is executable. * * @param file the binary file * @return the file if it exists and is executable, else {@code null} */ @DartExpressionBody("file.isExecutable() ? file : null") public static File verifyExecutable(File file) { return ensureExecutable(file) ? file : null; } /** * Disallow the creation of instances of this class. */ private FileUtilities() { } }