/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyright [year] [name of copyright owner]". * * Copyright 2006-2008 Sun Microsystems, Inc. * Portions Copyright 2014-2015 ForgeRock AS. */ package org.opends.server.loggers; import java.util.Arrays; import java.util.IllegalFormatException; import java.util.Iterator; import java.util.List; import java.util.Map; /** * This class is responsible for formatting messages and replacing * format tokens with the text value of message arguments in debug logging * records. */ class DebugMessageFormatter { /** * Format the message format string with the provided arguments. * * @param msg the message format string to be formatted. * @param msgArgs the arguments to use when replacing tokens in the message. * @return the formatted message string. */ static String format(String msg, Object[] msgArgs) { StringBuilder buffer= new StringBuilder(); Object[] decoratedArgs = decorateMessageArgs(msgArgs); if (msg == null) { concatenateArgs(decoratedArgs, buffer); return buffer.toString(); } try { return String.format(msg, decoratedArgs); } catch (IllegalFormatException e) { // Make a more useful message than a stack trace. buffer.append(msg); concatenateArgs(decoratedArgs, buffer); return buffer.toString(); } } private static void concatenateArgs(Object[] args, StringBuilder buffer) { if (args != null) { for (Object arg : args) { buffer.append(" ").append(arg); } } } private static Object[] decorateMessageArgs(Object[] undecoratedArgs) { Object[] args= null; if (undecoratedArgs != null) { args= new Object[undecoratedArgs.length]; for (int i= 0; i < args.length; i++) { args[i]= decorateArg(undecoratedArgs[i]); } } return args; } private static Object decorateArg(Object arg) { Object decoratedArg= arg; if (arg instanceof Map) { decoratedArg= decorateMapArg((Map)arg); } else if (arg instanceof List) { decoratedArg= decorateListArg((List)arg); } else if (arg instanceof Object[]) { decoratedArg= decorateArrayArg((Object[])arg); } else if (arg instanceof boolean[]) { decoratedArg = decorateArrayArg((boolean[])arg); } else if (arg instanceof byte[]) { decoratedArg = decorateArrayArg((byte[])arg); } else if (arg instanceof char[]) { decoratedArg = decorateArrayArg((char[])arg); } else if (arg instanceof double[]) { decoratedArg = decorateArrayArg((double[])arg); } else if (arg instanceof float[]) { decoratedArg = decorateArrayArg((float[])arg); } else if (arg instanceof int[]) { decoratedArg = decorateArrayArg((int[])arg); } else if (arg instanceof long[]) { decoratedArg = decorateArrayArg((long[])arg); } return decoratedArg; } private static String decorateArrayArg(Object[] array) { return decorateListArg(Arrays.asList(array)); } private static String decorateArrayArg(boolean[] array) { StringBuilder buffer= new StringBuilder(); buffer.append("[ "); for (int i= 0; i < array.length; i++) { if (i > 0) { buffer.append(", "); } buffer.append(array[i]); } buffer.append(" ]"); return buffer.toString(); } private static String decorateArrayArg(byte[] array) { StringBuilder buffer= new StringBuilder(); buffer.append("[ "); for (int i= 0; i < array.length; i++) { if (i > 0) { buffer.append(", "); } buffer.append(array[i]); } buffer.append(" ]"); return buffer.toString(); } private static String decorateArrayArg(char[] array) { StringBuilder buffer= new StringBuilder(); buffer.append("[ "); for (int i= 0; i < array.length; i++) { if (i > 0) { buffer.append(", "); } buffer.append(array[i]); } buffer.append(" ]"); return buffer.toString(); } private static String decorateArrayArg(double[] array) { StringBuilder buffer= new StringBuilder(); buffer.append("[ "); for (int i= 0; i < array.length; i++) { if (i > 0) { buffer.append(", "); } buffer.append(array[i]); } buffer.append(" ]"); return buffer.toString(); } private static String decorateArrayArg(float[] array) { StringBuilder buffer= new StringBuilder(); buffer.append("[ "); for (int i= 0; i < array.length; i++) { if (i > 0) { buffer.append(", "); } buffer.append(array[i]); } buffer.append(" ]"); return buffer.toString(); } private static String decorateArrayArg(int[] array) { StringBuilder buffer= new StringBuilder(); buffer.append("[ "); for (int i= 0; i < array.length; i++) { if (i > 0) { buffer.append(", "); } buffer.append(array[i]); } buffer.append(" ]"); return buffer.toString(); } private static String decorateArrayArg(long[] array) { StringBuilder buffer= new StringBuilder(); buffer.append("[ "); for (int i= 0; i < array.length; i++) { if (i > 0) { buffer.append(", "); } buffer.append(array[i]); } buffer.append(" ]"); return buffer.toString(); } private static String decorateListArg(List list) { StringBuilder buffer= new StringBuilder(); Iterator iter= list.iterator(); buffer.append("[ "); boolean firstElement= true; while (iter.hasNext()) { Object lValue= iter.next(); if (!firstElement) { buffer.append(", "); } buffer.append(decorateArg(lValue)); firstElement= false; } buffer.append(" ]"); return buffer.toString(); } private static String decorateMapArg(Map map) { StringBuilder buffer= new StringBuilder(); Iterator iter= map.entrySet().iterator(); buffer.append("{ "); boolean firstEntry= true; while (iter.hasNext()) { Map.Entry entry= (Map.Entry)iter.next(); if (!firstEntry) { buffer.append(", "); } buffer.append(decorateArg(entry.getKey())); buffer.append("="); buffer.append(decorateArg(entry.getValue())); firstEntry= false; } buffer.append(" }"); return buffer.toString(); } }