/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2009-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.sms.monitor.internal.config;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.opennms.sms.monitor.MobileSequenceSession;
import org.opennms.sms.reflector.smsservice.MobileMsgRequest;
import org.opennms.sms.reflector.smsservice.MobileMsgResponse;
import org.opennms.sms.reflector.smsservice.MobileMsgResponseHandler;
/**
* <p>MobileSequenceTransaction class.</p>
*
* @author ranger
* @version $Id: $
*/
@XmlRootElement(name="transaction")
@XmlType(propOrder={"request", "responses"})
public class MobileSequenceTransaction implements Comparable<MobileSequenceTransaction> {
/* containing sequenceConfig */
private MobileSequenceConfig m_sequenceConfig;
/* attributes and sub elements */
private String m_label;
private String m_gatewayId;
private MobileSequenceRequest m_request;
private List<MobileSequenceResponse> m_responses;
/* other data */
private String m_defaultGatewayId;
/**
* <p>Constructor for MobileSequenceTransaction.</p>
*/
public MobileSequenceTransaction() {
}
/**
* <p>Constructor for MobileSequenceTransaction.</p>
*
* @param label a {@link java.lang.String} object.
*/
public MobileSequenceTransaction(String label) {
setLabel(label);
}
/**
* <p>Constructor for MobileSequenceTransaction.</p>
*
* @param gatewayId a {@link java.lang.String} object.
* @param label a {@link java.lang.String} object.
*/
public MobileSequenceTransaction(String gatewayId, String label) {
this(label);
setGatewayId(gatewayId);
}
/**
* <p>getLabel</p>
*
* @return a {@link java.lang.String} object.
*/
@XmlAttribute(name="label", required=true)
public String getLabel() {
return m_label;
}
/**
* <p>setLabel</p>
*
* @param label a {@link java.lang.String} object.
*/
public void setLabel(String label) {
m_label = label;
}
/**
* <p>getGatewayId</p>
*
* @return a {@link java.lang.String} object.
*/
@XmlAttribute(name="gatewayId", required=false)
public String getGatewayId() {
return m_gatewayId;
}
/**
* <p>setGatewayId</p>
*
* @param gatewayId a {@link java.lang.String} object.
*/
public void setGatewayId(String gatewayId) {
m_gatewayId = gatewayId;
}
/**
* <p>getRequest</p>
*
* @return a {@link org.opennms.sms.monitor.internal.config.MobileSequenceRequest} object.
*/
@XmlElementRef
public MobileSequenceRequest getRequest() {
return m_request;
}
/**
* <p>setRequest</p>
*
* @param request a {@link org.opennms.sms.monitor.internal.config.MobileSequenceRequest} object.
*/
public void setRequest(MobileSequenceRequest request) {
if (m_request != null) {
m_request.setTransaction(null);
}
m_request = request;
if (request != null) {
request.setTransaction(this);
}
}
/**
* <p>getResponses</p>
*
* @return a {@link java.util.List} object.
*/
@XmlElementRef
public List<MobileSequenceResponse> getResponses() {
if (m_responses == null) {
m_responses = createResponsesList();
}
return m_responses;
}
private List<MobileSequenceResponse> createResponsesList() {
return new TriggeredList<MobileSequenceResponse>() {
@Override
protected void onAdd(int index, MobileSequenceResponse element) {
element.setTransaction(MobileSequenceTransaction.this);
}
@Override
protected void onRemove(int index, MobileSequenceResponse element) {
element.setTransaction(null);
}
};
}
/**
* <p>setResponses</p>
*
* @param responses a {@link java.util.List} object.
*/
public synchronized void setResponses(List<MobileSequenceResponse> responses) {
m_responses.clear();
m_responses.addAll(responses);
}
/**
* <p>addResponse</p>
*
* @param response a {@link org.opennms.sms.monitor.internal.config.MobileSequenceResponse} object.
*/
public void addResponse(MobileSequenceResponse response) {
getResponses().add(response);
}
/**
* <p>getSequenceConfig</p>
*
* @return a {@link org.opennms.sms.monitor.internal.config.MobileSequenceConfig} object.
*/
@XmlTransient
public MobileSequenceConfig getSequenceConfig() {
return m_sequenceConfig;
}
/**
* <p>setSequenceConfig</p>
*
* @param sequenceConfig a {@link org.opennms.sms.monitor.internal.config.MobileSequenceConfig} object.
*/
public void setSequenceConfig(MobileSequenceConfig sequenceConfig) {
m_sequenceConfig = sequenceConfig;
}
/**
* <p>getDefaultGatewayId</p>
*
* @return a {@link java.lang.String} object.
*/
@XmlTransient
public String getDefaultGatewayId() {
return m_defaultGatewayId;
}
/**
* <p>setDefaultGatewayId</p>
*
* @param gatewayId a {@link java.lang.String} object.
*/
public void setDefaultGatewayId(String gatewayId) {
m_defaultGatewayId = gatewayId;
}
/**
* <p>getLabel</p>
*
* @param session a {@link org.opennms.sms.monitor.MobileSequenceSession} object.
* @return a {@link java.lang.String} object.
*/
public String getLabel(MobileSequenceSession session) {
return session.substitute(getRequest().getLabel(getLabel()));
}
/**
* <p>compareTo</p>
*
* @param o a {@link org.opennms.sms.monitor.internal.config.MobileSequenceTransaction} object.
* @return a int.
*/
public int compareTo(MobileSequenceTransaction o) {
return new CompareToBuilder()
.append(this.getRequest(), o.getRequest())
.append(this.getResponses(), o.getResponses())
.toComparison();
}
/**
* <p>toString</p>
*
* @return a {@link java.lang.String} object.
*/
public String toString() {
return new ToStringBuilder(this)
.append("label", getLabel())
.append("gatewayId", getGatewayId())
.append("request", getRequest())
.append("response(s)", getResponses())
.toString();
}
/**
* <p>sendRequest</p>
*
* @param session a {@link org.opennms.sms.monitor.MobileSequenceSession} object.
* @param responseHandler a {@link org.opennms.sms.reflector.smsservice.MobileMsgResponseHandler} object.
*/
public void sendRequest(MobileSequenceSession session, MobileMsgResponseHandler responseHandler) {
getRequest().send(session, responseHandler);
}
/**
* <p>matchesResponse</p>
*
* @param session a {@link org.opennms.sms.monitor.MobileSequenceSession} object.
* @param request a {@link org.opennms.sms.reflector.smsservice.MobileMsgRequest} object.
* @param response a {@link org.opennms.sms.reflector.smsservice.MobileMsgResponse} object.
* @return a boolean.
*/
public boolean matchesResponse(MobileSequenceSession session, MobileMsgRequest request, MobileMsgResponse response) {
boolean match = false;
for ( MobileSequenceResponse r : getResponses() ) {
match = r.matches(session, request, response);
}
return match;
}
String getResponseLabel(MobileSequenceSession session, MobileSequenceResponse response) {
return session.substitute(getLabel()+".response"+getResponseIndex(response));
}
private int getResponseIndex(MobileSequenceResponse response) {
int index = 1;
for(MobileSequenceResponse r : getResponses()) {
if (r == response) {
return index;
}
index++;
}
throw new IllegalArgumentException("response not found in transaction!");
}
}