/*
* Copyright 2005-2007 WSO2, Inc. (http://wso2.com)
*
* 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.wso2.carbon.bpel.ui;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.simple.JSONObject;
import org.wso2.carbon.bpel.stub.mgt.types.*;
import org.wso2.carbon.statistics.stub.types.carbon.Metric;
import org.wso2.carbon.utils.xml.XMLPrettyPrinter;
import javax.xml.namespace.QName;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.*;
/**
* Some common UI functionalities, used in org.wso2.carbon.bpel.ui
*/
public class BpelUIUtil {
private static Log log = LogFactory.getLog("bpel.ui");
public static String encodeXML(String xmlString) {
if (xmlString != null && xmlString.length() != 0) {
log.info(xmlString);
log.info(" gg");
// System.out.println(xmlString);
xmlString = xmlString.replaceAll("<", "<");
xmlString = xmlString.replaceAll(">", ">");
xmlString = xmlString.replaceAll("\n", "");
}
return xmlString;
}
public static String encodeHTML(String aText) {
final StringBuilder result = new StringBuilder();
final StringCharacterIterator iterator = new StringCharacterIterator(aText);
char character = iterator.current();
while (character != CharacterIterator.DONE) {
if (character == '<') {
result.append("<");
} else if (character == '>') {
result.append(">");
} else if (character == '&') {
result.append("&");
// } else if (character == '\"') {
// result.append(""");
// } else if (character == '\t') {
// addCharEntity(9, result);
// } else if (character == '!') {
// addCharEntity(33, result);
// } else if (character == '#') {
// addCharEntity(35, result);
// } else if (character == '$') {
// addCharEntity(36, result);
// } else if (character == '%') {
// addCharEntity(37, result);
// } else if (character == '\'') {
// addCharEntity(39, result);
// } else if (character == '(') {
// addCharEntity(40, result);
// } else if (character == ')') {
// addCharEntity(41, result);
// } else if (character == '*') {
// addCharEntity(42, result);
// } else if (character == '+') {
// addCharEntity(43, result);
// } else if (character == ',') {
// addCharEntity(44, result);
// } else if (character == '-') {
// addCharEntity(45, result);
// } else if (character == '.') {
// addCharEntity(46, result);
// } else if (character == '/') {
// addCharEntity(47, result);
// } else if (character == ':') {
// addCharEntity(58, result);
// } else if (character == ';') {
// addCharEntity(59, result);
// } else if (character == '=') {
// addCharEntity(61, result);
// } else if (character == '?') {
// addCharEntity(63, result);
// } else if (character == '@') {
// addCharEntity(64, result);
// } else if (character == '[') {
// addCharEntity(91, result);
// } else if (character == '\\') {
// addCharEntity(92, result);
// } else if (character == ']') {
// addCharEntity(93, result);
// } else if (character == '^') {
// addCharEntity(94, result);
// } else if (character == '_') {
// addCharEntity(95, result);
// } else if (character == '`') {
// addCharEntity(96, result);
// } else if (character == '{') {
// addCharEntity(123, result);
// } else if (character == '|') {
// addCharEntity(124, result);
// } else if (character == '}') {
// addCharEntity(125, result);
// } else if (character == '~') {
// addCharEntity(126, result);
} else {
//the char is not a special one
//add it to the result as is
result.append(character);
}
character = iterator.next();
}
return result.toString();
}
public static String prettyPrint(String rawXML) {
rawXML = rawXML.replaceAll("\n|\\r|\\f|\\t", "");
rawXML = rawXML.replaceAll("> +<", "><");
InputStream xmlIn = new ByteArrayInputStream(rawXML.getBytes());
XMLPrettyPrinter xmlPrettyPrinter = new XMLPrettyPrinter(xmlIn);
rawXML = xmlPrettyPrinter.xmlFormat();
// rawXML = rawXML.replaceAll("\n", "<br>");
return rawXML;
}
public static TreeMap<String, QName> getEndpointRefsMap(ProcessInfoType info) {
EndpointRef_type0[] endpoints = info.getEndpoints().getEndpointRef();
TreeMap<String, QName> pLinkServiceMap = new TreeMap<String, QName>();
for (EndpointRef_type0 ref : endpoints) {
pLinkServiceMap.put(ref.getPartnerLink(), ref.getService());
}
return pLinkServiceMap;
}
public static Map<String, EndpointRef_type0> getEndpointReferences(ProcessInfoType info) {
EndpointRef_type0[] endpoints = info.getEndpoints().getEndpointRef();
Map<String, EndpointRef_type0> pLinkEprMap = new TreeMap<String, EndpointRef_type0>();
for (EndpointRef_type0 eprRef : endpoints) {
pLinkEprMap.put(eprRef.getPartnerLink(), eprRef);
}
return pLinkEprMap;
}
public static String makeCommaSeparatedListOfPackageVersions(String[] versionArray) {
if (versionArray == null) {
return "";
}
StringBuilder strBuilder = new StringBuilder();
for (String version : versionArray) {
strBuilder.append(version);
strBuilder.append(", ");
}
String finalString = strBuilder.toString();
return finalString.substring(0, finalString.lastIndexOf(","));
}
public static String getUndeployLink(String packageName, int pageNumber) {
return "package_list.jsp?operation=undeploy&packageName=" + packageName + "&pageNumber=" +
pageNumber;
}
public static String getRetireLink(String pid, String filter, String order, int pageNumber) {
return "process_list.jsp?operation=retire&processID=" + pid + "&filter=" + filter +
"&order=" + order + "&pageNumber=" + pageNumber;
}
public static String getActivateLink(String pid, String filter, String order, int pageNumber) {
return "process_list.jsp?operation=activate&processID=" + pid + "&filter=" + filter +
"&order=" + order + "&pageNumber=" + pageNumber;
}
public static QName stringToQName(String pid) {
int endURI = pid.indexOf('}');
return new QName(pid.substring(1, endURI), pid.substring(endURI + 1));
}
/*private String[] getServiceLocations(ProcessInfoType info) {
String[] serviceLocations = info.getEndpoints().getEndpointRef()[0].getServiceLocations().getServiceLocation();
//Removing the processEPR
return null;
}*/
public static String getProcessDefinition(ProcessInfoType info) {
BpelDefinition definition = info.getDefinitionInfo().getDefinition();
return definition.getExtraElement().toString();
}
public static String getInstanceOperations(InstanceStatus status, String iid) {
ResourceBundle rsc = ResourceBundle.getBundle("org.wso2.carbon.bpel.ui.i18n.Resources");
StringBuilder strBuilder = new StringBuilder();
if (status.equals(InstanceStatus.ACTIVE)) {
generateActiveActionLinks(strBuilder, rsc, iid);
} else if (status.equals(InstanceStatus.COMPLETED)) {
generateCompletedActionLinks(strBuilder, rsc, iid);
} else if (status.equals(InstanceStatus.SUSPENDED)) {
generateSuspendedActionLinks(strBuilder, rsc, iid);
} else if (status.equals(InstanceStatus.TERMINATED)) {
generateTerminatedActionLinks(strBuilder, rsc, iid);
} /*else if (status.equals(InstanceStatus.ERROR)) {
generateErrorActionLinks(strBuilder, rsc, iid);
}*/ else if (status.equals(InstanceStatus.FAILED)) {
// For failed instances only delete operation is available.
generateTerminatedActionLinks(strBuilder, rsc, iid);
}
return strBuilder.toString();
}
private static void generateActiveActionLinks(StringBuilder strBuilder, ResourceBundle rsc,
String iid) {
generateTDStart(strBuilder);
generateStartTag(strBuilder);
generateDeleteLink(strBuilder, rsc, iid);
generateEndTag(strBuilder);
generateStartTag(strBuilder);
generateSuspendLink(strBuilder, rsc, iid);
generateEndTag(strBuilder);
generateStartTag(strBuilder);
generateTerminateLink(strBuilder, rsc, iid);
generateEndTag(strBuilder);
generateTDEnd(strBuilder);
}
private static void generateCompletedActionLinks(StringBuilder strBuilder, ResourceBundle rsc,
String iid) {
generateTDStart(strBuilder);
generateStartTag(strBuilder);
generateDeleteLink(strBuilder, rsc, iid);
generateEndTag(strBuilder);
generateTDEnd(strBuilder);
}
private static void generateSuspendedActionLinks(StringBuilder strBuilder, ResourceBundle rsc,
String iid) {
generateTDStart(strBuilder);
generateStartTag(strBuilder);
generateResumeLink(strBuilder, rsc, iid);
generateEndTag(strBuilder);
generateStartTag(strBuilder);
generateTerminateLink(strBuilder, rsc, iid);
generateEndTag(strBuilder);
generateStartTag(strBuilder);
generateDeleteLink(strBuilder, rsc, iid);
generateEndTag(strBuilder);
generateTDEnd(strBuilder);
}
private static void generateTerminatedActionLinks(StringBuilder strBuilder, ResourceBundle rsc,
String iid) {
generateTDStart(strBuilder);
generateStartTag(strBuilder);
generateDeleteLink(strBuilder, rsc, iid);
generateEndTag(strBuilder);
generateTDEnd(strBuilder);
}
// private static void generateErrorActionLinks(StringBuilder strBuilder, ResourceBundle rsc,
// String iid) {
// generateTDStart(strBuilder);
// generateStartTag(strBuilder);
// generateTerminateLink(strBuilder, rsc, iid);
// generateEndTag(strBuilder);
// generateStartTag(strBuilder);
// generateDeleteLink(strBuilder, rsc, iid);
// generateEndTag(strBuilder);
// generateTDEnd(strBuilder);
// }
private static void generateSuspendLink(StringBuilder strBuilder, ResourceBundle rsc,
String iid) {
generateFirstPartOfTheLink(strBuilder, iid, "suspend");
strBuilder.append("&operation=suspend'");
strBuilder.append(" class='bpel-icon-link' style='background-image:url(images/suspend.gif);'>");
generateOnSuspendEventAttachScript(strBuilder, iid);
strBuilder.append(rsc.getString("suspend"));
strBuilder.append("</a>");
}
private static void generateResumeLink(StringBuilder strBuilder, ResourceBundle rsc,
String iid) {
generateFirstPartOfTheLink(strBuilder, iid, "resume");
strBuilder.append("&operation=resume'");
strBuilder.append(" class='bpel-icon-link' style='background-image:url(images/resume.gif);'>");
generateOnResumeEventAttachScript(strBuilder, iid);
strBuilder.append(rsc.getString("resume"));
strBuilder.append("</a>");
}
private static void generateTerminateLink(StringBuilder strBuilder, ResourceBundle rsc,
String iid) {
generateFirstPartOfTheLink(strBuilder, iid, "terminate");
strBuilder.append("&operation=terminate'");
strBuilder.append(" class='bpel-icon-link' style='background-image:url(images/terminate.gif);'>");
generateOnTerminateEventAttachScript(strBuilder, iid);
strBuilder.append(rsc.getString("terminate"));
strBuilder.append("</a>");
}
private static void generateDeleteLink(StringBuilder strBuilder, ResourceBundle rsc,
String iid) {
generateFirstPartOfTheLink(strBuilder, iid, "delete");
strBuilder.append("&operation=delete'");
strBuilder.append(" class='bpel-icon-link' style='background-image:url(images/delete.gif);'>");
generateOnDeleteEventAttachScript(strBuilder, iid);
strBuilder.append(rsc.getString("delete"));
strBuilder.append("</a>");
}
private static void generateOnDeleteEventAttachScript(StringBuilder strBuilder, String id) {
strBuilder.append("<script type='text/javascript'>(function(){jQuery('#instancedelete");
strBuilder.append(id);
strBuilder.append("').click(BPEL.instance.onDelete);})();</script>");
}
private static void generateOnResumeEventAttachScript(StringBuilder strBuilder, String id) {
strBuilder.append("<script type='text/javascript'>(function(){jQuery('#instanceresume");
strBuilder.append(id);
strBuilder.append("').click(BPEL.instance.onResume);})();</script>");
}
private static void generateOnSuspendEventAttachScript(StringBuilder strBuilder, String id) {
strBuilder.append("<script type='text/javascript'>(function(){jQuery('#instancesuspend");
strBuilder.append(id);
strBuilder.append("').click(BPEL.instance.onSuspend);})();</script>");
}
private static void generateOnTerminateEventAttachScript(StringBuilder strBuilder, String id) {
strBuilder.append("<script type='text/javascript'>(function(){jQuery('#instanceterminate");
strBuilder.append(id);
strBuilder.append("').click(BPEL.instance.onTerminate);})();</script>");
}
private static void generateFirstPartOfTheLink(StringBuilder strBuilder, String iid,
String operation) {
strBuilder.append("<a id='instance");
strBuilder.append(operation);
strBuilder.append(iid);
strBuilder.append("' href='list_instances.jsp?iid=");
strBuilder.append(iid);
}
private static void generateStartTag(StringBuilder strBuilder) {
//strBuilder.append("<td style='border-right:0px;border-left:0px;'>");
strBuilder.append("[ ");
}
private static void generateEndTag(StringBuilder strBuilder) {
strBuilder.append(" ] ");
}
private static void generateTDEnd(StringBuilder strBuilder) {
strBuilder.append("</td>");
}
private static void generateTDStart(StringBuilder strbuilder) {
strbuilder.append("<td style=\"white-space: nowrap\">");
}
public static void logWarn(String message, Exception e) {
if (log.isWarnEnabled()) {
log.warn(message, e);
}
}
public static String generateRetireLinkForProcessInfoPage(String processId) {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("process_info.jsp?Pid=");
strBuilder.append(processId);
strBuilder.append("&operation=retire");
return strBuilder.toString();
}
public static String generateActivateLinkForProcessInfoPage(String processId) {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("process_info.jsp?Pid=");
strBuilder.append(processId);
strBuilder.append("&operation=activate");
return strBuilder.toString();
}
public static int getTotalInstance(ProcessInfoType processInfo) {
int totalInstances = 0;
for (Instances_type0 processInstance : processInfo.getInstanceSummary().getInstances()) {
totalInstances += processInstance.getCount();
}
return totalInstances;
}
public static String getInstanceFilterURL(String processId) {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("list_instances.jsp?filter=pid=");
strBuilder.append(processId);
strBuilder.
append(" status=active|completed|suspended|terminated|failed|error&order=-last-active");
return strBuilder.toString();
}
/**
* Create instance summary JSON object from process instances array.
* @param processInstances process instance array
* @return instance summary object
*/
public static JSONObject createInstanceSummaryJSONObject(Instances_type0[] processInstances) {
JSONObject summary = new JSONObject();
int totalInstances = 0;
for (Instances_type0 processInstance : processInstances) {
String state = processInstance.getState().getValue();
if (state.equals(BPELUIConstant.INSTANCE_STATE_ACTIVE)) {
summary.put(BPELUIConstant.INSTANCE_STATE_ACTIVE, processInstance.getCount());
} else if (state.equals(BPELUIConstant.INSTANCE_STATE_COMPLETED)) {
summary.put(BPELUIConstant.INSTANCE_STATE_COMPLETED, processInstance.getCount());
} else if (state.equals(BPELUIConstant.INSTANCE_STATE_TERMINATED)) {
summary.put(BPELUIConstant.INSTANCE_STATE_TERMINATED, processInstance.getCount());
} else if (state.equals(BPELUIConstant.INSTANCE_STATE_FAILED)) {
summary.put(BPELUIConstant.INSTANCE_STATE_FAILED, processInstance.getCount());
} else if (state.equals(BPELUIConstant.INSTANCE_STATE_SUSPENDED)) {
summary.put(BPELUIConstant.INSTANCE_STATE_SUSPENDED, processInstance.getCount());
} else {
log.error("Invalid instance state: " + state);
}
totalInstances += processInstance.getCount();
}
summary.put(BPELUIConstant.TOTAL_INSTANCES, totalInstances);
return summary;
}
/**
* Create instance summary JSON object from return value of getInstanceSummary operation
* of instance management web service.
* @param globalInstanceSummary instance summary from instance management API(global counts)
* @return global instance count
*/
public static JSONObject createInstanceSummaryJSONObject(InstanceSummaryE globalInstanceSummary) {
JSONObject summary = new JSONObject();
summary.put(BPELUIConstant.INSTANCE_STATE_ACTIVE, globalInstanceSummary.getActive());
summary.put(BPELUIConstant.INSTANCE_STATE_COMPLETED, globalInstanceSummary.getCompleted());
summary.put(BPELUIConstant.INSTANCE_STATE_TERMINATED, globalInstanceSummary.getTerminated());
summary.put(BPELUIConstant.INSTANCE_STATE_FAILED, globalInstanceSummary.getFailed());
summary.put(BPELUIConstant.INSTANCE_STATE_SUSPENDED, globalInstanceSummary.getSuspended());
return summary;
}
public static JSONObject getMemoryInfoJSONObject(Metric usedMem, Metric totalMem){
JSONObject memInfo = new JSONObject();
memInfo.put("UsedMemoryValue", usedMem.getValue());
memInfo.put("UsedMemoryUnit", usedMem.getUnit());
memInfo.put("TotalMemoryValue", totalMem.getValue());
memInfo.put("TotalMemoryUnit", totalMem.getUnit());
return memInfo;
}
public static String createLongRunningInstanceJSONString(PaginatedInstanceList longRunningInstances) {
//LinkedHashMap is introduced instead of JSONObject, in-order to keep the order of the instances
LinkedHashMap<String, JSONObject> longRunning = new LinkedHashMap<String, JSONObject>();
if (longRunningInstances.isInstanceSpecified()) {
for (LimitedInstanceInfoType instance : longRunningInstances.getInstance()) {
JSONObject instanceJson = new JSONObject();
long instanceLifetimeTillLastActive =
(instance.getDateLastActive().getTime().getTime() -
instance.getDateStarted().getTime().getTime());
long instanceLifetimeFromLastActiveToNow =
(new Date().getTime() -
instance.getDateLastActive().getTime().getTime());
instanceJson.put(BPELUIConstant.INSTANCE_LIFETIME_TILL_LASTACTIVE,
instanceLifetimeTillLastActive);
instanceJson.put(BPELUIConstant.INSTANCE_LIFETIME_FROM_LASTACTIVE_TO_NOW,
instanceLifetimeFromLastActiveToNow);
longRunning.put(instance.getIid(), instanceJson);
}
}
return JSONObject.toJSONString(longRunning);
}
}