/*
* Copyright 2013 JBoss Inc
*
* Licensed 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.overlord.rtgov.ui.server.services.mock;
import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.notNull;
import static com.google.common.base.Strings.isNullOrEmpty;
import static com.google.common.base.Strings.nullToEmpty;
import static com.google.common.collect.Lists.newArrayList;
import static java.lang.System.currentTimeMillis;
import static org.overlord.rtgov.ui.client.model.ResolutionState.RESOLVED;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.TreeSet;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Alternative;
import org.overlord.rtgov.ui.client.model.NameValuePairBean;
import org.overlord.rtgov.ui.client.model.ResolutionState;
import org.overlord.rtgov.ui.client.model.BatchRetryResult;
import org.overlord.rtgov.ui.client.model.CallTraceBean;
import org.overlord.rtgov.ui.client.model.Constants;
import org.overlord.rtgov.ui.client.model.MessageBean;
import org.overlord.rtgov.ui.client.model.SituationBean;
import org.overlord.rtgov.ui.client.model.SituationResultSetBean;
import org.overlord.rtgov.ui.client.model.SituationSummaryBean;
import org.overlord.rtgov.ui.client.model.SituationsFilterBean;
import org.overlord.rtgov.ui.client.model.TraceNodeBean;
import org.overlord.rtgov.ui.client.model.UiException;
import org.overlord.rtgov.ui.server.services.ISituationsServiceImpl;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
/**
* Concrete implementation of the faults service.
*
* @author eric.wittmann@redhat.com
*/
@ApplicationScoped
@Alternative
public class MockSituationsServiceImpl implements ISituationsServiceImpl {
private Map<String,SituationSummaryBean> idToSituation = new HashMap<String,SituationSummaryBean>();
/**
* Constructor.
*/
public MockSituationsServiceImpl() {
}
@PostConstruct
public void init() {
SituationSummaryBean situation = new SituationSummaryBean();
situation.setSituationId("1"); //$NON-NLS-1$
situation.setSeverity("critical"); //$NON-NLS-1$
situation.setType("Rate Limit Exceeded"); //$NON-NLS-1$
situation.setSubject("{urn:namespace}ImportantService|VeryImportantOperation"); //$NON-NLS-1$
situation.setTimestamp(new Date());
situation.setDescription("Some description of the Situation goes here in this column so that it can be read by the user."); //$NON-NLS-1$
situation.getProperties().put("Property-1", "Property one Value"); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("Property-2", "Property two Value"); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("Property-3", "Property three Value"); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("resolutionState", ResolutionState.UNRESOLVED.name()); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("host", "hostA"); //$NON-NLS-1$ //$NON-NLS-2$
idToSituation.put(situation.getSituationId(),situation);
situation = new SituationSummaryBean();
situation.setSituationId("2"); //$NON-NLS-1$
situation.setSeverity("high"); //$NON-NLS-1$
situation.setType("SLA Violation"); //$NON-NLS-1$
situation.setSubject("{urn:namespace}ServiceA|OperationB"); //$NON-NLS-1$
situation.setTimestamp(new Date());
situation.setDescription("Some description of the Situation goes here in this column so that it can be read by the user."); //$NON-NLS-1$
situation.getProperties().put("resolutionState", ResolutionState.UNRESOLVED.name()); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("host", "hostA"); //$NON-NLS-1$ //$NON-NLS-2$
idToSituation.put(situation.getSituationId(),situation);
situation = new SituationSummaryBean();
situation.setSituationId("3"); //$NON-NLS-1$
situation.setSeverity("high"); //$NON-NLS-1$
situation.setType("SLA Violation"); //$NON-NLS-1$
situation.setSubject("{urn:namespace}ServiceA|OperationB"); //$NON-NLS-1$
situation.setTimestamp(new Date());
situation.setDescription("Some description of the Situation goes here in this column so that it can be read by the user."); //$NON-NLS-1$
situation.getProperties().put("Property-1", "Property one Value"); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("Property-2", "Property two Value"); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("resolutionState", ResolutionState.UNRESOLVED.name()); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("host", "hostB"); //$NON-NLS-1$ //$NON-NLS-2$
idToSituation.put(situation.getSituationId(),situation);
situation = new SituationSummaryBean();
situation.setSituationId("4"); //$NON-NLS-1$
situation.setSeverity("low"); //$NON-NLS-1$
situation.setType("Rate Limit Approaching"); //$NON-NLS-1$
situation.setSubject("{urn:namespace}SomeService|AnotherOperation"); //$NON-NLS-1$
situation.setTimestamp(new Date());
situation.setDescription("Some description of the Situation goes here in this column so that it can be read by the user."); //$NON-NLS-1$
situation.getProperties().put("resolutionState", ResolutionState.RESOLVED.name()); //$NON-NLS-1$ //$NON-NLS-2$
situation.getProperties().put("host", "hostB"); //$NON-NLS-1$ //$NON-NLS-2$
idToSituation.put(situation.getSituationId(),situation);
}
/**
* @see org.overlord.rtgov.ui.server.services.ISituationsServiceImpl#search(SituationsFilterBean, int, String, boolean)
*/
@Override
public SituationResultSetBean search(SituationsFilterBean filters, int page, String sortColumn,
boolean ascending) throws UiException {
SituationResultSetBean rval = new SituationResultSetBean();
List<SituationSummaryBean> situations = filter(filters, idToSituation.values());
sort(situations, sortColumn, ascending);
rval.setSituations(situations);
rval.setItemsPerPage(20);
rval.setStartIndex(0);
rval.setTotalResults(situations.size());
return rval;
}
private List<SituationSummaryBean> filter(final SituationsFilterBean filter,
Iterable<SituationSummaryBean> situations) {
Predicate<SituationSummaryBean> predicate = notNull();
if (!isNullOrEmpty(filter.getDescription())) {
predicate = and(predicate, new Predicate<SituationSummaryBean>() {
@Override
public boolean apply(SituationSummaryBean input) {
return nullToEmpty(input.getDescription()).contains(filter.getDescription());
}
});
}
if (!isNullOrEmpty(filter.getResolutionState())) {
predicate = and(predicate, new Predicate<SituationSummaryBean>() {
@Override
public boolean apply(SituationSummaryBean input) {
return nullToEmpty(input.getResolutionState()).equals(filter.getResolutionState());
}
});
}
if (!isNullOrEmpty(filter.getSeverity())) {
predicate = and(predicate, new Predicate<SituationSummaryBean>() {
@Override
public boolean apply(SituationSummaryBean input) {
return nullToEmpty(input.getSeverity()).equals(filter.getSeverity());
}
});
}
if (!isNullOrEmpty(filter.getType())) {
predicate = and(predicate, new Predicate<SituationSummaryBean>() {
@Override
public boolean apply(SituationSummaryBean input) {
return nullToEmpty(input.getType()).equals(filter.getType());
}
});
}
if (!isNullOrEmpty(filter.getSubject())) {
predicate = and(predicate, new Predicate<SituationSummaryBean>() {
@Override
public boolean apply(SituationSummaryBean input) {
return nullToEmpty(input.getSubject()).contains(filter.getSubject());
}
});
}
if (!isNullOrEmpty(filter.getProperties())) {
final Properties properties = new Properties();
try {
properties.load(new StringReader(filter.getProperties().replaceAll(";|,", "\n")));
} catch (IOException e) {
e.printStackTrace();
}
predicate = and(predicate, new Predicate<SituationSummaryBean>() {
@Override
public boolean apply(SituationSummaryBean input) {
for (Entry<Object, Object> entry : properties.entrySet()) {
if (!nullToEmpty(input.getProperties().get(entry.getKey())).contains(
(String) entry.getValue())) {
return false;
}
}
return true;
}
});
}
Iterable<SituationSummaryBean> iterable = Iterables.filter(situations, predicate);
return newArrayList(iterable);
}
/**
* Sorts the list of situations.
* @param situations
* @param sortColumn
* @param ascending
*/
private void sort(List<SituationSummaryBean> situations, final String sortColumn, final boolean ascending) {
TreeSet<SituationSummaryBean> sorted = new TreeSet<SituationSummaryBean>(new Comparator<SituationSummaryBean>() {
@SuppressWarnings("unchecked")
@Override
public int compare(SituationSummaryBean sit1, SituationSummaryBean sit2) {
Comparable<?> c1;
Comparable<?> c2;
if (sortColumn.equals(Constants.SORT_COLID_TYPE)) {
c1 = sit1.getType();
c2 = sit2.getType();
} else if (sortColumn.equals(Constants.SORT_COLID_SUBJECT)) {
c1 = sit1.getSubject();
c2 = sit2.getSubject();
} else if (sortColumn.equals(Constants.SORT_COLID_RESOLUTION_STATE)) {
c1 = sit1.getResolutionState();
c2 = sit2.getResolutionState();
} else {
c1 = sit1.getTimestamp();
c2 = sit2.getTimestamp();
}
int rval = 0;
if (ascending) {
rval = ((Comparable<Object>) c1).compareTo(c2);
} else {
rval = ((Comparable<Object>) c2).compareTo(c1);
}
if (rval == 0) {
rval = sit1.getSituationId().compareTo(sit2.getSituationId());
}
return rval;
}
});
sorted.addAll(situations);
situations.clear();
situations.addAll(sorted);
}
/**
* @see org.overlord.rtgov.ui.server.services.ISituationsServiceImpl#getService(java.lang.String)
*/
@Override
public SituationBean get(String situationId) throws UiException {
SituationSummaryBean situationSummaryBean = idToSituation.get(situationId);
SituationBean situation = new SituationBean();
situation.setSituationId(situationSummaryBean.getSituationId()); //$NON-NLS-1$
situation.setSeverity(situationSummaryBean.getSeverity()); //$NON-NLS-1$
situation.setType(situationSummaryBean.getType()); //$NON-NLS-1$
situation.setSubject(situationSummaryBean.getSubject()); //$NON-NLS-1$
situation.setTimestamp(situationSummaryBean.getTimestamp());
situation.setDescription(situationSummaryBean.getDescription()); //$NON-NLS-1$
Map<String, String> properties = situationSummaryBean.getProperties();
situation.setProperties(properties); //$NON-NLS-1$ //$NON-NLS-2$
situation.getContext().add(new NameValuePairBean("Context-1", "This is the value of the context 1 property.")); //$NON-NLS-1$ //$NON-NLS-2$
situation.getContext().add(new NameValuePairBean("Context-2", "This is the value of the context 2 property.")); //$NON-NLS-1$ //$NON-NLS-2$
MessageBean message = createMockMessage();
situation.setMessage(message);
CallTraceBean callTrace = createMockCallTrace();
situation.setCallTrace(callTrace);
situation.setResubmitPossible(situation.getSubject().contains("OperationB"));
return situation;
}
/**
* Creates a mock message.
*/
private MessageBean createMockMessage() {
String msgContent = "<collection>\r\n" + //$NON-NLS-1$
"<asset>\r\n" + //$NON-NLS-1$
" <author>krisv</author>\r\n" + //$NON-NLS-1$
" <binaryContentAttachmentFileName></binaryContentAttachmentFileName>\r\n" + //$NON-NLS-1$
" <binaryLink>http://localhost:8080/drools-guvnor/rest/packages/srampPackage/assets/Evaluation/binary\r\n" + //$NON-NLS-1$
" </binaryLink>\r\n" + //$NON-NLS-1$
" <description></description>\r\n" + //$NON-NLS-1$
" <metadata>\r\n" + //$NON-NLS-1$
" <checkInComment><content from webdav></checkInComment>\r\n" + //$NON-NLS-1$
" <created>2012-10-05T14:34:14.970-04:00</created>\r\n" + //$NON-NLS-1$
" <disabled>false</disabled>\r\n" + //$NON-NLS-1$
" <format>bpmn</format>\r\n" + //$NON-NLS-1$
" <note><![CDATA[ <content from webdav> ]]></note>\r\n" + //$NON-NLS-1$
" <state>Draft</state>\r\n" + //$NON-NLS-1$
" <uuid>09512d48-585d-4393-86e2-39418369f066</uuid>\r\n" + //$NON-NLS-1$
" <versionNumber>9</versionNumber>\r\n" + //$NON-NLS-1$
" </metadata>\r\n" + //$NON-NLS-1$
" <published>2012-10-05T15:11:32.923-04:00</published>\r\n" + //$NON-NLS-1$
" <refLink>http://localhost:8080/drools-guvnor/rest/packages/srampPackage/assets/Evaluation\r\n" + //$NON-NLS-1$
" </refLink>\r\n" + //$NON-NLS-1$
" <sourceLink>http://localhost:8080/drools-guvnor/rest/packages/srampPackage/assets/Evaluation/source\r\n" + //$NON-NLS-1$
" </sourceLink>\r\n" + //$NON-NLS-1$
" <title>Evaluation</title>\r\n" + //$NON-NLS-1$
" </asset>\r\n" + //$NON-NLS-1$
"</asset>"; //$NON-NLS-1$
MessageBean msg = new MessageBean();
msg.setContent(msgContent);
return msg;
}
/**
* Creates a mock call trace!
*/
protected CallTraceBean createMockCallTrace() {
CallTraceBean callTrace = new CallTraceBean();
TraceNodeBean rootNode = createTraceNode("Call", "Success", "urn:switchyard:parent", "submitOrder", 47, 100); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
callTrace.getTasks().add(rootNode);
TraceNodeBean childNode = createTraceNode("Call", "Success", "urn:switchyard:application", "lookupItem", 10, 55); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
rootNode.getTasks().add(childNode);
TraceNodeBean leafNode = createTraceNode("Task", "Success", null, null, 3, 30); //$NON-NLS-1$ //$NON-NLS-2$
leafNode.setDescription("Information: Found the item."); //$NON-NLS-1$
childNode.getTasks().add(leafNode);
leafNode = createTraceNode("Task", "Success", null, null, 7, 70); //$NON-NLS-1$ //$NON-NLS-2$
leafNode.setDescription("Information: Secured the item."); //$NON-NLS-1$
childNode.getTasks().add(leafNode);
childNode = createTraceNode("Call", "Success", "urn:switchyard:application", "deliver", 8, 44); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
childNode.setIface("org.overlord.public.interface.Application"); //$NON-NLS-1$
childNode.setOperation("doIt"); //$NON-NLS-1$
childNode.getProperties().put("property-1", "Value for property 1"); //$NON-NLS-1$ //$NON-NLS-2$
childNode.getProperties().put("property-2", "Value for property 2"); //$NON-NLS-1$ //$NON-NLS-2$
childNode.getProperties().put("property-3", "Value for property 3"); //$NON-NLS-1$ //$NON-NLS-2$
childNode.getProperties().put("property-4", "Value for property 4"); //$NON-NLS-1$ //$NON-NLS-2$
rootNode.getTasks().add(childNode);
leafNode = createTraceNode("Task", "Success", null, null, 4, 100); //$NON-NLS-1$ //$NON-NLS-2$
leafNode.setDescription("Information: Delivering the order."); //$NON-NLS-1$
childNode.getTasks().add(leafNode);
return callTrace;
}
/**
* Creates a single trace node.
* @param type
* @param status
* @param component
* @param op
* @param duration
* @param percentage
*/
protected TraceNodeBean createTraceNode(String type, String status, String component, String op, long duration, int percentage) {
TraceNodeBean node = new TraceNodeBean();
node.setType(type);
node.setStatus(status);
node.setComponent(component);
node.setOperation(op);
node.setDuration(duration);
node.setPercentage(percentage);
return node;
}
/**
* @see org.overlord.rtgov.ui.server.services.ISituationsServiceImpl#resubmit(java.lang.String, java.lang.String)
*/
@Override
public void resubmit(String situationId, String message, String username) throws UiException {
// Do nothing!
System.out.println("Resubmitted message for situation: " + situationId); //$NON-NLS-1$
System.out.println(message);
SituationSummaryBean situationSummaryBean = idToSituation.get(situationId);
Map<String, String> properties = situationSummaryBean.getProperties();
if (username != null) {
properties.put("resubmitBy", username);
}
properties.put("resubmitAt", Long.toString(currentTimeMillis()));
if ("Success".equals(properties.get("resubmitResult"))) {
properties.put("resubmitErrorMessage", "Timeout while..");
properties.put("resubmitResult", "Error");
} else {
properties.put("resubmitResult", "Success");
properties.remove("resubmitErrorMessage");
}
}
@Override
public void assign(String situationId, String userName) throws UiException {
idToSituation.get(situationId).getProperties().put("assignedTo", userName);
}
@Override
public void unassign(String situationId) throws UiException {
SituationSummaryBean situationSummaryBean = idToSituation.get(situationId);
Map<String, String> properties = situationSummaryBean.getProperties();
properties.remove("assignedTo");
String resolutionState = properties.get("resolutionState");
if (resolutionState != null && RESOLVED != ResolutionState.valueOf(resolutionState)) {
properties.remove("resolutionState");
}
}
@Override
public void updateResolutionState(String situationId, ResolutionState resolutionState) {
idToSituation.get(situationId).getProperties().put("resolutionState", resolutionState.name());
}
@Override
public BatchRetryResult resubmit(SituationsFilterBean situationsFilterBean, String username) {
BatchRetryResult batchRetryResult = new BatchRetryResult();
batchRetryResult.setProcessedCount(4);
batchRetryResult.setFailedCount(2);
batchRetryResult.setIgnoredCount(1);
return batchRetryResult;
}
@Override
public void export(SituationsFilterBean situationsFilterBean, OutputStream outputStream) {
String situationId = idToSituation.keySet().iterator().next();
PrintWriter printWriter = new PrintWriter(outputStream);
try {
SituationBean situationBean = get(situationId);
printWriter.println(situationBean.getMessage().getContent());
} catch (UiException e) {
e.printStackTrace();
} finally {
if (null != printWriter) {
printWriter.close();
}
}
}
@Override
public int delete(SituationsFilterBean situationsFilterBean) throws UiException {
return 0;
}
@Override
public SituationResultSetBean getResubmitFailures(String situationId, int page, String sortColumn,
boolean ascending) throws UiException {
// TODO Auto-generated method stub
return null;
}
}