001 /* 002 * JBoss, Home of Professional Open Source. 003 * Copyright 2008, Red Hat Middleware LLC, and individual contributors 004 * as indicated by the @author tags. See the copyright.txt file in the 005 * distribution for a full listing of individual contributors. 006 * 007 * This is free software; you can redistribute it and/or modify it 008 * under the terms of the GNU Lesser General Public License as 009 * published by the Free Software Foundation; either version 2.1 of 010 * the License, or (at your option) any later version. 011 * 012 * This software is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * You should have received a copy of the GNU Lesser General Public 018 * License along with this software; if not, write to the Free 019 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 020 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 021 */ 022 package org.jboss.dna.common.collection; 023 024 import net.jcip.annotations.Immutable; 025 import org.jboss.dna.common.i18n.I18n; 026 import org.jboss.dna.common.util.CheckArg; 027 import org.jboss.dna.common.util.HashCode; 028 029 /** 030 * @author Randall Hauch 031 */ 032 @Immutable 033 public class Problem { 034 035 public static final int DEFAULT_CODE = 0; 036 037 public enum Status { 038 ERROR, 039 WARNING, 040 INFO; 041 } 042 043 private final Status status; 044 private final I18n message; 045 private final Object[] parameters; 046 private final Throwable throwable; 047 private final int code; 048 private final String resource; 049 private final String location; 050 051 public Problem( Status status, 052 int code, 053 I18n message, 054 Object[] params, 055 String resource, 056 String location, 057 Throwable throwable ) { 058 CheckArg.isNotNull(status, "status"); 059 CheckArg.isNotNull(message, "message"); 060 this.status = status; 061 this.code = code; 062 this.message = message; 063 this.parameters = params; 064 this.resource = resource != null ? resource.trim() : null; 065 this.location = location != null ? location.trim() : null; 066 this.throwable = throwable; 067 } 068 069 /** 070 * @return code 071 */ 072 public int getCode() { 073 return this.code; 074 } 075 076 /** 077 * @return location 078 */ 079 public String getLocation() { 080 return this.location; 081 } 082 083 /** 084 * Get the message written in the current locale. 085 * 086 * @return the message 087 */ 088 public String getMessageString() { 089 return this.message.text(this.parameters); 090 } 091 092 /** 093 * @return message 094 */ 095 public I18n getMessage() { 096 return this.message; 097 } 098 099 public Object[] getParameters() { 100 return this.parameters; 101 } 102 103 /** 104 * @return resource 105 */ 106 public String getResource() { 107 return this.resource; 108 } 109 110 /** 111 * @return status 112 */ 113 public Status getStatus() { 114 return this.status; 115 } 116 117 /** 118 * @return throwable 119 */ 120 public Throwable getThrowable() { 121 return this.throwable; 122 } 123 124 /** 125 * {@inheritDoc} 126 * 127 * @see java.lang.Object#hashCode() 128 */ 129 @Override 130 public int hashCode() { 131 return HashCode.compute(status, code, message, resource, location); 132 } 133 134 /** 135 * {@inheritDoc} 136 * 137 * @see java.lang.Object#equals(java.lang.Object) 138 */ 139 @Override 140 public boolean equals( Object obj ) { 141 if (obj == this) return true; 142 if (obj instanceof Problem) { 143 Problem that = (Problem)obj; 144 if (this.getStatus() != that.getStatus()) return false; 145 if (this.getCode() != that.getCode()) return false; 146 if (!this.getMessage().equals(that.getMessage())) return false; 147 if (!this.getParameters().equals(that.getParameters())) return false; 148 149 String thisResource = this.getResource(); 150 String thatResource = that.getResource(); 151 if (thisResource != thatResource) { 152 if (thisResource == null || !thisResource.equals(thatResource)) return false; 153 } 154 155 String thisLocation = this.getLocation(); 156 String thatLocation = that.getLocation(); 157 if (thisLocation != thatLocation) { 158 if (thisLocation == null || !thisLocation.equals(thatLocation)) return false; 159 } 160 161 Throwable thisThrowable = this.getThrowable(); 162 Throwable thatThrowable = that.getThrowable(); 163 if (thisThrowable != thatThrowable) { 164 if (thisThrowable == null || !thisThrowable.equals(thatThrowable)) return false; 165 } 166 return true; 167 } 168 return false; 169 } 170 171 /** 172 * {@inheritDoc} 173 * 174 * @see java.lang.Object#toString() 175 */ 176 @Override 177 public String toString() { 178 StringBuilder sb = new StringBuilder(); 179 sb.append(this.getStatus()).append(": "); 180 if (this.getCode() != DEFAULT_CODE) { 181 sb.append("(").append(this.getCode()).append(") "); 182 } 183 sb.append(this.getMessageString()); 184 if (this.getResource() != null) { 185 sb.append(" Resource=\"").append(this.getResource()).append("\""); 186 } 187 if (this.getLocation() != null) { 188 sb.append(" At \"").append(this.getLocation()).append("\""); 189 } 190 if (this.getThrowable() != null) { 191 sb.append(" (threw ").append(this.getThrowable().getLocalizedMessage()).append(")"); 192 } 193 return sb.toString(); 194 } 195 196 }