/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.contrib.failmon; import java.net.InetAddress; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.text.DateFormat; /********************************************************** * Objects of this class hold the serialized representations * of EventRecords. A SerializedRecord is essentially an EventRecord * with all its property values converted to strings. It also provides * some convenience methods for printing the property fields in a * more readable way. * **********************************************************/ public class SerializedRecord { HashMap<String, String> fields; private static DateFormat dateFormatter = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);; /** * Create the SerializedRecord given an EventRecord. */ public SerializedRecord(EventRecord source) { fields = new HashMap<String, String>(); fields.clear(); for (String k : source.getMap().keySet()) { ArrayList<String> strs = getStrings(source.getMap().get(k)); if (strs.size() == 1) fields.put(k, strs.get(0)); else for (int i = 0; i < strs.size(); i++) fields.put(k + "#" + i, strs.get(i)); } } /** * Extract String representations from an Object. * * @param o the input object * * @return an ArrayList that contains Strings found in o */ private ArrayList<String> getStrings(Object o) { ArrayList<String> retval = new ArrayList<String>(); retval.clear(); if (o == null) retval.add("null"); else if (o instanceof String) retval.add((String) o); else if (o instanceof Calendar) retval.add(dateFormatter.format(((Calendar) o).getTime())); else if (o instanceof InetAddress[]) for (InetAddress ip : ((InetAddress[]) o)) retval.add(ip.getHostAddress()); else if (o instanceof String[]) for (String s : (String []) o) retval.add(s); else retval.add(o.toString()); return retval; } /** * Set the value of a property of the EventRecord. * * @param fieldName the name of the property to set * @param fieldValue the value of the property to set * */ public void set(String fieldName, String fieldValue) { fields.put(fieldName, fieldValue); } /** * Get the value of a property of the EventRecord. * If the property with the specific key is not found, * null is returned. * * @param fieldName the name of the property to get. */ public String get(String fieldName) { return fields.get(fieldName); } /** * Arrange the keys to provide a more readable printing order: * first goes the timestamp, then the hostname and then the type, followed * by all other keys found. * * @param keys The input ArrayList of keys to re-arrange. */ public static void arrangeKeys(ArrayList<String> keys) { move(keys, "timestamp", 0); move(keys, "hostname", 1); move(keys, "type", 2); } private static void move(ArrayList<String> keys, String key, int position) { int cur = keys.indexOf(key); if (cur == -1) return; keys.set(cur, keys.get(position)); keys.set(position, key); } /** * Check if the SerializedRecord is a valid one, i.e., whether * it represents meaningful metric values. * * @return true if the EventRecord is a valid one, false otherwise. */ public boolean isValid() { return !("invalid".equalsIgnoreCase(fields.get("hostname"))); } /** * Creates and returns a string reperssentation of the object * * @return a String representing the object */ public String toString() { String retval = ""; ArrayList<String> keys = new ArrayList<String>(fields.keySet()); arrangeKeys(keys); for (int i = 0; i < keys.size(); i++) { String value = fields.get(keys.get(i)); if (value == null) retval += keys.get(i) + ":\tnull\n"; else retval += keys.get(i) + ":\t" + value + "\n"; } return retval; } }