/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. licenses this file to You 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 com.esri.gpt.catalog.schema; import java.util.ArrayList; import com.esri.gpt.framework.jsf.MessageBroker; import com.esri.gpt.framework.util.Val; import java.util.List; import javax.faces.application.FacesMessage; /** * Defines a list of validation errors. */ public class ValidationErrors extends ArrayList<ValidationError> { // class variables ============================================================= // instance variables ========================================================== // constructors ================================================================ /** Default constructor. */ public ValidationErrors() {} // properties ================================================================== // methods ===================================================================== /** * Adds a member to the collection. * <br/>The member will not be added if it is null. * @param member the member to add * @return true if the member was added */ @Override public boolean add(ValidationError member) { if (member != null) { return super.add(member); } else { return false; } } /** * Adds a validation error with an ValidationError.REASONCODE_ISINVALID * reason code. * @param section the section containing the invalid parameter * @param parameter the invalid parameter */ public void addInvalidParameter(Section section, Parameter parameter) { add(new ValidationError( section,parameter,ValidationError.REASONCODE_PARAMETER_ISINVALID)); } /** * Builds validation error messages. * @param messageBroker the message broker * @param includeXpath if true, include parameter content xpath selection expressions */ public void buildMessages(MessageBroker messageBroker, boolean includeXpath) { IMessageAppender appender = new MessageBrokerAppender(messageBroker); buildMessages(messageBroker, appender, includeXpath); } /** * Builds validation error messages. * @param messageBroker the message broker * @param includeXpath if true, include parameter content xpath selection expressions */ public void buildMessages(MessageBroker messageBroker, List<String> list, boolean includeXpath) { IMessageAppender appender = new ListAppender(messageBroker, list); buildMessages(messageBroker, appender, includeXpath); } /** * Builds validation error messages. * @param messageBroker the message broker * @param appender appender * @param includeXpath if true, include parameter content xpath selection expressions */ private void buildMessages(MessageBroker messageBroker, IMessageAppender appender, boolean includeXpath) { for (ValidationError error: this) { String sCode = error.getReasonCode(); if (sCode.equals(ValidationError.REASONCODE_TITLE_ISREQUIRED)) { appender.append("mdValidation.titleIsRequired"); } else if (sCode.equals(ValidationError.REASONCODE_ENVELOPE_ISINVALID)) { appender.append("mdValidation.envelopeIsInvalid"); } else if (sCode.equals(ValidationError.REASONCODE_XML_ISINVALID)) { appender.append(error.getMessage()); } else if (sCode.equals(ValidationError.REASONCODE_XSD_ISINVALID)) { appender.append(error.getMessage()); } else if (sCode.equals(ValidationError.REASONCODE_XSD_VIOLATION)) { appender.append(error.getMessage()); } else if (sCode.equals(ValidationError.REASONCODE_SCHEMATRON_EXCEPTION)) { appender.appendDirect(error.getMessage()); } else if (sCode.equals(ValidationError.REASONCODE_SCHEMATRON_VIOLATION)) { appender.appendDirect(error.getMessage()); if (includeXpath) { String sLocation = Val.chkStr(error.location); if (sLocation.length() > 0) { appender.appendDirect("... "+sLocation); } } } else { String sMsg = "???"; Section section = error.getSection(); Parameter parameter = error.getParameter(); ArrayList<String> alMsgs = new ArrayList<String>(); if (parameter != null) { sMsg = parameter.getKey(); if (parameter.getLabel() != null) { sMsg = messageBroker.retrieveMessage(parameter.getLabel().getResourceKey()); } } alMsgs.add(sMsg); while (section != null) { sMsg = section.getKey(); if (section.getLabel() != null) { sMsg = messageBroker.retrieveMessage(section.getLabel().getResourceKey()); alMsgs.add(sMsg); } section = section.getParent(); } sMsg = ""; for (int i=alMsgs.size()-1;i>=0;i--) { if (sMsg.length() == 0) { sMsg = alMsgs.get(i); } else { String[] args = {sMsg,alMsgs.get(i)}; sMsg = messageBroker.retrieveMessage("mdValidation.parentChild",args); } } if (sMsg.length() == 0) sMsg = "???"; String sReason = "mdValidation.isInvalid"; if (sCode.equals(ValidationError.REASONCODE_PARAMETER_ISREQUIRED)) { sReason = "mdValidation.isRequired"; } String[] args = {sMsg}; appender.append(sReason,args); if (includeXpath) { String sXPath = error.getParameterXPath(); if (sXPath.length() > 0) { appender.appendDirect(sXPath); } } } } } /** * Returns the string representation of the object. * @return the string */ @Override public String toString() { StringBuffer sb = new StringBuffer(getClass().getName()); if (size() == 0) { sb.append(" ()"); } else { sb.append(" (\n"); for (ValidationError member: this) { sb.append(member).append("\n"); } sb.append(") ===== end ").append(getClass().getName()); } return sb.toString(); } /** * Message appender. */ private interface IMessageAppender { /** * Appends string directly. */ void appendDirect(String message); /** * Appends message identified by resource key. * @param resourceKey resource key */ void append(String resourceKey); /** * Appends message identified by resource key. * @param resourceKey resource key * @param args array of arguments to be embeded within message */ void append(String resourceKey, String [] args); } /** * Message appender which appends messages to the message broker. */ private class MessageBrokerAppender implements IMessageAppender { /** * Message broker */ private MessageBroker _messageBroker; /** * Appends string directly. */ public void appendDirect(String message) { _messageBroker.addMessage( new FacesMessage(FacesMessage.SEVERITY_ERROR,Val.chkStr(message),null)); } /** * Creates instance of the appender. * @param messageBroker message broker */ public MessageBrokerAppender(MessageBroker messageBroker) { _messageBroker = messageBroker; } /** * Appends message identified by resource key. * @param resourceKey resource key */ public void append(String resourceKey) { _messageBroker.addErrorMessage(resourceKey); } /** * Appends message identified by resource key. * @param resourceKey resource key * @param args array of arguments to be embeded within message */ public void append(String resourceKey, String [] args) { _messageBroker.addErrorMessage(resourceKey, args); } } /** * Message appender which appends messages to message list. */ private class ListAppender implements IMessageAppender { /** * Message broker */ private MessageBroker _messageBroker; /** * Message list to append error messages. */ private List<String> _messages; /** * Creates instance of the appender. * @param messageBroker message broker * @param messages message list to append error messages */ public ListAppender(MessageBroker messageBroker, List<String> messages) { _messageBroker = messageBroker; _messages = messages; } /** * Appends string directly. */ public void appendDirect(String message) { _messages.add(Val.chkStr(message)); } /** * Appends message identified by resource key. * @param resourceKey resource key */ public void append(String resourceKey) { _messages.add(_messageBroker.retrieveMessage(resourceKey)); } /** * Appends message identified by resource key. * @param resourceKey resource key * @param args array of arguments to be embeded within message */ public void append(String resourceKey, String [] args) { _messages.add(_messageBroker.retrieveMessage(resourceKey, args)); } } }