/*
*
* * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com)
* *
* * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
* *
* * 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.
* *
* * For more information: http://www.orientechnologies.com
*
*/
package com.orientechnologies.common.io;
import com.orientechnologies.common.util.OPatternConst;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class OIOUtils {
public static final long SECOND = 1000;
public static final long MINUTE = SECOND * 60;
public static final long HOUR = MINUTE * 60;
public static final long DAY = HOUR * 24;
public static final long YEAR = DAY * 365;
public static final long WEEK = DAY * 7;
public static final String UTF8_BOM = "\uFEFF";
public static long getTimeAsMillisecs(final Object iSize) {
if (iSize == null)
throw new IllegalArgumentException("Time is null");
if (iSize instanceof Number)
// MILLISECS
return ((Number) iSize).longValue();
String time = iSize.toString();
boolean number = true;
for (int i = time.length() - 1; i >= 0; --i) {
if (!Character.isDigit(time.charAt(i))) {
number = false;
break;
}
}
if (number)
// MILLISECS
return Long.parseLong(time);
else {
time = time.toUpperCase(Locale.ENGLISH);
int pos = time.indexOf("MS");
final String timeAsNumber = OPatternConst.PATTERN_NUMBERS.matcher(time).replaceAll("");
if (pos > -1)
return Long.parseLong(timeAsNumber);
pos = time.indexOf("S");
if (pos > -1)
return Long.parseLong(timeAsNumber) * SECOND;
pos = time.indexOf("M");
if (pos > -1)
return Long.parseLong(timeAsNumber) * MINUTE;
pos = time.indexOf("H");
if (pos > -1)
return Long.parseLong(timeAsNumber) * HOUR;
pos = time.indexOf("D");
if (pos > -1)
return Long.parseLong(timeAsNumber) * DAY;
pos = time.indexOf('W');
if (pos > -1)
return Long.parseLong(timeAsNumber) * WEEK;
pos = time.indexOf('Y');
if (pos > -1)
return Long.parseLong(timeAsNumber) * YEAR;
// RE-THROW THE EXCEPTION
throw new IllegalArgumentException("Time '" + time + "' has a unrecognizable format");
}
}
public static String getTimeAsString(final long iTime) {
if (iTime > YEAR && iTime % YEAR == 0)
return String.format("%dy", iTime / YEAR);
if (iTime > WEEK && iTime % WEEK == 0)
return String.format("%dw", iTime / WEEK);
if (iTime > DAY && iTime % DAY == 0)
return String.format("%dd", iTime / DAY);
if (iTime > HOUR && iTime % HOUR == 0)
return String.format("%dh", iTime / HOUR);
if (iTime > MINUTE && iTime % MINUTE == 0)
return String.format("%dm", iTime / MINUTE);
if (iTime > SECOND && iTime % SECOND == 0)
return String.format("%ds", iTime / SECOND);
// MILLISECONDS
return String.format("%dms", iTime);
}
public static Date getTodayWithTime(final String iTime) throws ParseException {
final SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
Calendar calParsed = Calendar.getInstance();
calParsed.setTime(df.parse(iTime));
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, calParsed.get(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, calParsed.get(Calendar.MINUTE));
cal.set(Calendar.SECOND, calParsed.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
public static String readFileAsString(final File iFile) throws IOException {
return readStreamAsString(new FileInputStream(iFile));
}
public static String readFileAsString(final File iFile, Charset iCharset) throws IOException {
return readStreamAsString(new FileInputStream(iFile), iCharset);
}
public static String readStreamAsString(final InputStream iStream) throws IOException {
return readStreamAsString(iStream, StandardCharsets.UTF_8);
}
public static String readStreamAsString(final InputStream iStream, Charset iCharset) throws IOException {
final StringBuffer fileData = new StringBuffer(1000);
final BufferedReader reader = new BufferedReader(new InputStreamReader(iStream, iCharset));
try {
final char[] buf = new char[1024];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
if (fileData.length() == 0 && readData.startsWith(UTF8_BOM))
// SKIP UTF-8 BOM IF ANY
readData = readData.substring(1);
fileData.append(readData);
}
} finally {
reader.close();
}
return fileData.toString();
}
public static void writeFile(final File iFile, final String iContent) throws IOException {
final FileOutputStream fos = new FileOutputStream(iFile);
try {
final OutputStreamWriter os = new OutputStreamWriter(fos);
try {
final BufferedWriter writer = new BufferedWriter(os);
try {
writer.write(iContent);
} finally {
writer.close();
}
} finally {
os.close();
}
} finally {
fos.close();
}
}
public static long copyStream(final InputStream in, final OutputStream out, long iMax) throws IOException {
if (iMax < 0)
iMax = Long.MAX_VALUE;
final byte[] buf = new byte[8192];
int byteRead = 0;
long byteTotal = 0;
while ((byteRead = in.read(buf, 0, (int) Math.min(buf.length, iMax - byteTotal))) > 0) {
out.write(buf, 0, byteRead);
byteTotal += byteRead;
}
return byteTotal;
}
/**
* Returns the Unix file name format converting backslashes (\) to slasles (/)
*/
public static String getUnixFileName(final String iFileName) {
return iFileName != null ? iFileName.replace('\\', '/') : null;
}
public static String getRelativePathIfAny(final String iDatabaseURL, final String iBasePath) {
if (iBasePath == null) {
final int pos = iDatabaseURL.lastIndexOf('/');
if (pos > -1)
return iDatabaseURL.substring(pos + 1);
} else {
final int pos = iDatabaseURL.indexOf(iBasePath);
if (pos > -1)
return iDatabaseURL.substring(pos + iBasePath.length() + 1);
}
return iDatabaseURL;
}
public static String getDatabaseNameFromPath(final String iPath) {
return iPath.replace('/', '$');
}
public static String getPathFromDatabaseName(final String iPath) {
return iPath.replace('$', '/');
}
public static String getStringMaxLength(final String iText, final int iMax) {
return getStringMaxLength(iText, iMax, "");
}
public static String getStringMaxLength(final String iText, final int iMax, final String iOther) {
if (iText == null)
return null;
if (iMax > iText.length())
return iText;
return iText.substring(0, iMax) + iOther;
}
public static Object encode(final Object iValue) {
if (iValue instanceof String) {
return java2unicode(((String) iValue).replace("\\", "\\\\").replace("\"", "\\\""));
} else
return iValue;
}
public static String java2unicode(final String iInput) {
final StringBuilder result = new StringBuilder(iInput.length() * 2);
final int inputSize = iInput.length();
char ch;
String hex;
for (int i = 0; i < inputSize; i++) {
ch = iInput.charAt(i);
if (ch >= 0x0020 && ch <= 0x007e) // Does the char need to be converted to unicode?
result.append(ch); // No.
else // Yes.
{
result.append("\\u"); // standard unicode format.
hex = Integer.toHexString(ch & 0xFFFF); // Get hex value of the char.
for (int j = 0; j < 4 - hex.length(); j++)
// Prepend zeros because unicode requires 4 digits
result.append('0');
result.append(hex.toLowerCase()); // standard unicode format.
// ostr.append(hex.toLowerCase(Locale.ENGLISH));
}
}
return result.toString();
}
public static boolean isStringContent(final Object iValue) {
if (iValue == null)
return false;
final String s = iValue.toString();
if (s == null)
return false;
return s.length() > 1
&& (s.charAt(0) == '\'' && s.charAt(s.length() - 1) == '\'' || s.charAt(0) == '"' && s.charAt(s.length() - 1) == '"');
}
public static String getStringContent(final Object iValue) {
if (iValue == null)
return null;
final String s = iValue.toString();
if (s == null)
return null;
if (s.length() > 1
&& (s.charAt(0) == '\'' && s.charAt(s.length() - 1) == '\'' || s.charAt(0) == '"' && s.charAt(s.length() - 1) == '"'))
return s.substring(1, s.length() - 1);
if (s.length() > 1 && (s.charAt(0) == '`' && s.charAt(s.length() - 1) == '`'))
return s.substring(1, s.length() - 1);
return s;
}
public static String wrapStringContent(final Object iValue, final char iStringDelimiter) {
if (iValue == null)
return null;
final String s = iValue.toString();
if (s == null)
return null;
return iStringDelimiter + s + iStringDelimiter;
}
public static boolean equals(final byte[] buffer, final byte[] buffer2) {
if (buffer == null || buffer2 == null || buffer.length != buffer2.length)
return false;
for (int i = 0; i < buffer.length; ++i)
if (buffer[i] != buffer2[i])
return false;
return true;
}
public static boolean isLong(final String iText) {
boolean isLong = true;
final int size = iText.length();
for (int i = 0; i < size && isLong; i++) {
final char c = iText.charAt(i);
isLong = isLong & ((c >= '0' && c <= '9'));
}
return isLong;
}
public static void readFully(InputStream in, byte[] b, int off, int len) throws IOException {
while (len > 0) {
int n = in.read(b, off, len);
if (n == -1) {
throw new EOFException();
}
off += n;
len -= n;
}
}
}