ar.com.tadp.xml.rinzo.core.utils.FileUtils.java Source code

Java tutorial

Introduction

Here is the source code for ar.com.tadp.xml.rinzo.core.utils.FileUtils.java

Source

/*****************************************************************************
 * This file is part of Rinzo
 *
 * Author: Claudio Cancinos
 * WWW: https://sourceforge.net/projects/editorxml
 * Copyright (C): 2008, Claudio Cancinos
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; If not, see <http://www.gnu.org/licenses/>
 ****************************************************************************/
package ar.com.tadp.xml.rinzo.core.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;

/**
 * 
 * @author ccancinos
 */
public class FileUtils {
    public static final String EOL;
    private static final String FILE_PROTOCOL = "file:";
    protected static final String PROTOCOL_PATTERN = ":";
    public static final String TAB = "\t";

    static {
        EOL = File.separatorChar != '\\' ? File.separatorChar != '/' ? "\r" : "\n" : "\r\n";
    }

    public static String relPathToUrl(String s) {
        char c = File.separatorChar;
        return c == '/' ? s : s.replace(c, '/');
    }

    /**
     * Creates an absolute URI from a relative one
     * 
     * @param basePath
     * @param relativePath
     * @return
     * @throws URISyntaxException
     */
    public static URI resolveURI(String basePath, String relativePath) throws URISyntaxException {
        return StringUtils.isEmpty(basePath) ? null
                : createURI(basePath).resolve(relativePath.replaceAll(" ", "%20"));
    }

    public static char[] readContents(Reader reader) throws IOException {
        int i = 4096;
        char ac[] = new char[i];
        char ac1[] = new char[0];
        int j = 0;
        do {
            int k = reader.read(ac, 0, i);
            if (k < 0)
                break;
            if (k > 0) {
                int l = ac1.length;
                char ac2[] = new char[l + k];
                System.arraycopy(ac1, 0, ac2, 0, l);
                System.arraycopy(ac, 0, ac2, l, k);
                ac1 = ac2;
                if (++j >= 8 && i < 300000) {
                    j = 0;
                    i *= 2;
                    ac = new char[i];
                }
            }
        } while (true);
        return ac1;
    }

    public static String fileUrlToPath(String s) {
        String s1 = s;
        int i = s.indexOf(':');
        int j = s.indexOf('/');
        if (i > 0 && (j < 0 || i < j)) {
            if (!s.startsWith("file:"))
                throw new IllegalArgumentException("Url must begin with \"file:\"");
            int k = "file:".length();
            int l = s.length();
            int i1;
            for (i1 = 0; k < l && s.charAt(k) == '/'; i1++)
                k++;

            if (i1 > 0 && (i1 & 1) == 0)
                k -= 2;
            s1 = (File.separatorChar != '/' ? "" : "/") + s.substring(k);
        }
        if (File.separatorChar != '/')
            s1 = s1.replace('/', File.separatorChar);
        return s1;
    }

    public static String addProtocol(String uri) {
        if (!hasProtocol(uri)) {
            String prefix = FILE_PROTOCOL;
            prefix += uri.startsWith("/") ? "//" : "///";
            uri = prefix + uri;
        }
        return uri;
    }

    private static URI createURI(String path) throws URISyntaxException {
        return new URI(path.replaceAll(" ", "%20"));
    }

    private static boolean hasProtocol(String uri) {
        boolean result = false;
        if (uri != null) {
            int index = uri.indexOf(PROTOCOL_PATTERN);
            // assume protocol with be length 3 so that the'C' in 'C:/' is not
            // interpreted as a protocol
            if (index != -1 && index > 2) {
                result = true;
            }
        }
        return result;
    }

    /**
     * Guarda un documento localmente en la cache
     */
    public static void saveFile(String inputFileName, File outputFile) {
        InputStream openStream = null;
        BufferedReader reader = null;
        BufferedWriter writer = null;
        try {
            File inputFile = new File(inputFileName);
            if (!inputFile.exists()) {
                openStream = new URL(inputFileName).openStream();
                InputStreamReader is = new InputStreamReader(openStream);
                String encoding = is.getEncoding();
                reader = new BufferedReader(is);
                writer = new BufferedWriter(
                        new OutputStreamWriter(new FileOutputStream(outputFile, false), encoding));

                String line = reader.readLine();
                while (line != null) {
                    writer.write(line);
                    writer.newLine();
                    writer.flush();
                    line = reader.readLine();
                }
            }
        } catch (Exception exception) {
            throw new RuntimeException("Error trying to save \'" + inputFileName + "\' in the cache.", exception);
        } finally {
            try {
                if (writer != null) {
                    writer.flush();
                    writer.close();
                }
                if (reader != null) {
                    reader.close();
                }
                if (openStream != null) {
                    openStream.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(
                        "Error trying to close files while saving \'" + inputFileName + "\' in the cache.", e);
            }
        }
    }

    public static boolean exists(String localCachedName) {
        return new File(localCachedName).exists();
    }

    public static void safeClose(Closeable c) {
        try {
            if (c != null) {
                c.close();
            }
        } catch (Exception e) {
        }
    }

    public static void safeDelete(File c) {
        try {
            if (c != null) {
                c.delete();
            }
        } catch (Exception e) {
        }
    }

    public static String getLineSeparator(IProject project) {
        String lineSeparator = null;

        if (Platform.isRunning()) {
            // line delimiter in project preference
            IScopeContext[] scopeContext;
            if (project != null) {
                scopeContext = new IScopeContext[] { new ProjectScope(project) };
                lineSeparator = Platform.getPreferencesService().getString(Platform.PI_RUNTIME,
                        Platform.PREF_LINE_SEPARATOR, null, scopeContext);
                if (lineSeparator != null)
                    return lineSeparator;
            }

            // line delimiter in workspace preference
            scopeContext = new IScopeContext[] { new InstanceScope() };
            lineSeparator = Platform.getPreferencesService().getString(Platform.PI_RUNTIME,
                    Platform.PREF_LINE_SEPARATOR, null, scopeContext);
            if (lineSeparator != null)
                return lineSeparator;
        }

        // system line delimiter
        return System.getProperty("line.separator");
    }

    public static IProject getProject(ITextEditor textEditor) {
        IEditorInput editorInput = textEditor.getEditorInput();
        if (editorInput == null) {
            return null;
        }
        IResource resource = (IResource) editorInput.getAdapter(IResource.class);
        if (resource == null) {
            return null;
        }
        return resource.getProject();
    }

    public static String getLineSeparator(ITextEditor textEditor) {
        return getLineSeparator(getProject(textEditor));
    }

}