package com.intuit.tank.filter;
/*
* #%L
* JSF Support Beans
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.dao.ScriptFilterActionDao;
import com.intuit.tank.dao.ScriptFilterDao;
import com.intuit.tank.project.ScriptFilter;
import com.intuit.tank.project.ScriptFilterAction;
@Named
@ApplicationScoped
public class UpgradeFilters implements Serializable {
private static final String FUNCTION_STRING_CONCAT_FULL = "#{function.string.concat}";
private static final String FUNCTION_STRING_CONCAT = "#function.string.concat.";
private static final String FUNCTION_STRING_GET_CSV = "#function.generic.getcsv.";
private static final Pattern pattern = Pattern.compile("(\\@[\\w_-]*)");
private static final long serialVersionUID = 1L;
private static final Logger LOG = LogManager.getLogger(UpgradeFilters.class);
private boolean filtersUpgraded;
public boolean isDisabled() {
return filtersUpgraded;
}
public synchronized void upgrade() {
if (!filtersUpgraded) {
try {
ScriptFilterDao filterDao = new ScriptFilterDao();
ScriptFilterActionDao actionDao = new ScriptFilterActionDao();
List<ScriptFilter> all = filterDao.findAll();
Set<Integer> toDelete = new HashSet<Integer>();
for (ScriptFilterAction act : actionDao.findAll()) {
toDelete.add(act.getId());
}
for (ScriptFilter filter : all) {
for (ScriptFilterAction action : filter.getActions()) {
toDelete.remove(action.getId());
String value = action.getValue();
String original = value;
if (value.startsWith("@") && value.lastIndexOf('@') == 0) {
value = "#{" + value.substring(1) + "}";
} else if (value.startsWith(FUNCTION_STRING_CONCAT_FULL)) {
value = value.substring(FUNCTION_STRING_CONCAT_FULL.length());
} else if (value.startsWith(FUNCTION_STRING_CONCAT)) {
value = processConcat(value);
} else if (value.startsWith(FUNCTION_STRING_GET_CSV)) {
value = processFunction("ioFunctions.getCSVData", value);
} else if (value.indexOf('@') != -1) {
value = replaceVariables(value);
}
if (!original.equals(value)) {
action.setValue(value);
actionDao.saveOrUpdate(action);
}
}
}
for (Integer id : toDelete) {
actionDao.delete(id);
}
// filterDao.persistCollection(toModify);
filtersUpgraded = true;
} catch (Exception e) {
LOG.error("Error upgrading filters: " + e, e);
}
}
}
private String replaceVariables(String value) {
String ret = value;
Matcher m = pattern.matcher(value);
while (m.find()) { // find next match
String group = m.group(1).trim();
ret = ret.replace(group, "#{" + group.substring(1) + "}");
}
return ret;
}
private String processConcat(String value) {
String[] strings = StringUtils.split(value.substring(FUNCTION_STRING_CONCAT.length()), '.');
StringBuilder sb = new StringBuilder();
for (String s : strings) {
s = s.replace("-dot-", ".");
if (s.startsWith("@")) {
s = "#{" + s.substring(1) + "}";
}
sb.append(s);
}
return sb.toString();
}
private String processFunction(String function, String value) {
String[] strings = StringUtils.split(value, '.');
StringBuilder sb = new StringBuilder().append("#{").append(function).append("(");
for (int i = 3; i < strings.length; i++) {
String s = strings[i];
s = s.replace("-dot-", ".");
if (s.startsWith("@")) {
s = "#{" + s.substring(1) + "}";
} else if (s.startsWith("#{")) {
s = s.substring(2, s.length() - 1);
} else if (!NumberUtils.isNumber(s)) {
s = '"' + s + '"';
}
sb.append(s);
if (i < strings.length - 1) {
// last one
sb.append(", ");
}
}
sb.append(")}");
return sb.toString();
}
}