package nl.ipo.cds.etl.log; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import nl.idgis.commons.jobexecutor.Job; import nl.idgis.commons.jobexecutor.JobLogger; import nl.idgis.commons.jobexecutor.JobLogger.LogLevel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class LogStringBuilder<T extends Enum<T>> implements EventLogger<T> { private static final Log technicalLog = LogFactory.getLog(LogStringBuilder.class); private JobLogger jobLogger; private Map<Object, Object> properties; public void setJobLogger(JobLogger stringLogger) { this.jobLogger = stringLogger; } public void setProperties(Map<Object, Object> properties) { this.properties = properties; } @Override public String logEvent(Job job, T messageKey, LogLevel logLevel, String... messageValues) { String message = createOneStringMessage(messageKey, messageValues); jobLogger.logString(job, messageKey.toString(), logLevel, message); return message; } public static String createStringMessage (final Map<Object, Object> properties, final String messageKey, final String ... messageValues) { technicalLog.debug(messageKey.toString()); String message; Map<Object, Object> propertiesValues = new HashMap<Object, Object>(properties); for(int i = 0; i < messageValues.length; i++) { propertiesValues.put("" + i, messageValues[i]); technicalLog.debug(i + ":\t" + messageValues[i]); } if(properties.containsKey(messageKey.toString())) { message = (String)properties.get(messageKey.toString()); // substitute properties HashSet<String> foundProperties = new HashSet<String>(); do { for(String property : foundProperties) { String placeHolder = "\\$\\{" + property + "\\}"; // handle null properties Object propValue = propertiesValues.get(property); String propertyValue = (propValue == null) ? "null" : propValue.toString(); propertyValue = propertyValue.replaceAll("\\$", "\\\\\\$"); message = message.replaceAll(placeHolder, propertyValue); } foundProperties.clear(); int varIndex = message.indexOf("${"); while(varIndex != -1 && varIndex < message.length()) { int endVarIndex = message.indexOf('}', varIndex + 1); String property = message.substring(varIndex + 2, endVarIndex); if(property.indexOf("${") == -1 && propertiesValues.containsKey(property)) { foundProperties.add(property); } varIndex = message.indexOf("${", varIndex + 1) ; } } while(foundProperties.size() > 0); } else { StringBuilder sb = new StringBuilder(messageKey.toString()); for(int i = 0; i < messageValues.length; i++) { if(i == 0) { sb.append(": "); } else { sb.append(", "); } sb.append(messageValues[i]); } message = sb.toString(); } return message; } /** * Substitute placeholders in the string corresponding to the given messageKey with values in the messageValues-array * @param messageKey * @param messageValues * @return */ private String createOneStringMessage(T messageKey, String... messageValues) { return createStringMessage (properties, messageKey.toString (), messageValues); } /* (non-Javadoc) * @see nl.ipo.cds.etl.log.EventLogger#logEvent(nl.ipo.cds.domain.Job, java.lang.Enum, nl.ipo.cds.domain.LogLevel, double, double, java.lang.String, java.lang.String[]) */ @Override public String logEvent(Job job, T messageKey, LogLevel logLevel, double x, double y, String gmlId, String... messageValues) { String message = createOneStringMessage(messageKey, messageValues); Map<String,Object> context = new HashMap<String, Object>(); context.put("X",x); context.put("Y",y); context.put("GMLID",gmlId); jobLogger.logString(job, messageKey.toString(), logLevel, message, context); return message; } @Override public String logEvent (final Job job, final T messageKey, final LogLevel logLevel, final Map<String, Object> context, final String... messageValues) { final String message = createOneStringMessage (messageKey, messageValues); jobLogger.logString (job, messageKey.toString (), logLevel, message, context); return message; } }