diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilter.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilter.java index b2bfde8f896a306a0e798af1fe782c2fed9cf2c6..e3d05118efee46a35a8ec43290335a5ba3835128 100644 --- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilter.java +++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilter.java @@ -1,151 +1,9 @@ package net.ihe.gazelle.proxy.dao; -import java.util.Date; - -import net.ihe.gazelle.proxy.enums.ChannelType; -import net.ihe.gazelle.proxy.enums.ProxySide; - -import org.apache.commons.lang.StringUtils; import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - -public class MessageFilter { - - private ChannelType messageType = ChannelType.HTTP; - - private String initiatorIP; - private Integer initiatorPort; - - private String responderIP; - private Integer responderPort; - - private Integer proxyPort; - - private Date dateFrom; - private Date dateTo; - - private Integer connectionId; - - private ProxySide proxySide = null; - - public String getInitiatorIP() { - return initiatorIP; - } - - public void setInitiatorIP(String initiatorIP) { - this.initiatorIP = initiatorIP; - } - - public Integer getInitiatorPort() { - return initiatorPort; - } - - public void setInitiatorPort(Integer initiatorPort) { - this.initiatorPort = initiatorPort; - } - - public String getResponderIP() { - return responderIP; - } - - public void setResponderIP(String responderIP) { - this.responderIP = responderIP; - } - - public Integer getResponderPort() { - return responderPort; - } - - public void setResponderPort(Integer responderPort) { - this.responderPort = responderPort; - } - - public Integer getProxyPort() { - return proxyPort; - } - - public void setProxyPort(Integer proxyPort) { - this.proxyPort = proxyPort; - } - - public ProxySide getProxySide() { - return proxySide; - } - - public void setProxySide(ProxySide proxySide) { - this.proxySide = proxySide; - } - - public Date getDateFrom() { - return dateFrom; - } - - public void setDateFrom(Date dateFrom) { - this.dateFrom = dateFrom; - } - - public Date getDateTo() { - return dateTo; - } - - public void setDateTo(Date dateTo) { - this.dateTo = dateTo; - } - - public ChannelType getMessageType() { - return messageType; - } - - public void setMessageType(ChannelType messageType) { - this.messageType = messageType; - } - - - public Integer getConnectionId() { - return connectionId; - } - - public void setConnectionId(Integer connectionId) { - this.connectionId = connectionId; - } - - public void reset() { - messageType = ChannelType.HTTP; - initiatorIP = null; - initiatorPort = null; - responderIP = null; - responderPort = null; - proxyPort = null; - dateFrom = null; - dateTo = null; - connectionId = null; - proxySide = null; - } - - public void appendFilters(Criteria criteria) { - addEq(criteria, "fromIP", StringUtils.trimToNull(initiatorIP)); - addEq(criteria, "localPort", initiatorPort); - - addEq(criteria, "proxyPort", proxyPort); - - addEq(criteria, "toIP", StringUtils.trimToNull(responderIP)); - addEq(criteria, "remotePort", responderPort); - - addEq(criteria, "connectionId", connectionId); - addEq(criteria, "proxySide", proxySide); - if (dateFrom != null) { - criteria.add(Restrictions.ge("dateReceived", dateFrom)); - } - if (dateTo != null) { - criteria.add(Restrictions.le("dateReceived", dateTo)); - } - } +public interface MessageFilter { - private void addEq(Criteria criteria, String parameterName, Object value) { - if (value != null) { - criteria.add(Restrictions.eq(parameterName, value)); - } - } + void appendFilters(Criteria criteria); } diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStandard.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStandard.java new file mode 100644 index 0000000000000000000000000000000000000000..9eead7671c317f45726bae03760fd8a095ed96d6 --- /dev/null +++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStandard.java @@ -0,0 +1,152 @@ +package net.ihe.gazelle.proxy.dao; + +import java.util.Date; + +import net.ihe.gazelle.proxy.enums.ChannelType; +import net.ihe.gazelle.proxy.enums.ProxySide; + +import org.apache.commons.lang.StringUtils; +import org.hibernate.Criteria; +import org.hibernate.criterion.Restrictions; + +public class MessageFilterStandard implements MessageFilter { + + private ChannelType messageType = ChannelType.HTTP; + + private String initiatorIP; + private Integer initiatorPort; + + private String responderIP; + private Integer responderPort; + + private Integer proxyPort; + + private Date dateFrom; + private Date dateTo; + + private Integer connectionId; + + private ProxySide proxySide = null; + + public String getInitiatorIP() { + return initiatorIP; + } + + public void setInitiatorIP(String initiatorIP) { + this.initiatorIP = initiatorIP; + } + + public Integer getInitiatorPort() { + return initiatorPort; + } + + public void setInitiatorPort(Integer initiatorPort) { + this.initiatorPort = initiatorPort; + } + + public String getResponderIP() { + return responderIP; + } + + public void setResponderIP(String responderIP) { + this.responderIP = responderIP; + } + + public Integer getResponderPort() { + return responderPort; + } + + public void setResponderPort(Integer responderPort) { + this.responderPort = responderPort; + } + + public Integer getProxyPort() { + return proxyPort; + } + + public void setProxyPort(Integer proxyPort) { + this.proxyPort = proxyPort; + } + + public ProxySide getProxySide() { + return proxySide; + } + + public void setProxySide(ProxySide proxySide) { + this.proxySide = proxySide; + } + + public Date getDateFrom() { + return dateFrom; + } + + public void setDateFrom(Date dateFrom) { + this.dateFrom = dateFrom; + } + + public Date getDateTo() { + return dateTo; + } + + public void setDateTo(Date dateTo) { + this.dateTo = dateTo; + } + + public ChannelType getMessageType() { + return messageType; + } + + public void setMessageType(ChannelType messageType) { + this.messageType = messageType; + } + + public Integer getConnectionId() { + return connectionId; + } + + public void setConnectionId(Integer connectionId) { + this.connectionId = connectionId; + } + + public void reset() { + messageType = ChannelType.HTTP; + initiatorIP = null; + initiatorPort = null; + responderIP = null; + responderPort = null; + proxyPort = null; + dateFrom = null; + dateTo = null; + connectionId = null; + proxySide = null; + } + + public void appendFilters(Criteria criteria) { + criteria.add(Restrictions.eq("class", getMessageType().getDiscriminator())); + + addEq(criteria, "fromIP", StringUtils.trimToNull(initiatorIP)); + addEq(criteria, "localPort", initiatorPort); + + addEq(criteria, "proxyPort", proxyPort); + + addEq(criteria, "toIP", StringUtils.trimToNull(responderIP)); + addEq(criteria, "remotePort", responderPort); + + addEq(criteria, "connectionId", connectionId); + addEq(criteria, "proxySide", proxySide); + + if (dateFrom != null) { + criteria.add(Restrictions.ge("dateReceived", dateFrom)); + } + if (dateTo != null) { + criteria.add(Restrictions.le("dateReceived", dateTo)); + } + } + + private void addEq(Criteria criteria, String parameterName, Object value) { + if (value != null) { + criteria.add(Restrictions.eq(parameterName, value)); + } + } + +} diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStep.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStep.java new file mode 100644 index 0000000000000000000000000000000000000000..30f4ca2a334d9a3e1533cacdb2ea0046d343b31c --- /dev/null +++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/dao/MessageFilterStep.java @@ -0,0 +1,113 @@ +package net.ihe.gazelle.proxy.dao; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import net.ihe.gazelle.proxy.model.tm.Configuration; +import net.ihe.gazelle.proxy.model.tm.Step; +import net.ihe.gazelle.proxy.model.tm.TestInstance; + +import org.hibernate.Criteria; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.LogicalExpression; +import org.hibernate.criterion.Restrictions; + +public class MessageFilterStep implements MessageFilter { + + private Step step; + private boolean filterPath = true; + private boolean filterPathFrom = true; + private boolean filterDates = true; + + public MessageFilterStep(Step step) { + super(); + this.step = step; + } + + public void appendFilters(Criteria criteria) { + TestInstance testInstance = step.getTestInstance(); + + if (filterPath) { + List<Criterion> critSenders = new ArrayList<Criterion>(); + List<Criterion> critReceivers = new ArrayList<Criterion>(); + + List<Configuration> senders = step.getSenders(); + for (Configuration configuration : senders) { + critSenders.add(Restrictions.eq("fromIP", configuration.getHost())); + } + List<Configuration> receivers = step.getReceivers(); + for (Configuration configuration : receivers) { + critReceivers.add(Restrictions.eq("proxyPort", configuration.getProxyPort())); + } + + List<Criterion> paths = new ArrayList<Criterion>(); + if (filterPathFrom) { + for (Criterion critSender : critSenders) { + for (Criterion critReceiver : critReceivers) { + LogicalExpression path = Restrictions.and(critSender, critReceiver); + paths.add(path); + } + } + } else { + paths = critReceivers; + } + + Criterion oneOfPath = null; + for (Criterion path : paths) { + if (oneOfPath == null) { + oneOfPath = path; + } else { + oneOfPath = Restrictions.or(oneOfPath, path); + } + } + + criteria.add(oneOfPath); + } + + if (filterDates) { + Date startDate = getStartDate(testInstance); + Date endDate = step.getDate(); + + criteria.add(Restrictions.ge("dateReceived", startDate)); + criteria.add(Restrictions.le("dateReceived", endDate)); + } + } + + private Date getStartDate(TestInstance testInstance) { + Date startDate; + List<Step> steps = testInstance.getSteps(); + int indexOf = steps.indexOf(step); + if (indexOf == 0) { + startDate = testInstance.getDate(); + } else { + startDate = steps.get(indexOf - 1).getDate(); + } + return startDate; + } + + public boolean isFilterPath() { + return filterPath; + } + + public void setFilterPath(boolean filterPath) { + this.filterPath = filterPath; + } + + public boolean isFilterPathFrom() { + return filterPathFrom; + } + + public void setFilterPathFrom(boolean filterPathFrom) { + this.filterPathFrom = filterPathFrom; + } + + public boolean isFilterDates() { + return filterDates; + } + + public void setFilterDates(boolean filterDates) { + this.filterDates = filterDates; + } + +} diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/enums/ChannelType.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/enums/ChannelType.java index 7ad981c9d92e0fdaf11f37bc609a350ec5a5d0ac..9641fbe26034217b630e562296f056cdf9cf421f 100644 --- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/enums/ChannelType.java +++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/enums/ChannelType.java @@ -34,22 +34,28 @@ import net.ihe.gazelle.proxy.model.message.SyslogMessage; public enum ChannelType { - DICOM(DicomMessage.class), + DICOM(DicomMessage.class, "dicomMessage"), - HL7(HL7Message.class), + HL7(HL7Message.class, "hl7Message"), - SYSLOG(SyslogMessage.class), + SYSLOG(SyslogMessage.class, "syslogMessage"), - HTTP(HTTPMessage.class); + HTTP(HTTPMessage.class, "httpMessage"); private Class<? extends AbstractMessage> messageClass; + private String discriminator; - ChannelType(Class<? extends AbstractMessage> messageClass) { + ChannelType(Class<? extends AbstractMessage> messageClass, String discriminator) { this.messageClass = messageClass; + this.discriminator = discriminator; } public Class<? extends AbstractMessage> getMessageClass() { return messageClass; } + public String getDiscriminator() { + return discriminator; + } + } diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/Step.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/Step.java index 08dcd4b7295be353a8092e501b2481bf6f4e5623..c65726bf5d5387e543f92172571e9cdc51390d75 100644 --- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/Step.java +++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/Step.java @@ -1,10 +1,14 @@ package net.ihe.gazelle.proxy.model.tm; import java.util.Date; +import java.util.List; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.Transient; @@ -26,29 +30,29 @@ public class Step { @XmlElement(name = "id") private int tmId; - @ManyToOne + @ManyToOne(fetch = FetchType.EAGER) private TestInstance testInstance; - private Date dateStart; - - private Date dateEnd; - @ManyToOne private AbstractMessage message; - @ManyToOne - private Configuration sender; + @ManyToMany + @JoinTable(name="tm_step_sender") + private List<Configuration> senders; @Transient @XmlElement - private int senderId; + private List<Integer> senderIds; - @ManyToOne - private Configuration receiver; + @ManyToMany + @JoinTable(name="tm_step_receiver") + private List<Configuration> receivers; @Transient @XmlElement - private int receiverId; + private List<Integer> receiverIds; + + private Date date; public int getId() { return id; @@ -74,20 +78,12 @@ public class Step { this.testInstance = testInstance; } - public Date getDateStart() { - return dateStart; - } - - public void setDateStart(Date dateStart) { - this.dateStart = dateStart; - } - - public Date getDateEnd() { - return dateEnd; + public Date getDate() { + return date; } - public void setDateEnd(Date dateEnd) { - this.dateEnd = dateEnd; + public void setDate(Date date) { + this.date = date; } public AbstractMessage getMessage() { @@ -98,36 +94,36 @@ public class Step { this.message = message; } - public Configuration getSender() { - return sender; + public List<Configuration> getSenders() { + return senders; } - public void setSender(Configuration sender) { - this.sender = sender; + public void setSenders(List<Configuration> senders) { + this.senders = senders; } - public Configuration getReceiver() { - return receiver; + public List<Integer> getSenderIds() { + return senderIds; } - public void setReceiver(Configuration receiver) { - this.receiver = receiver; + public void setSenderIds(List<Integer> senderIds) { + this.senderIds = senderIds; } - public int getSenderId() { - return senderId; + public List<Configuration> getReceivers() { + return receivers; } - public void setSenderId(int senderId) { - this.senderId = senderId; + public void setReceivers(List<Configuration> receivers) { + this.receivers = receivers; } - public int getReceiverId() { - return receiverId; + public List<Integer> getReceiverIds() { + return receiverIds; } - public void setReceiverId(int receiverId) { - this.receiverId = receiverId; + public void setReceiverIds(List<Integer> receiverIds) { + this.receiverIds = receiverIds; } @Override diff --git a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/TestInstance.java b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/TestInstance.java index bcf33e2fec8864b95b0576606c53bcc3948ff570..5588da0faae84ac648c86ceb8a2ebf1ee9b179c9 100644 --- a/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/TestInstance.java +++ b/gazelle-proxy-datamodel/src/main/java/net/ihe/gazelle/proxy/model/tm/TestInstance.java @@ -1,8 +1,11 @@ package net.ihe.gazelle.proxy.model.tm; +import java.util.Date; import java.util.List; +import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; @@ -11,6 +14,8 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; +import org.hibernate.annotations.Fetch; + @Entity @Table(name = "tm_testInstance", schema = "public") @XmlAccessorType(XmlAccessType.NONE) @@ -23,14 +28,16 @@ public class TestInstance { @XmlElement(name = "id") private int tmId; - @OneToMany(mappedBy = "testInstance") + @OneToMany(mappedBy = "testInstance", cascade = CascadeType.ALL) @XmlElement private List<Configuration> configurations; - @OneToMany(mappedBy = "testInstance") + @OneToMany(mappedBy = "testInstance", cascade = CascadeType.ALL, fetch = FetchType.EAGER) @XmlElement private List<Step> steps; + private Date date; + public TestInstance() { super(); } @@ -67,6 +74,14 @@ public class TestInstance { this.steps = steps; } + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + @Override public int hashCode() { final int prime = 31; diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/HibernateMessageDataModel.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/HibernateMessageDataModel.java index 1a2d524ad04fb59a4ef6405a268ccbf5030525b4..d07c601e9c4830e97ffac78417df97a4adc8bff5 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/HibernateMessageDataModel.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/HibernateMessageDataModel.java @@ -2,17 +2,18 @@ package net.ihe.gazelle.proxy.action; import javax.faces.context.FacesContext; -import org.hibernate.Criteria; - import net.ihe.gazelle.jsf.datatable.HibernateDataModel; import net.ihe.gazelle.proxy.dao.MessageFilter; +import net.ihe.gazelle.proxy.model.message.AbstractMessage; + +import org.hibernate.Criteria; public class HibernateMessageDataModel<T> extends HibernateDataModel<T> { private MessageFilter messageFilter; public HibernateMessageDataModel(MessageFilter messageFilter) { - super(messageFilter.getMessageType().getMessageClass()); + super(AbstractMessage.class); this.messageFilter = messageFilter; } diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessagesBean.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessagesBean.java index 9a92b34ba26fafaf47b6090449a83e1508d9860c..cab4aad59a4f6b08cf82e21f3b965d670729ccfe 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessagesBean.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/MessagesBean.java @@ -3,12 +3,17 @@ package net.ihe.gazelle.proxy.action; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.Map; import javax.ejb.Remove; -import javax.ejb.Stateful; +import javax.faces.context.FacesContext; +import javax.persistence.EntityManager; import net.ihe.gazelle.jsf.datatable.HibernateDataModel; +import net.ihe.gazelle.proxy.action.dao.ProxyDAO; import net.ihe.gazelle.proxy.dao.MessageFilter; +import net.ihe.gazelle.proxy.dao.MessageFilterStandard; +import net.ihe.gazelle.proxy.dao.MessageFilterStep; import net.ihe.gazelle.proxy.enums.ChannelType; import net.ihe.gazelle.proxy.enums.ProxySide; import net.ihe.gazelle.proxy.model.message.AbstractMessage; @@ -16,10 +21,12 @@ import net.ihe.gazelle.proxy.model.message.DicomMessage; import net.ihe.gazelle.proxy.model.message.HL7Message; import net.ihe.gazelle.proxy.model.message.HTTPMessage; import net.ihe.gazelle.proxy.model.message.SyslogMessage; +import net.ihe.gazelle.proxy.model.tm.Step; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Destroy; +import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; @@ -27,17 +34,30 @@ import org.jboss.seam.annotations.Scope; @Scope(ScopeType.PAGE) public class MessagesBean { + private static final String TYPE_TEST_STEP = "TEST_STEP"; + private static final String TYPE_STANDARD = "STANDARD"; + private transient HibernateMessageDataModel<AbstractMessage> messageDataModel; private MessageFilter messageFilter; + private MessageFilterStandard messageFilterStandard; + private MessageFilterStep messageFilterStep; + + @In + private EntityManager entityManager; + + private String listType = null; + private Step step; public void clearFilter() { - messageFilter.reset(); + messageFilterStandard.reset(); rebuildDataModel(); } @Create public void createModel() { - messageFilter = new MessageFilter(); + messageFilterStandard = new MessageFilterStandard(); + messageFilter = messageFilterStandard; + messageFilterStep = null; rebuildDataModel(); } @@ -47,23 +67,27 @@ public class MessagesBean { } public Integer getConnectionId() { - return messageFilter.getConnectionId(); + return messageFilterStandard.getConnectionId(); } public Date getDateFrom() { - return messageFilter.getDateFrom(); + return messageFilterStandard.getDateFrom(); } public Date getDateTo() { - return messageFilter.getDateTo(); + return messageFilterStandard.getDateTo(); } public String getInitiatorIP() { - return messageFilter.getInitiatorIP(); + return messageFilterStandard.getInitiatorIP(); } public Integer getInitiatorPort() { - return messageFilter.getInitiatorPort(); + return messageFilterStandard.getInitiatorPort(); + } + + public String getListType() { + return listType; } public HibernateDataModel<?> getMessageDataModel() { @@ -71,7 +95,7 @@ public class MessagesBean { } public ChannelType getMessageType() { - return messageFilter.getMessageType(); + return messageFilterStandard.getMessageType(); } public List<ChannelType> getMessageTypes() { @@ -79,11 +103,11 @@ public class MessagesBean { } public Integer getProxyPort() { - return messageFilter.getProxyPort(); + return messageFilterStandard.getProxyPort(); } public ProxySide getProxySide() { - return messageFilter.getProxySide(); + return messageFilterStandard.getProxySide(); } public List<ProxySide> getProxySides() { @@ -91,11 +115,23 @@ public class MessagesBean { } public String getResponderIP() { - return messageFilter.getResponderIP(); + return messageFilterStandard.getResponderIP(); } public Integer getResponderPort() { - return messageFilter.getResponderPort(); + return messageFilterStandard.getResponderPort(); + } + + public boolean isFilterDates() { + return messageFilterStep.isFilterDates(); + } + + public boolean isFilterPath() { + return messageFilterStep.isFilterPath(); + } + + public boolean isFilterPathFrom() { + return messageFilterStep.isFilterPathFrom(); } public String linkedLabel(AbstractMessage message) { @@ -160,44 +196,74 @@ public class MessagesBean { } public void setConnectionId(Integer connectionId) { - messageFilter.setConnectionId(connectionId); + messageFilterStandard.setConnectionId(connectionId); } public void setDateFrom(Date dateFrom) { - messageFilter.setDateFrom(dateFrom); + messageFilterStandard.setDateFrom(dateFrom); } public void setDateTo(Date dateTo) { - messageFilter.setDateTo(dateTo); + messageFilterStandard.setDateTo(dateTo); + } + + public void setFilterDates(boolean filterDates) { + messageFilterStep.setFilterDates(filterDates); + } + + public void setFilterPath(boolean filterPath) { + messageFilterStep.setFilterPath(filterPath); + } + + public void setFilterPathFrom(boolean filterPathFrom) { + messageFilterStep.setFilterPathFrom(filterPathFrom); } public void setInitiatorIP(String initiatorIP) { - messageFilter.setInitiatorIP(initiatorIP); + messageFilterStandard.setInitiatorIP(initiatorIP); } public void setInitiatorPort(Integer initiatorPort) { - messageFilter.setInitiatorPort(initiatorPort); + messageFilterStandard.setInitiatorPort(initiatorPort); + } + + public void setListType(String listType) { + this.listType = listType; + if (listType.equals(TYPE_TEST_STEP)) { + Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext() + .getRequestParameterMap(); + String testStepId = params.get("id"); + List<Step> steps = ProxyDAO.getStepsByTMId(Integer.parseInt(testStepId), entityManager); + if (steps.size() > 0) { + step = steps.get(0); + } + messageFilterStep = new MessageFilterStep(step); + messageFilter = messageFilterStep; + messageFilterStandard = null; + + rebuildDataModel(); + } } public void setMessageType(ChannelType messageType) { - messageFilter.setMessageType(messageType); + messageFilterStandard.setMessageType(messageType); rebuildDataModel(); } public void setProxyPort(Integer proxyPort) { - messageFilter.setProxyPort(proxyPort); + messageFilterStandard.setProxyPort(proxyPort); } public void setProxySide(ProxySide proxySide) { - messageFilter.setProxySide(proxySide); + messageFilterStandard.setProxySide(proxySide); } public void setResponderIP(String responderIP) { - messageFilter.setResponderIP(responderIP); + messageFilterStandard.setResponderIP(responderIP); } public void setResponderPort(Integer responderPort) { - messageFilter.setResponderPort(responderPort); + messageFilterStandard.setResponderPort(responderPort); } } diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyBean.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyBean.java index deb92098eb29789f0455caf3a8dbeb1ca856620b..4f5d07aaba0b2e4d01cd94bc8bb7e88fc2fec612 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyBean.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyBean.java @@ -195,4 +195,9 @@ public class ProxyBean implements ProxyLocal { return ips; } + public boolean channelExists(int localPort) { + ProxyChannel findProxyWithLocalPort = findProxyWithLocalPort(localPort); + return findProxyWithLocalPort != null; + } + } diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyLocal.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyLocal.java index ae637e9516aa59bb24fd50dc87829662c4aecc46..ca390824559e6f1a6063111aa3a06e9b879f14c2 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyLocal.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/ProxyLocal.java @@ -13,4 +13,6 @@ public interface ProxyLocal { public void stopChannel(Integer localPort); + public boolean channelExists(int localPort); + } diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/dao/ProxyDAO.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/dao/ProxyDAO.java index 47cc80f1ce802f3adb9318ff489f16491a8d06c4..e28a09ef035d4fa21037821da33d5deb16858f2e 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/dao/ProxyDAO.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/action/dao/ProxyDAO.java @@ -1,12 +1,18 @@ package net.ihe.gazelle.proxy.action.dao; +import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.criterion.Restrictions; + import net.ihe.gazelle.proxy.dao.ChannelDAO; import net.ihe.gazelle.proxy.model.Channel; +import net.ihe.gazelle.proxy.model.tm.Step; import net.ihe.gazelle.proxy.util.HibernateUtilPKI; import net.ihe.gazelle.proxy.util.HibernateUtilProxy; import net.ihe.gazelle.simulators.tls.CertificateDAO; @@ -49,4 +55,22 @@ public class ProxyDAO { return certificate; } + public static void updateStepDate(int testStepId) { + EntityManager entityManager = HibernateUtilProxy.buildEntityManager(); + List<Step> steps = getStepsByTMId(testStepId, entityManager); + for (Step step : steps) { + step.setDate(new Date()); + entityManager.merge(step); + } + HibernateUtilProxy.releaseEntityManager(entityManager); + } + + public static List<Step> getStepsByTMId(int testStepId, EntityManager entityManager) { + Session session = HibernateUtilProxy.getSession(entityManager); + Criteria criteria = session.createCriteria(Step.class); + criteria.add(Restrictions.eq("tmId", new Integer(testStepId))); + List<Step> steps = criteria.list(); + return steps; + } + } diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/HibernateUtilProxy.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/HibernateUtilProxy.java index 6bb35a8c5685c5a8b3fddc29bc3e267395e2b915..e0aad96649d29a935e8e20a9d2e6859cf1835d5c 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/HibernateUtilProxy.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/util/HibernateUtilProxy.java @@ -52,8 +52,7 @@ public class HibernateUtilProxy { } } - public static Session getSession() { - EntityManager entityManager = buildEntityManager(); + public static Session getSession(EntityManager entityManager) { if (entityManager != null) { Object delegate = entityManager.getDelegate(); if (delegate instanceof Session) { diff --git a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/ws/ProxyForTM.java b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/ws/ProxyForTM.java index 6142fe6832a76c0692ffe51938bb2385422ca685..669173c2d10d0d1b77839a76053cb832819d668f 100644 --- a/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/ws/ProxyForTM.java +++ b/gazelle-proxy-ejb/src/main/java/net/ihe/gazelle/proxy/ws/ProxyForTM.java @@ -1,14 +1,29 @@ package net.ihe.gazelle.proxy.ws; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + import javax.ejb.Stateless; +import javax.jws.HandlerChain; import javax.jws.WebMethod; import javax.jws.WebService; +import javax.persistence.EntityManager; +import net.ihe.gazelle.proxy.action.ProxyLocal; +import net.ihe.gazelle.proxy.action.dao.ProxyDAO; +import net.ihe.gazelle.proxy.enums.ChannelType; +import net.ihe.gazelle.proxy.model.tm.Configuration; +import net.ihe.gazelle.proxy.model.tm.Step; import net.ihe.gazelle.proxy.model.tm.TestInstance; -import net.ihe.gazelle.proxy.ws.IProxyForTM; +import net.ihe.gazelle.proxy.util.HibernateUtilProxy; + +import org.jboss.seam.Component; +import org.jboss.seam.annotations.In; @WebService @Stateless +@HandlerChain(file = "handlers.xml") public class ProxyForTM implements IProxyForTM { public ProxyForTM() { @@ -17,12 +32,83 @@ public class ProxyForTM implements IProxyForTM { @WebMethod public void startTestInstance(TestInstance testInstance) { - System.out.println("start instance " + testInstance); + Calendar endTI = Calendar.getInstance(); + testInstance.setDate(endTI.getTime()); + + endTI.add(Calendar.YEAR, 1); + + List<Step> steps = testInstance.getSteps(); + List<Configuration> configurations = testInstance.getConfigurations(); + + for (Step step : steps) { + // never stopped + step.setDate(endTI.getTime()); + step.setTestInstance(testInstance); + step.setMessage(null); + List<Integer> ids = step.getReceiverIds(); + List<Configuration> stepConfigurations = new ArrayList<Configuration>(); + if (ids != null) { + stepConfigurations = getStepConfigurations(configurations, ids); + } + step.setReceivers(stepConfigurations); + + ids = step.getSenderIds(); + stepConfigurations = new ArrayList<Configuration>(); + if (ids != null) { + stepConfigurations = getStepConfigurations(configurations, ids); + } + step.setSenders(stepConfigurations); + } + + for (Configuration configuration : configurations) { + configuration.setTestInstance(testInstance); + + if (configuration.getProxyPort() > 0) { + startChannel(configuration); + } + } + + EntityManager entityManager = HibernateUtilProxy.buildEntityManager(); + entityManager.persist(testInstance); + HibernateUtilProxy.releaseEntityManager(entityManager); + + } + + private List<Configuration> getStepConfigurations(List<Configuration> configurations, List<Integer> ids) { + List<Configuration> stepConfigurations = new ArrayList<Configuration>(); + for (Integer id : ids) { + Configuration stepConfiguration = getConfigurationByTmId(id, configurations); + if (stepConfiguration != null) { + stepConfigurations.add(stepConfiguration); + } + } + return stepConfigurations; + } + + private void startChannel(Configuration configuration) { + ProxyLocal proxyBean = (ProxyLocal) Component.getInstance("proxyBean"); + if (!proxyBean.channelExists(configuration.getProxyPort())) { + String name = configuration.getName(); + Integer localPort = configuration.getProxyPort(); + String remoteAddress = configuration.getHost(); + Integer remotePort = configuration.getPort(); + ChannelType channelType = configuration.getType(); + proxyBean.startChannel(name, localPort, remoteAddress, remotePort, channelType, null); + } + } + + private Configuration getConfigurationByTmId(int id, List<Configuration> configurations) { + for (Configuration configuration : configurations) { + if (configuration.getTmId() == id) { + return configuration; + } + } + return null; } @WebMethod public void markTestStep(int testStepId) { - System.out.println("markTestStep " + testStepId); + ProxyDAO.updateStepDate(testStepId); } } diff --git a/gazelle-proxy-ejb/src/main/resources/net/ihe/gazelle/proxy/ws/handlers.xml b/gazelle-proxy-ejb/src/main/resources/net/ihe/gazelle/proxy/ws/handlers.xml new file mode 100644 index 0000000000000000000000000000000000000000..c2b91ee705217811fe893cb41d3cf365599bd8e6 --- /dev/null +++ b/gazelle-proxy-ejb/src/main/resources/net/ihe/gazelle/proxy/ws/handlers.xml @@ -0,0 +1,11 @@ +<handler-chains xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"> + <handler-chain> + <handler> + <handler-name>SOAP Request Handler</handler-name> + <handler-class>org.jboss.seam.webservice.SOAPRequestHandler + </handler-class> + </handler> + </handler-chain> +</handler-chains> \ No newline at end of file diff --git a/gazelle-proxy-war/src/main/webapp/messageList.xhtml b/gazelle-proxy-war/src/main/webapp/messageList.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..b30329afc23ecb78c974ac69a744427609c9d745 --- /dev/null +++ b/gazelle-proxy-war/src/main/webapp/messageList.xhtml @@ -0,0 +1,120 @@ +<ui:composition xmlns="http://www.w3.org/1999/xhtml" + xmlns:s="http://jboss.com/products/seam/taglib" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:rich="http://richfaces.org/rich" + xmlns:a4j="http://richfaces.org/a4j"> + + <rich:dataTable id="messagesList" + value="#{messagesBean.messageDataModel}" var="message" rows="20" + rowKeyConverter="org.jboss.seam.ui.EntityConverter"> + + <f:facet name="header"> + <rich:datascroller id="datascrollerHead" /> + </f:facet> + + <rich:column width="10%" sortBy="#{'id'}" + sortOrder="#{dataTableStateHolder.sortOrders['id']}"> + <f:facet name="header"> + <h:outputText value="Id" /> + </f:facet> + + <a4j:htmlCommandLink + action="#{messagesBean.redirectToMessage(message)}" + value="#{message.id}" target="_blank" /> + <h:outputText value=" (" + rendered="#{messagesBean.linkedRendered(message)}" /> + <a4j:htmlCommandLink + rendered="#{messagesBean.linkedRendered(message)}" + action="#{messagesBean.redirectToLinked(message)}" + value="#{messagesBean.linkedLabel(message)}" target="_blank" /> + <h:outputText value=")" + rendered="#{messagesBean.linkedRendered(message)}" /> + + </rich:column> + + <rich:column width="15%" sortBy="#{'dateReceived'}" + sortOrder="#{dataTableStateHolder.sortOrders['dateReceived']}"> + <f:facet name="header"> + <h:outputText value="Date" /> + </f:facet> + <h:outputText value="#{message.dateReceived}"> + <f:convertDateTime dateStyle="short" type="both" timeZone="GMT+1" /> + </h:outputText> + </rich:column> + + <rich:column width="15%" filterEvent="onkeyup" sortBy="#{'fromIP'}" + filterBy="#{'fromIP'}" + sortOrder="#{dataTableStateHolder.sortOrders['fromIP']}" + filterValue="#{dataTableStateHolder.columnFilterValues['fromIP']}"> + <f:facet name="header"> + <h:outputText value="From" /> + </f:facet> + + <a4j:htmlCommandLink + action="#{messagesBean.setInitiatorIP(message.fromIP)}" + value="#{message.fromIP}" />:<a4j:htmlCommandLink + action="#{messagesBean.setInitiatorPort(message.localPort)}" + value="#{message.localPort}" /> + + </rich:column> + <rich:column width="15%" filterEvent="onkeyup" sortBy="#{'toIP'}" + filterBy="#{'toIP'}" + sortOrder="#{dataTableStateHolder.sortOrders['toIP']}" + filterValue="#{dataTableStateHolder.columnFilterValues['toIP']}"> + <f:facet name="header"> + <h:outputText value="To" /> + </f:facet> + + <a4j:htmlCommandLink + action="#{messagesBean.setResponderIP(message.toIP)}" + value="#{message.toIP}" />:<a4j:htmlCommandLink + action="#{messagesBean.setResponderPort(message.remotePort)}" + value="#{message.remotePort}" /> + + </rich:column> + + <rich:column width="10%" sortBy="#{'proxyPort'}" + sortOrder="#{dataTableStateHolder.sortOrders['proxyPort']}"> + <f:facet name="header"> + <h:outputText value="Proxy" /> + </f:facet> + <a4j:htmlCommandLink + action="#{messagesBean.setProxyPort(message.proxyPort)}" + value="#{message.proxyPort}" /> + </rich:column> + + <rich:column width="10%" sortBy="#{'connectionId'}" + sortOrder="#{dataTableStateHolder.sortOrders['connectionId']}"> + <f:facet name="header"> + <h:outputText value="Connection Id" /> + </f:facet> + <a4j:htmlCommandLink + action="#{messagesBean.setConnectionId(message.connectionId)}" + value="#{message.connectionId}" /> + </rich:column> + + <rich:column width="10%"> + <f:facet name="header"> + <h:outputText value="Type" /> + </f:facet> + <h:graphicImage value="/img/request.png" + rendered="#{message.proxySide.isRequest()}" /> + <h:graphicImage value="/img/response.png" + rendered="#{not message.proxySide.isRequest()}" /> + </rich:column> + + <rich:column width="15%"> + <f:facet name="header"> + <h:outputText value="Info" /> + </f:facet> + <h:outputText value="#{message.getInfoGUI()}" /> + </rich:column> + + <f:facet name="footer"> + <rich:datascroller id="datascroller" /> + </f:facet> + </rich:dataTable> + +</ui:composition> \ No newline at end of file diff --git a/gazelle-proxy-war/src/main/webapp/messages.xhtml b/gazelle-proxy-war/src/main/webapp/messages.xhtml index f69f46579328a6a57008b766f07370cb2064ce65..145454250f558bf6e7f816a7c9215000dfe73fb4 100644 --- a/gazelle-proxy-war/src/main/webapp/messages.xhtml +++ b/gazelle-proxy-war/src/main/webapp/messages.xhtml @@ -5,6 +5,7 @@ xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:a4j="http://richfaces.org/a4j" template="layout/template.xhtml"> + #{messagesBean.setListType("STANDARD")} <ui:define name="body"> <a4j:form> <rich:simpleTogglePanel switchType="client" id="search" @@ -107,118 +108,7 @@ <rich:spacer height="5" /> <s:div id="panelOfMessages"> - - <rich:dataTable id="messagesList" - value="#{messagesBean.messageDataModel}" var="message" rows="20" - rowKeyConverter="org.jboss.seam.ui.EntityConverter"> - - <f:facet name="header"> - <rich:datascroller id="datascrollerHead" /> - </f:facet> - - <rich:column width="10%" sortBy="#{'id'}" - sortOrder="#{dataTableStateHolder.sortOrders['id']}"> - <f:facet name="header"> - <h:outputText value="Id" /> - </f:facet> - - <a4j:htmlCommandLink - action="#{messagesBean.redirectToMessage(message)}" - value="#{message.id}" target="_blank" /> - <h:outputText value=" (" - rendered="#{messagesBean.linkedRendered(message)}" /> - <a4j:htmlCommandLink - rendered="#{messagesBean.linkedRendered(message)}" - action="#{messagesBean.redirectToLinked(message)}" - value="#{messagesBean.linkedLabel(message)}" target="_blank" /> - <h:outputText value=")" - rendered="#{messagesBean.linkedRendered(message)}" /> - - </rich:column> - - <rich:column width="15%" sortBy="#{'dateReceived'}" - sortOrder="#{dataTableStateHolder.sortOrders['dateReceived']}"> - <f:facet name="header"> - <h:outputText value="Date" /> - </f:facet> - <h:outputText value="#{message.dateReceived}"> - <f:convertDateTime dateStyle="short" type="both" timeZone="GMT+1" /> - </h:outputText> - </rich:column> - - <rich:column width="15%" filterEvent="onkeyup" sortBy="#{'fromIP'}" - filterBy="#{'fromIP'}" - sortOrder="#{dataTableStateHolder.sortOrders['fromIP']}" - filterValue="#{dataTableStateHolder.columnFilterValues['fromIP']}"> - <f:facet name="header"> - <h:outputText value="From" /> - </f:facet> - - <a4j:htmlCommandLink - action="#{messagesBean.setInitiatorIP(message.fromIP)}" - value="#{message.fromIP}" />:<a4j:htmlCommandLink - action="#{messagesBean.setInitiatorPort(message.localPort)}" - value="#{message.localPort}" /> - - </rich:column> - <rich:column width="15%" filterEvent="onkeyup" sortBy="#{'toIP'}" - filterBy="#{'toIP'}" - sortOrder="#{dataTableStateHolder.sortOrders['toIP']}" - filterValue="#{dataTableStateHolder.columnFilterValues['toIP']}"> - <f:facet name="header"> - <h:outputText value="To" /> - </f:facet> - - <a4j:htmlCommandLink - action="#{messagesBean.setResponderIP(message.toIP)}" - value="#{message.toIP}" />:<a4j:htmlCommandLink - action="#{messagesBean.setResponderPort(message.remotePort)}" - value="#{message.remotePort}" /> - - </rich:column> - - <rich:column width="10%" sortBy="#{'proxyPort'}" - sortOrder="#{dataTableStateHolder.sortOrders['proxyPort']}"> - <f:facet name="header"> - <h:outputText value="Proxy" /> - </f:facet> - <a4j:htmlCommandLink - action="#{messagesBean.setProxyPort(message.proxyPort)}" - value="#{message.proxyPort}" /> - </rich:column> - - <rich:column width="10%" sortBy="#{'connectionId'}" - sortOrder="#{dataTableStateHolder.sortOrders['connectionId']}"> - <f:facet name="header"> - <h:outputText value="Connection Id" /> - </f:facet> - <a4j:htmlCommandLink - action="#{messagesBean.setConnectionId(message.connectionId)}" - value="#{message.connectionId}" /> - </rich:column> - - <rich:column width="10%"> - <f:facet name="header"> - <h:outputText value="Type" /> - </f:facet> - <h:graphicImage value="/img/request.png" - rendered="#{message.proxySide.isRequest()}" /> - <h:graphicImage value="/img/response.png" - rendered="#{not message.proxySide.isRequest()}" /> - </rich:column> - - <rich:column width="15%"> - <f:facet name="header"> - <h:outputText value="Info" /> - </f:facet> - <h:outputText value="#{message.getInfoGUI()}" /> - </rich:column> - - <f:facet name="footer"> - <rich:datascroller id="datascroller" /> - </f:facet> - </rich:dataTable> - + <ui:include src="messageList.xhtml" /> </s:div> </a4j:form> diff --git a/gazelle-proxy-war/src/main/webapp/searchMessageStep.xhtml b/gazelle-proxy-war/src/main/webapp/searchMessageStep.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..8fa87c5e494420e5cadeba228d4b18bcc691594b --- /dev/null +++ b/gazelle-proxy-war/src/main/webapp/searchMessageStep.xhtml @@ -0,0 +1,14 @@ +<ui:composition xmlns="http://www.w3.org/1999/xhtml" + xmlns:s="http://jboss.com/products/seam/taglib" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:rich="http://richfaces.org/rich" + xmlns:a4j="http://richfaces.org/a4j" template="layout/template.xhtml"> + #{messagesBean.setListType("TEST_STEP")} + <ui:define name="body"> + <a4j:form> + <ui:include src="messageList.xhtml" /> + </a4j:form> + </ui:define> +</ui:composition> diff --git a/gazelle-proxy-ws/pom.xml b/gazelle-proxy-ws/pom.xml index 49d2d4a87ae15d882f59355cf2a42fad82177243..ced546f76adf7926a64ca31d5152d1abc0e1518b 100644 --- a/gazelle-proxy-ws/pom.xml +++ b/gazelle-proxy-ws/pom.xml @@ -65,6 +65,11 @@ <artifactId>ejb-api</artifactId> <version>3.0</version> </dependency> + <dependency> + <groupId>org.jboss.seam</groupId> + <artifactId>jboss-seam</artifactId> + <version>2.2.0.GA</version> + </dependency> </dependencies> </plugin>