/* * 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.activemq.artemis.core.transaction; import javax.json.JsonArrayBuilder; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.transaction.xa.Xid; import java.text.DateFormat; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.activemq.artemis.api.core.JsonUtil; import org.apache.activemq.artemis.api.core.Message; import org.apache.activemq.artemis.core.server.MessageReference; import org.apache.activemq.artemis.core.transaction.impl.XidImpl; import org.apache.activemq.artemis.utils.JsonLoader; public abstract class TransactionDetail { public static final String KEY_CREATION_TIME = "creation_time"; public static final String KEY_XID_AS_BASE64 = "xid_as_base64"; public static final String KEY_XID_FORMAT_ID = "xid_format_id"; public static final String KEY_XID_GLOBAL_TXID = "xid_global_txid"; public static final String KEY_XID_BRANCH_QUAL = "xid_branch_qual"; public static final String KEY_TX_RELATED_MESSAGES = "tx_related_messages"; public static final String KEY_MSG_OP_TYPE = "message_operation_type"; public static final String KEY_MSG_BODY_BUFFER = "message_body"; public static final String KEY_MSG_TYPE = "message_type"; public static final String KEY_MSG_PROPERTIES = "message_properties"; private final Xid xid; private final Transaction transaction; private final Long creationTime; public TransactionDetail(Xid xid, Transaction tx, Long creation) { this.xid = xid; this.transaction = tx; this.creationTime = creation; } public JsonObject toJSON() throws Exception { DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); JsonObjectBuilder detailJson = JsonLoader.createObjectBuilder().add(KEY_CREATION_TIME, dateFormat.format(new Date(this.creationTime))).add(KEY_XID_AS_BASE64, XidImpl.toBase64String(this.xid)).add(KEY_XID_FORMAT_ID, this.xid.getFormatId()).add(KEY_XID_GLOBAL_TXID, new String(this.xid.getGlobalTransactionId())).add(KEY_XID_BRANCH_QUAL, new String(this.xid.getBranchQualifier())); JsonArrayBuilder msgsJson = JsonLoader.createArrayBuilder(); List<TransactionOperation> txops = null; if (this.transaction != null) { txops = this.transaction.getAllOperations(); } if (txops == null) { return detailJson.build(); } for (TransactionOperation op : txops) { String opClassName = op.getClass().getName(); String opType = null; if (opClassName.equals("org.apache.activemq.artemis.core.postoffice.impl.PostOfficeImpl$AddOperation")) { opType = "(+) send"; } else if (opClassName.equals("org.apache.activemq.artemis.core.server.impl.QueueImpl$RefsOperation")) { opType = "(-) receive"; } List<MessageReference> msgs = op.getRelatedMessageReferences(); if (msgs == null) { continue; } for (MessageReference ref : msgs) { JsonObjectBuilder msgJson = JsonLoader.createObjectBuilder(); msgJson.add(KEY_MSG_OP_TYPE, opType); Message msg = ref.getMessage().copy(); msgJson.add(KEY_MSG_TYPE, decodeMessageType(msg)); JsonUtil.addToObject(KEY_MSG_PROPERTIES, decodeMessageProperties(msg), msgJson); msgsJson.add(msgJson); } } detailJson.add(KEY_TX_RELATED_MESSAGES, msgsJson); return detailJson.build(); } public abstract String decodeMessageType(Message msg); public abstract Map<String, Object> decodeMessageProperties(Message msg); }