73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts/*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The contents of this file are subject to the terms
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of the Common Development and Distribution License
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (the License). You may not use this file except in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You can obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * opensso/legal/CDDLv1.0.txt
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at opensso/legal/CDDLv1.0.txt.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, add the following below the CDDL Header,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * with the fields enclosed by brackets [] replaced by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * your own identifying information:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: LogMessageID.java,v 1.6 2008/08/27 22:08:38 veiming Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts * Portions Copyrighted 2011-2015 ForgeRock AS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.log.messageid;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpottsimport static com.sun.identity.log.messageid.LogMessageConstants.XML_DATAINFO_TAG_NAME;
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.log.spi.Debug;
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpottsimport java.util.ArrayList;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashMap;
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpottsimport java.util.List;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Map;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.logging.Level;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport org.w3c.dom.Element;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport org.w3c.dom.Node;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport org.w3c.dom.NodeList;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Log Message ID is a unique identifier for each log message.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class LogMessageID {
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts private final List<String> dataInfoColumns;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Level logLevel;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String prefix;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private int id;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String name;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String description;
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts private int dataInfoSize;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static Map mapLogLevel = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapLogLevel.put("LL_CONFIG", Level.CONFIG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapLogLevel.put("LL_FINE", Level.FINE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapLogLevel.put("LL_FINER", Level.FINER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapLogLevel.put("LL_FINEST", Level.FINEST);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapLogLevel.put("LL_INFO", Level.INFO);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapLogLevel.put("LL_SEVERE", Level.SEVERE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapLogLevel.put("LL_ALL", Level.ALL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Constructs a log message ID instance.
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts * @param logLevel Log level.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param prefix Prefix of this log.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param id Unique Identification number.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param name Unique name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param description Description of this log.
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts * @param dataInfoColumns Information on the data logged.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public LogMessageID(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Level logLevel,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String prefix,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int id,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String description,
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts List<String> dataInfoColumns
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.logLevel = logLevel;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.prefix = prefix;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.id = id;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.name = name;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.description = description;
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts this.dataInfoSize = dataInfoColumns.size();
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts this.dataInfoColumns = dataInfoColumns;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns log level.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return log level.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Level getLogLevel() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return logLevel;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns prefix.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return prefix.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getPrefix() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return prefix;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getName() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return name;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns id.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public int getID() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return id;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns description.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return description.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getDescription() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return description;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns number of entries in the data column.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return number of entries in the data column.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public int getNumberOfEntriesInDataColumn() {
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts return dataInfoSize;
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts }
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts /**
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts * Get the names of the data columns for the log message.
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts * @return The column names.
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts */
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts public List<String> getDataColumns() {
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts return dataInfoColumns;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static LogMessageID createInstance(String prefix, Node node) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogMessageID messageID = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((node != null) && (node.getNodeType() == Node.ELEMENT_NODE)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String nodeName = node.getNodeName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (nodeName.equals(LogMessageConstants.XML_LOG_MESSAGE_TAG_NAME)){
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name = ((Element)node).getAttribute(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogMessageConstants.XML_ATTRNAME_LOG_MESSAGE_NAME);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String id = ((Element)node).getAttribute(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogMessageConstants.XML_ATTRNAME_LOG_MESSAGE_ID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String logLevel = ((Element)node).getAttribute(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogMessageConstants.XML_ATTRNAME_LOG_LEVEL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String description = ((Element)node).getAttribute(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LogMessageConstants.XML_ATTRNAME_LOG_MESSAGE_DESCRIPTION);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((name.length() > 0) && (id.length() > 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts Node datainfo = getNodeOfName(node, XML_DATAINFO_TAG_NAME);
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts List<String> dataColumns = new ArrayList<>();
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts if (datainfo != null) {
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts NodeList dataInfoItems = ((Element)datainfo).getElementsByTagName("item");
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts for (int i = 0; i < dataInfoItems.getLength(); i++) {
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts dataColumns.add(dataInfoItems.item(i).getTextContent().trim());
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts }
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster messageID = new LogMessageID(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (Level)mapLogLevel.get(logLevel), prefix,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Integer.parseInt(id), name, description,
73db2ddb960cafd7ffb6daf89eb697910d36c56dJames Phillpotts dataColumns);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (NumberFormatException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.error("LogMessageID.createInstance", e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Debug.error("LogMessageID.createInstance: " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "unable to create log message ID because its name is missing");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return messageID;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static int getArrayCount(Node node, String tagName) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int count = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node target = getNodeOfName(node, tagName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (target != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster NodeList items = target.getChildNodes();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int sz = items.getLength();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < sz; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node item = items.item(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (item.getNodeName().equals("item")) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster count++;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return count;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static Node getNodeOfName(Node node, String tagName) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node target = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster NodeList nodelist = node.getChildNodes();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (nodelist != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int sz = nodelist.getLength();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; (i < sz) && (target == null); i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node item = nodelist.item(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (item.getNodeName().equals(tagName)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster target = item;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return target;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}