/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.jevis.commons.driver.inputHandler;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
/**
*
* @author bf
*/
public class InputStreamHandler extends InputHandler {
public InputStreamHandler(InputStream input) {
super(input);
}
@Override
public void convertInput() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
try {
while ((len = ((InputStream) _rawInput).read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();
} catch (IOException ex) {
Logger.getLogger(this.getClass().getName()).log(Level.ERROR, ex.getMessage());
}
InputStream zippedCopy = new ByteArrayInputStream(baos.toByteArray());
InputStream unzipedCopy = new ByteArrayInputStream(baos.toByteArray());
try {
boolean isZiped = false;
ZipInputStream zin = new ZipInputStream((InputStream) zippedCopy);
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
isZiped = true;
StringBuilder sb = new StringBuilder();
String[] pathStream = getPathTokens(_filePattern);
boolean match = false;
if (containsTokens(_filePattern)) {
DateTime folderTime = getFolderTime(ze.getName(), pathStream);
String regExDateString = returnDateStringRegEx(_filePattern);
boolean isLater = folderTime.isAfter(_lastReadout);
if (isLater) {
match = matchRegEx(regExDateString, _filePattern);
}
} else {
match = matchRegEx(ze.getName(), _filePattern);
}
if (match) {
List<String> tmp = new ArrayList<String>();
for (int c = zin.read(); c != -1; c = zin.read()) {
sb.append((char) c);
}
_inputStream.add(new ByteArrayInputStream(sb.toString().getBytes()));
}
zin.closeEntry();
}
IOUtils.closeQuietly(zin);
if (!isZiped) {
_inputStream.add(new BufferedInputStream(unzipedCopy));
}
} catch (IOException ex) {
Logger.getLogger(this.getClass().getName()).log(Level.ERROR, ex.getMessage());
}
}
private static String returnDateStringRegEx(String nextToken) {
String[] substringsBetween = StringUtils.substringsBetween(nextToken, "${D:", "}");
for (int i = 0; i < substringsBetween.length; i++) {
nextToken = nextToken.replace("${D:" + substringsBetween[i] + "}", ".{" + substringsBetween[i].length() + "}");
}
// Pattern p = Pattern.compile(nextToken);
// Matcher m = p.matcher(currentFolder);
// return m.matches();
return nextToken;
}
public static boolean matchRegEx(String current, String pattern) {
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(current);
return m.matches();
}
private DateTime getFolderTime(String name, String[] pathStream) {
String compactDateString = getCompactDateString(name, pathStream);
String compactDataFormatString = getCompactDateFormatString(name, pathStream);
DateTimeFormatter dtf = DateTimeFormat.forPattern(compactDataFormatString);
DateTime parseDateTime = dtf.parseDateTime(compactDateString);
if (parseDateTime.year().get() == parseDateTime.year().getMinimumValue()) {
parseDateTime = parseDateTime.year().withMaximumValue();
}
if (parseDateTime.monthOfYear().get() == parseDateTime.monthOfYear().getMinimumValue()) {
parseDateTime = parseDateTime.monthOfYear().withMaximumValue();
}
if (parseDateTime.dayOfMonth().get() == parseDateTime.dayOfMonth().getMinimumValue()) {
parseDateTime = parseDateTime.dayOfMonth().withMaximumValue();
}
if (parseDateTime.hourOfDay().get() == parseDateTime.hourOfDay().getMinimumValue()) {
parseDateTime = parseDateTime.hourOfDay().withMaximumValue();
}
if (parseDateTime.minuteOfHour().get() == parseDateTime.minuteOfHour().getMinimumValue()) {
parseDateTime = parseDateTime.minuteOfHour().withMaximumValue();
}
if (parseDateTime.secondOfMinute().get() == parseDateTime.secondOfMinute().getMinimumValue()) {
parseDateTime = parseDateTime.secondOfMinute().withMaximumValue();
}
if (parseDateTime.millisOfSecond().get() == parseDateTime.millisOfSecond().getMinimumValue()) {
parseDateTime = parseDateTime.millisOfSecond().withMaximumValue();
}
return parseDateTime;
}
private String getCompactDateString(String name, String[] pathStream) {
String[] realTokens = StringUtils.split(name, "/");
String compactDateString = null;
for (int i = 0; i < realTokens.length; i++) {
String currentString = pathStream[i];
if (currentString.contains("${D:")) {
int startindex = currentString.indexOf("${D:");
int endindex = currentString.indexOf("}");
if (compactDateString == null) {
compactDateString = realTokens[i].substring(startindex, endindex - 4);
} else {
compactDateString += " " + realTokens[i].substring(startindex, endindex - 4);
}
}
}
return compactDateString;
}
private String getCompactDateFormatString(String name, String[] pathStream) {
String[] realTokens = StringUtils.split(name, "/");
String compactDateString = null;
//contains more than one date token?
for (int i = 0; i < realTokens.length; i++) {
String currentString = pathStream[i];
if (currentString.contains("${")) {
int startindex = currentString.indexOf("${");
int endindex = currentString.indexOf("}");
if (compactDateString == null) {
compactDateString = currentString.substring(startindex + 4, endindex);
} else {
compactDateString += " " + currentString.substring(startindex + 4, endindex);
}
}
}
return compactDateString;
}
private String[] getPathTokens(String filePath) {
// List<String> tokens = new ArrayList<String>();
// filePath.substring("\\$\\{","\\}");
String[] tokens = StringUtils.split(filePath, "/");
// String[] tokens = filePath.trim().split("\\%");
// for (int i = 0; i < tokens.length; i++) {
// System.out.println(tokens[i]);
// }
return tokens;
}
private static Boolean containsTokens(String path) {
if (path.contains("${")) {
return true;
} else {
return false;
}
}
}