package com.joe.utilities.core.util; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * This ReturnStatus has a list of ReturnStatusItems rather than a map so that the * same error code may be returned multiple times. * A ReturnStatus can be commonly used to return the status of a function. * The status is composed of zero or more status items * that contribute to the general Return Status. Zero elements would indicate that the return status is completely OK. * The one or more ReturnStatusItem instance may each point to a error, warning condition, or informational message * Errors will block the current flow of business logic. * Warnings will usually lead to an interactive decision by the presentation layer to treat the condition as an error or not or possibly identifiy a condition that will turn into an error later in a workflow. * Informational status items refer to successful execution but with an advisory message included in the return. * * The ReturnStatus will determine a general status based on the presence and status of its component items. * * @author Dave Ousey * @author Scott Beebe * * Creation date: 1/16/2007 9 AM * Copyright (c) 2007 MEDecision, Inc. All rights reserved. */ public class StatusItemListReturnStatus extends ReturnStatus { private Collection<ReturnStatusItem> statusItems = new ArrayList<ReturnStatusItem>(); /** * Simple constructor */ public StatusItemListReturnStatus() { } /** * Constructs this ReturnStatus using another as a starting point * @param existingStatus */ public StatusItemListReturnStatus(StatusItemListReturnStatus existingStatus) { appendStatusItems(existingStatus); } /** * Method getStatus. Return status derived from the state of the contained status items. * If any errors exist then general status is Error. * Else if any warnings exist then general status is Warning * Else if any informational items exist then general status is Informational * Else Status is OK * @return Status */ public Status getStatus() { boolean warningsExist = false; boolean informationalMessagesExist = false; for (ReturnStatusItem item : statusItems) { // If one error exists, then general status is an error if (!item.isSuccess()) return Status.ERROR; if (item.getStatus() == Status.WARNING) warningsExist = true; else if (item.getStatus() == Status.INFORMATIONAL) informationalMessagesExist = true; } if (warningsExist) return Status.WARNING; else if (informationalMessagesExist) return Status.INFORMATIONAL; else return Status.OK; } /** * Method addError. Create and add an error return status item * * @param code * @return ReturnStatusItem */ public ReturnStatusItem addError(String code) { return addReturnStatusItem(code, Status.ERROR, null, null); } /** * Method addError. * @param code * @param description * @return ReturnStatusItem */ public ReturnStatusItem addError(String code, String description) { return addReturnStatusItem(code, Status.ERROR, description, null); } /** * Method addError. * @param code * @param description * @param parameterMap * @return ReturnStatusItem */ public ReturnStatusItem addError(String code, String description, Map<String, String> parameterMap) { return addReturnStatusItem(code, Status.ERROR, description, parameterMap); } /** * Method addWarning. Create and add a warning return status item * * @param code * @return ReturnStatusItem */ public ReturnStatusItem addWarning(String code) { return addReturnStatusItem(code, Status.WARNING, null, null); } /** * Method addWarning. * @param code * @param description * @return ReturnStatusItem */ public ReturnStatusItem addWarning(String code, String description) { return addReturnStatusItem(code, Status.WARNING, description, null); } /** * Adds / Replaces the current warning based on code. * This assumes that this code/description is the most accurate. If an error/information message was * added with the same code then this method will replace that message with the new warning. * @param code Unique Code to identify the warning * @param description The description associated with the code. * @return ReturnStatusItem The latest return status item. */ public ReturnStatusItem addReplaceUniqueWarning(String code, String description) { if (hasItemWithCode(code)) { clearItemWithCode(code); } return addWarning(code,description); } /** * Method addWarning. * @param code * @param description * @param parameterMap * @return ReturnStatusItem */ public ReturnStatusItem addWarning(String code, String description, Map<String, String> parameterMap) { return addReturnStatusItem(code, Status.WARNING, description, parameterMap); } /** * Method addReturnStatusItem. * @param code * @param description * @param parameterMap * @return ReturnStatusItem */ public ReturnStatusItem addReturnStatusItem(String code, Status status, String description, Map<String, String> parameterMap) { ReturnStatusItem item = new ReturnStatusItem(code, status, description, parameterMap); this.statusItems.add(item); return item; } /** * Method appendStatusItems. * * @param returnStatus * @return void */ public void appendStatusItems(StatusItemListReturnStatus returnStatus) { statusItems.addAll(returnStatus.statusItems); } /** * Method appendStatusItems. * * @param returnStatus * @return void */ public void appendStatusItems(ReturnStatus returnStatus) { ReturnStatusItem[] statusItemArray = returnStatus.getResultStatusItems(); for (int i=0; i<returnStatus.getResultStatusItems().length; i++) { statusItems.add(statusItemArray[i]); } } public void appendStatusItems(Collection<ReturnStatusItem> items) { if ( items == null || items.size() == 0){ return; } for(ReturnStatusItem item: items){ addReturnStatusItem(item.getCode(), item.getStatus(), item.getDefaultMessage(), item.getParameterMap()); } } /** * Method hasErrors. * @return boolean */ public boolean hasErrors() { for (ReturnStatusItem item : statusItems) { if (item.getStatus() == Status.ERROR) return true; } return false; } /** * Method hasErrorsOrWarnings. * @return boolean */ public boolean hasErrorsOrWarnings() { for (ReturnStatusItem item : statusItems) { if (item.getStatus() == Status.ERROR || item.getStatus() == Status.WARNING) return true; } return false; } /** * Method hasWarnings. * @return boolean */ public boolean hasWarnings() { for (ReturnStatusItem item : statusItems) { if (item.getStatus() == Status.WARNING) return true; } return false; } /** * Method isSuccess. If any status items are not successful, then return false; else true * @return boolean */ public boolean isSuccess() { for (ReturnStatusItem item : statusItems) { if (!item.isSuccess()) { return false; } } return true; } /** * Method getResultStatusItems. Return the items * @return ReturnStatusItem[] */ public ReturnStatusItem[] getResultStatusItems() { ReturnStatusItem[] returnValue = new ReturnStatusItem[statusItems.size()]; returnValue = this.statusItems.toArray(returnValue); return returnValue; } /** * Method getErrorResultStatusItems. Get errors * @return ReturnStatusItem[] */ public ReturnStatusItem[] getErrorResultStatusItems() { return getResultStatusItemsWithStatus(Status.ERROR); } /** * Method getWarningResultStatusItems. Get errors * @return ReturnStatusItem[] */ public ReturnStatusItem[] getWarningResultStatusItems() { return getResultStatusItemsWithStatus(Status.WARNING); } /** * Method getInformationalResultStatusItems. Get errors * @return ReturnStatusItem[] */ public ReturnStatusItem[] getInformationalResultStatusItems() { return getResultStatusItemsWithStatus(Status.INFORMATIONAL); } /** * Method getStatusItemCode. * @return Set<String> */ public Set<String> getStatusItemCodes() { Set<String> statusItemCodes = new HashSet<String>(); for (ReturnStatusItem statusItem : statusItems) { statusItemCodes.add(statusItem.getCode()); } return statusItemCodes; } /** * Method hasItemWithCode. Determines if given code exists in the set * @param code * @return boolean */ public boolean hasItemWithCode(String code) { return getStatusItemCodes().contains(code); } /** * Method hasAnyItemsInCodeSet. * @param codes * @return boolean */ public boolean hasAnyItemsInCodeSet(Set<String> codes) { if (codes == null) return false; Set<String> statusItemCodes = getStatusItemCodes(); for (String code: getStatusItemCodes()) { if (statusItemCodes.contains(code)) return true; } return false; } /** * Method clearItemWithCode. Deletes the item with the given code * @param code * @return void */ public void clearItemWithCode(String code) { List<ReturnStatusItem> targetItems = new ArrayList<ReturnStatusItem>(statusItems.size()); for (ReturnStatusItem statusItem : statusItems) { if (statusItem.getCode().equals(code)) targetItems.add(statusItem); } statusItems.removeAll(targetItems); } /** * Method getResultStatusItemsWithStatus. Return the items * @return ReturnStatusItem[] */ private ReturnStatusItem[] getResultStatusItemsWithStatus(Status status) { ReturnStatusItem[] returnValue = new ReturnStatusItem[statusItems.size()]; int index = 0; for (ReturnStatusItem item : statusItems) { if (item.getStatus() == status) returnValue[index++] = item; } return returnValue; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ @Override public String toString() { StringBuffer returnValue = new StringBuffer(this.getClass().getName()); returnValue.append("("); for (ReturnStatusItem item : statusItems) { returnValue.append(item); returnValue.append(","); } returnValue.append(")"); return returnValue.toString(); } /** * Method createErrorReturnStatus. Convenience method to create * * @param errorCode * @param defaultMessage * @return ReturnStatus */ public static StatusItemListReturnStatus createErrorReturnStatus(String errorCode, String defaultMessage) { StatusItemListReturnStatus returnStatus = new StatusItemListReturnStatus(); returnStatus.addError(errorCode, defaultMessage); return returnStatus; } public Collection<ReturnStatusItem> getStatusItems(){ return statusItems; } }