/*****************************************************************************
* 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 com.amalto.workbench.widgets.xmlviewer.utils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
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.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
import org.talend.commons.utils.workbench.resources.ResourceUtils;
import org.talend.core.model.general.Project;
import org.talend.repository.ProjectManager;
public class FileUtils {
public static final String EOL;
private static final String FILE_PROTOCOL = "file:"; //$NON-NLS-1$
protected static final String PROTOCOL_PATTERN = ":"; //$NON-NLS-1$
public static final String LINE_SEPARATOR = System.getProperty("line.separator"); //$NON-NLS-1$
public static final String TAB = "\t"; //$NON-NLS-1$
static {
EOL = File.separatorChar != '\\' ? File.separatorChar != '/' ? "\r" //$NON-NLS-1$
: "\n" : "\r\n"; //$NON-NLS-1$ //$NON-NLS-2$
}
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 XMLViewUtils.isEmpty(basePath) ? null : createURI(basePath).resolve(relativePath.replaceAll(" ", "%20")); //$NON-NLS-1$ //$NON-NLS-2$
}
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:\""); //$NON-NLS-1$
}
int k = "file:".length(); //$NON-NLS-1$
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); //$NON-NLS-1$ //$NON-NLS-2$
}
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("/") ? "//" : "///"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
uri = prefix + uri;
}
return uri;
}
private static URI createURI(String path) throws URISyntaxException {
return new URI(path.replaceAll(" ", "%20")); //$NON-NLS-1$ //$NON-NLS-2$
}
private static boolean hasProtocol(String uri) {
boolean result = false;
if (uri != null) {
int index = uri.indexOf(PROTOCOL_PATTERN);
if (index != -1 && index > 2) // assume protocol with be length 3 so that the'C' in 'C:/' is not interpreted
// as a protocol
{
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); //$NON-NLS-1$ //$NON-NLS-2$
} 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); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
public static boolean exists(String localCachedName) {
return new File(localCachedName).exists();
}
public static IFile buildTempFileInWorkspace(String fileContent, String fileNameWithExtension) {
IFile file = null;
if (fileContent != null) {
try {
Project project = ProjectManager.getInstance().getCurrentProject();
IProject prj = ResourceUtils.getProject(project);
file = prj.getFile(new Path("temp/" + fileNameWithExtension)); //$NON-NLS-1$
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "utf-8"); //$NON-NLS-1$
outputStreamWriter.write(fileContent);
outputStreamWriter.flush();
outputStreamWriter.close();
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
if (file.exists()) {
file.setContents(inputStream, true, false, null);
} else {
file.create(inputStream, true, null);
}
inputStream.close();
} catch (Exception e) {
throw new RuntimeException("Error trying to create file \'" + fileNameWithExtension + "\' in the cache.", e); //$NON-NLS-1$ //$NON-NLS-2$
}
}
return file;
}
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) {
}
}
}