/* * Copyright (c) 2001-2007 Sun Microsystems, Inc. All rights reserved. * * The Sun Project JXTA(TM) Software License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by Sun Microsystems, Inc. for JXTA(TM) technology." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must * not be used to endorse or promote products derived from this software * without prior written permission. For written permission, please contact * Project JXTA at http://www.jxta.org. * * 5. Products derived from this software may not be called "JXTA", nor may * "JXTA" appear in their name, without prior written permission of Sun. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN * MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * JXTA is a registered trademark of Sun Microsystems, Inc. in the United * States and other countries. * * Please see the license information page at : * <http://www.jxta.org/project/www/license.html> for instructions on use of * the license in source files. * * ==================================================================== * * This software consists of voluntary contributions made by many individuals * on behalf of Project JXTA. For more information on Project JXTA, please see * http://www.jxta.org. * * This license is based on the BSD license adopted by the Apache Foundation. */ package net.jxta.impl.endpoint.endpointMeter; import net.jxta.document.Element; import net.jxta.document.TextElement; import net.jxta.util.documentSerializable.DocumentSerializable; import net.jxta.util.documentSerializable.DocumentSerializableUtilities; import net.jxta.util.documentSerializable.DocumentSerializationException; import java.util.Enumeration; /** * Aggregate Metric for Endpoint Monitoring **/ public class EndpointMetric implements DocumentSerializable { private long endpointStartTime; private long endpointUpTime; private int invalidIncomingMessage; private int noListenerForIncomingMessage; private int errorProcessingIncomingMessage; private int noDestinationAddressForDemuxMessage; private int noSourceAddressForDemuxMessage; private int discardedLoopbackDemuxMessage; private int incomingMessageFilteredOut; private int incomingMessageSentToEndpointListener; private int demuxMessageProcessed; public EndpointMetric() { endpointStartTime = System.currentTimeMillis(); } public EndpointMetric(EndpointMetric prototype) { endpointStartTime = prototype.endpointStartTime; } void invalidIncomingMessage() { invalidIncomingMessage++; } void noListenerForIncomingMessage() { noListenerForIncomingMessage++; } void errorProcessingIncomingMessage() { errorProcessingIncomingMessage++; } void noDestinationAddressForDemuxMessage() { noDestinationAddressForDemuxMessage++; } void noSourceAddressForDemuxMessage() { noSourceAddressForDemuxMessage++; } void discardedLoopbackDemuxMessage() { discardedLoopbackDemuxMessage++; } void incomingMessageFilteredOut() { incomingMessageFilteredOut++; } void incomingMessageSentToEndpointListener() { incomingMessageSentToEndpointListener++; } void demuxMessageProcessed() { demuxMessageProcessed++; } void setEndpointUpTime(long endpointUpTime) { this.endpointUpTime = endpointUpTime; } /** Get the time this Endpoint was created, essentially the boot time of the PeerGroup **/ public long getEndpointStartTime() { return endpointStartTime; } /** Get the time this Endpoint has been up **/ public long getEndpointUpTime() { return endpointUpTime; } /** The number of messages received that had invalid formats **/ public int getInvalidIncomingMessage() { return invalidIncomingMessage; } /** The number of messages received that had no listeners **/ public int getNoListenerForIncomingMessage() { return noListenerForIncomingMessage; } /** The number of messages whose local listeners threw exceptions **/ public int getErrorProcessingIncomingMessage() { return errorProcessingIncomingMessage; } /** The number of messages that couldn't be demuxed because there was no destination address **/ public int getNoDestinationAddressForDemuxMessage() { return noDestinationAddressForDemuxMessage; } /** The number of messages that couldn't be demuxed because there was no source address **/ public int getNoSourceAddressForDemuxMessage() { return noSourceAddressForDemuxMessage; } /** The number of messages that were discarded because of loopback detection **/ public int getDiscardedLoopbackDemuxMessage() { return discardedLoopbackDemuxMessage; } /** The number of messages that were discarded because of filtering **/ public int getIncomingMessageFilteredOut() { return incomingMessageFilteredOut; } /** The number of messages that sent to registered listeners **/ public int getIncomingMessageSentToEndpointListener() { return incomingMessageSentToEndpointListener; } /** The number of messages that were processed through demux **/ public int getDemuxMessageProcessed() { return demuxMessageProcessed; } public void serializeTo(Element element) throws DocumentSerializationException { if (endpointStartTime != 0) { DocumentSerializableUtilities.addLong(element, "endpointStartTime", endpointStartTime); } if (endpointUpTime != 0) { DocumentSerializableUtilities.addLong(element, "endpointUpTime", endpointUpTime); } if (invalidIncomingMessage != 0) { DocumentSerializableUtilities.addInt(element, "invalidIncomingMessage", invalidIncomingMessage); } if (noListenerForIncomingMessage != 0) { DocumentSerializableUtilities.addInt(element, "noListenerForIncomingMessage", noListenerForIncomingMessage); } if (errorProcessingIncomingMessage != 0) { DocumentSerializableUtilities.addInt(element, "errorProcessingIncomingMessage", errorProcessingIncomingMessage); } if (noDestinationAddressForDemuxMessage != 0) { DocumentSerializableUtilities.addInt(element, "noDestinationAddressForDemuxMessage" , noDestinationAddressForDemuxMessage); } if (noSourceAddressForDemuxMessage != 0) { DocumentSerializableUtilities.addInt(element, "noSourceAddressForDemuxMessage", noSourceAddressForDemuxMessage); } if (discardedLoopbackDemuxMessage != 0) { DocumentSerializableUtilities.addInt(element, "discardedLoopbackDemuxMessage", discardedLoopbackDemuxMessage); } if (incomingMessageFilteredOut != 0) { DocumentSerializableUtilities.addInt(element, "incomingMessageFilteredOut", incomingMessageFilteredOut); } if (incomingMessageSentToEndpointListener != 0) { DocumentSerializableUtilities.addInt(element, "incomingMessageSentToEndpointListener" , incomingMessageSentToEndpointListener); } if (demuxMessageProcessed != 0) { DocumentSerializableUtilities.addInt(element, "demuxMessageProcessed", demuxMessageProcessed); } } public void initializeFrom(Element element) throws DocumentSerializationException { for (Enumeration e = element.getChildren(); e.hasMoreElements();) { Element childElement = (TextElement) e.nextElement(); String tagName = (String) childElement.getKey(); if (tagName.equals("endpointStartTime")) { endpointStartTime = DocumentSerializableUtilities.getLong(childElement); } if (tagName.equals("endpointUpTime")) { endpointUpTime = DocumentSerializableUtilities.getLong(childElement); } if (tagName.equals("invalidIncomingMessage")) { invalidIncomingMessage = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("noListenerForIncomingMessage")) { noListenerForIncomingMessage = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("errorProcessingIncomingMessage")) { errorProcessingIncomingMessage = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("noDestinationAddressForDemuxMessage")) { noDestinationAddressForDemuxMessage = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("noSourceAddressForDemuxMessage")) { noSourceAddressForDemuxMessage = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("invalidIncomingMessage")) { invalidIncomingMessage = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("discardedLoopbackDemuxMessage")) { discardedLoopbackDemuxMessage = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("incomingMessageFilteredOut")) { incomingMessageFilteredOut = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("incomingMessageSentToEndpointListener")) { incomingMessageSentToEndpointListener = DocumentSerializableUtilities.getInt(childElement); } else if (tagName.equals("demuxMessageProcessed")) { demuxMessageProcessed = DocumentSerializableUtilities.getInt(childElement); } } } public void mergeMetrics(EndpointMetric other) { if (other == null) { return; } endpointStartTime = other.endpointStartTime; if (other.endpointUpTime != 0) { endpointUpTime = other.endpointUpTime; } invalidIncomingMessage += other.invalidIncomingMessage; noListenerForIncomingMessage += other.noListenerForIncomingMessage; errorProcessingIncomingMessage += other.errorProcessingIncomingMessage; noDestinationAddressForDemuxMessage += other.noDestinationAddressForDemuxMessage; noSourceAddressForDemuxMessage += other.noSourceAddressForDemuxMessage; discardedLoopbackDemuxMessage += other.discardedLoopbackDemuxMessage; incomingMessageSentToEndpointListener += other.incomingMessageSentToEndpointListener; demuxMessageProcessed += other.demuxMessageProcessed; } }