/* * IronJacamar, a Java EE Connector Architecture implementation * Copyright 2016, Red Hat Inc, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the Eclipse Public License 1.0 as * published by the Free Software Foundation. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse * Public License for more details. * * You should have received a copy of the Eclipse Public License * along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.ironjacamar.core.tracer; /** * A trace event * * @author <a href="mailto:jesper.pedersen@ironjacamar.org">Jesper Pedersen</a> */ public class TraceEvent { /** Get connection listener */ public static final int GET_CONNECTION_LISTENER = 0; /** Get connection listener (New) */ public static final int GET_CONNECTION_LISTENER_NEW = 1; /** Get interleaving connection listener */ public static final int GET_INTERLEAVING_CONNECTION_LISTENER = 2; /** Get connection listener interleaving (New) */ public static final int GET_INTERLEAVING_CONNECTION_LISTENER_NEW = 3; /** Return connection listener */ public static final int RETURN_CONNECTION_LISTENER = 10; /** Return connection listener with kill */ public static final int RETURN_CONNECTION_LISTENER_WITH_KILL = 11; /** Return interleaving connection listener */ public static final int RETURN_INTERLEAVING_CONNECTION_LISTENER = 12; /** Return interleaving connection listener with kill */ public static final int RETURN_INTERLEAVING_CONNECTION_LISTENER_WITH_KILL = 13; /** Clear connection listener */ public static final int CLEAR_CONNECTION_LISTENER = 14; /** Enlist connection listener */ public static final int ENLIST_CONNECTION_LISTENER = 20; /** Enlist connection listener (Failed) */ public static final int ENLIST_CONNECTION_LISTENER_FAILED = 21; /** Enlist interleaving connection listener */ public static final int ENLIST_INTERLEAVING_CONNECTION_LISTENER = 22; /** Enlist interleaving connection listener (Failed) */ public static final int ENLIST_INTERLEAVING_CONNECTION_LISTENER_FAILED = 23; /** Delist connection listener */ public static final int DELIST_CONNECTION_LISTENER = 30; /** Delist connection listener (Failed) */ public static final int DELIST_CONNECTION_LISTENER_FAILED = 31; /** Delist interleaving connection listener */ public static final int DELIST_INTERLEAVING_CONNECTION_LISTENER = 32; /** Delist interleaving connection listener (Failed) */ public static final int DELIST_INTERLEAVING_CONNECTION_LISTENER_FAILED = 33; /** Delist rollbacked connection listener */ public static final int DELIST_ROLLEDBACK_CONNECTION_LISTENER = 34; /** Delist rollbacked connection listener (Failed) */ public static final int DELIST_ROLLEDBACK_CONNECTION_LISTENER_FAILED = 35; /** Get connection */ public static final int GET_CONNECTION = 40; /** Return connection */ public static final int RETURN_CONNECTION = 41; /** Clear connection */ public static final int CLEAR_CONNECTION = 42; /** Exception */ public static final int EXCEPTION = 50; /** Create connection listner (GET) */ public static final int CREATE_CONNECTION_LISTENER_GET = 60; /** Create connection listner (PREFILL) */ public static final int CREATE_CONNECTION_LISTENER_PREFILL = 61; /** Create connection listner (INCREMENTER) */ public static final int CREATE_CONNECTION_LISTENER_INCREMENTER = 62; /** Destroy connection listner (RETURN) */ public static final int DESTROY_CONNECTION_LISTENER_RETURN = 70; /** Destroy connection listner (IDLE) */ public static final int DESTROY_CONNECTION_LISTENER_IDLE = 71; /** Destroy connection listner (INVALID) */ public static final int DESTROY_CONNECTION_LISTENER_INVALID = 72; /** Destroy connection listner (FLUSH) */ public static final int DESTROY_CONNECTION_LISTENER_FLUSH = 73; /** Destroy connection listner (ERROR) */ public static final int DESTROY_CONNECTION_LISTENER_ERROR = 74; /** Destroy connection listner (PREFILL) */ public static final int DESTROY_CONNECTION_LISTENER_PREFILL = 75; /** Destroy connection listner (INCREMENTER) */ public static final int DESTROY_CONNECTION_LISTENER_INCREMENTER = 76; /** Managed connection pool create */ public static final int MANAGED_CONNECTION_POOL_CREATE = 80; /** Managed connection pool destroy */ public static final int MANAGED_CONNECTION_POOL_DESTROY = 81; /** Push CCM context */ public static final int PUSH_CCM_CONTEXT = 90; /** Pop CCM context */ public static final int POP_CCM_CONTEXT = 91; /** Register CCM connection */ public static final int REGISTER_CCM_CONNECTION = 92; /** Unregister CCM connection */ public static final int UNREGISTER_CCM_CONNECTION = 93; /** CCM user transaction */ public static final int CCM_USER_TRANSACTION = 94; /** Unknown CCM connection */ public static final int UNKNOWN_CCM_CONNECTION = 95; /** Close CCM connection */ public static final int CLOSE_CCM_CONNECTION = 96; /** Version */ public static final int VERSION = 100; /** The pool */ private String pool; /** The managed connection pool */ private String mcp; /** The thread id */ private long threadId; /** The type */ private int type; /** The time stamp */ private long timestamp; /** The connection listener */ private String cl; /** The first payload */ private String payload1; /** The second payload */ private String payload2; /** * Constructor * @param pool The pool * @param mcp The MCP * @param type The event type * @param cl The connection listener */ TraceEvent(String pool, String mcp, int type, String cl) { this(pool, mcp, Thread.currentThread().getId(), type, System.nanoTime(), cl, "", ""); } /** * Constructor * @param pool The pool * @param mcp The MCP * @param type The event type * @param cl The connection listener * @param payload1 The first payload */ TraceEvent(String pool, String mcp, int type, String cl, String payload1) { this(pool, mcp, Thread.currentThread().getId(), type, System.nanoTime(), cl, payload1, ""); } /** * Constructor * @param pool The pool * @param mcp The MCP * @param type The event type * @param cl The connection listener * @param payload1 The first payload * @param payload2 The second payload */ TraceEvent(String pool, String mcp, int type, String cl, String payload1, String payload2) { this(pool, mcp, Thread.currentThread().getId(), type, System.nanoTime(), cl, payload1, payload2); } /** * Parse constructor * @param pool The pool * @param mcp The MCP * @param threadId The thread id * @param type The event type * @param timestamp The timestamp * @param cl The connection listener * @param payload1 The first payload * @param payload2 The second payload */ private TraceEvent(String pool, String mcp, long threadId, int type, long timestamp, String cl, String payload1, String payload2) { this.pool = pool != null ? pool.replace('-', '_') : "Empty"; this.mcp = mcp; this.threadId = threadId; this.type = type; this.timestamp = timestamp; this.cl = cl; this.payload1 = payload1; this.payload2 = payload2; } /** * Get the pool * @return The value */ public String getPool() { return pool; } /** * Get the managed connection pool * @return The value */ public String getManagedConnectionPool() { return mcp; } /** * Get the thread id * @return The value */ public long getThreadId() { return threadId; } /** * Get the type * @return The value */ public int getType() { return type; } /** * Get the timestamp * @return The value */ public long getTimestamp() { return timestamp; } /** * Get the connection listener * @return The value */ public String getConnectionListener() { return cl; } /** * Get the first payload * @return The value */ public String getPayload1() { return payload1; } /** * Get the second payload * @return The value */ public String getPayload2() { return payload2; } /** * {@inheritDoc} */ public String toString() { StringBuilder sb = new StringBuilder(); sb.append("IJTRACER"); sb.append("-"); sb.append(pool); sb.append("-"); sb.append(mcp); sb.append("-"); sb.append(Long.toString(threadId)); sb.append("-"); sb.append(Integer.toString(type)); sb.append("-"); sb.append(Long.toString(timestamp)); sb.append("-"); sb.append(cl); sb.append("-"); sb.append(payload1); sb.append("-"); sb.append(payload2); return sb.toString(); } /** * As text * @param event The event * @return The text */ public static String asText(TraceEvent event) { switch (event.getType()) { case GET_CONNECTION_LISTENER: return "getConnectionListener()"; case GET_CONNECTION_LISTENER_NEW: return "getConnectionListener(true)"; case GET_INTERLEAVING_CONNECTION_LISTENER: return "getConnectionListener() (I)"; case GET_INTERLEAVING_CONNECTION_LISTENER_NEW: return "getConnectionListener(true) (I)"; case RETURN_CONNECTION_LISTENER: return "returnConnectionListener()"; case RETURN_CONNECTION_LISTENER_WITH_KILL: return "returnConnectionListener(true)"; case RETURN_INTERLEAVING_CONNECTION_LISTENER: return "returnConnectionListener() (I)"; case RETURN_INTERLEAVING_CONNECTION_LISTENER_WITH_KILL: return "returnConnectionListener(true) (I)"; case CLEAR_CONNECTION_LISTENER: return "clearConnectionListener()"; case ENLIST_CONNECTION_LISTENER: return "enlistResource()"; case ENLIST_CONNECTION_LISTENER_FAILED: return "enlistResource(false)"; case ENLIST_INTERLEAVING_CONNECTION_LISTENER: return "enlistResource() (I)"; case ENLIST_INTERLEAVING_CONNECTION_LISTENER_FAILED: return "enlistResource(false) (I)"; case DELIST_CONNECTION_LISTENER: return "delistResource()"; case DELIST_CONNECTION_LISTENER_FAILED: return "delistResource(false)"; case DELIST_INTERLEAVING_CONNECTION_LISTENER: return "delistResource() (I)"; case DELIST_INTERLEAVING_CONNECTION_LISTENER_FAILED: return "delistResource(false) (I)"; case DELIST_ROLLEDBACK_CONNECTION_LISTENER: return "delistResource() (R)"; case DELIST_ROLLEDBACK_CONNECTION_LISTENER_FAILED: return "delistResource(false) (R)"; case GET_CONNECTION: return "getConnection(" + event.getPayload1() + ")"; case RETURN_CONNECTION: return "returnConnection(" + event.getPayload1() + ")"; case CLEAR_CONNECTION: return "clearConnection(" + event.getPayload1() + ")"; case EXCEPTION: return "exception"; case CREATE_CONNECTION_LISTENER_GET: return "createConnectionListener(GET)"; case CREATE_CONNECTION_LISTENER_PREFILL: return "createConnectionListener(PREFILL)"; case CREATE_CONNECTION_LISTENER_INCREMENTER: return "createConnectionListener(INCREMENTER)"; case DESTROY_CONNECTION_LISTENER_RETURN: return "destroyConnectionListener(RETURN)"; case DESTROY_CONNECTION_LISTENER_IDLE: return "destroyConnectionListener(IDLE)"; case DESTROY_CONNECTION_LISTENER_INVALID: return "destroyConnectionListener(INVALID)"; case DESTROY_CONNECTION_LISTENER_FLUSH: return "destroyConnectionListener(FLUSH)"; case DESTROY_CONNECTION_LISTENER_ERROR: return "destroyConnectionListener(ERROR)"; case DESTROY_CONNECTION_LISTENER_PREFILL: return "destroyConnectionListener(PREFILL)"; case DESTROY_CONNECTION_LISTENER_INCREMENTER: return "destroyConnectionListener(INCREMENTER)"; case MANAGED_CONNECTION_POOL_CREATE: return "createManagedConnectionPool()"; case MANAGED_CONNECTION_POOL_DESTROY: return "destroyManagedConnectionPool()"; case PUSH_CCM_CONTEXT: return "pushContext()"; case POP_CCM_CONTEXT: return "popContext()"; case REGISTER_CCM_CONNECTION: return "registerConnection()"; case UNREGISTER_CCM_CONNECTION: return "unregisterConnection()"; case CCM_USER_TRANSACTION: return "userTransaction()"; case UNKNOWN_CCM_CONNECTION: return "unknownConnection()"; case CLOSE_CCM_CONNECTION: return "closeConnection()"; case VERSION: return "version()"; default: } return ""; } /** * Parse a trace event * @param data The data string * @return The event */ public static TraceEvent parse(String data) { String[] raw = data.split("-"); String header = raw[0]; String p = raw[1]; String m = raw[2]; long tid = Long.parseLong(raw[3]); int t = Integer.parseInt(raw[4]); long ts = Long.parseLong(raw[5]); String c = raw[6]; String pyl = ""; String py2 = ""; if (raw.length >= 8) pyl = raw[7]; if (raw.length >= 9) py2 = raw[8]; return new TraceEvent(p, m, tid, t, ts, c, pyl, py2); } }