1 16 package org.outerj.daisy.httpconnector; 17 18 import org.mortbay.http.HttpResponse; 19 import org.mortbay.http.HttpRequest; 20 import org.outerx.daisy.x10.ErrorDocument; 21 import org.outerx.daisy.x10.CauseType; 22 import org.outerj.daisy.repository.RepositoryException; 23 import org.outerj.daisy.repository.Repository; 24 import org.outerj.daisy.repository.variant.Branch; 25 import org.outerj.daisy.repository.variant.Language; 26 import org.outerj.daisy.repository.variant.BranchNotFoundException; 27 import org.outerj.daisy.repository.variant.LanguageNotFoundException; 28 29 import java.io.IOException ; 30 import java.util.Map ; 31 import java.util.Iterator ; 32 33 public class HttpUtil { 34 public static void sendCustomError(String message, int code, HttpResponse response) 35 throws IOException 36 { 37 response.setStatus(code); 38 response.setContentType("text/xml"); 39 ErrorDocument errorDocument = ErrorDocument.Factory.newInstance(); 40 ErrorDocument.Error errorXml = errorDocument.addNewError(); 41 errorXml.setDescription(message); 42 errorDocument.save(response.getOutputStream()); 43 response.commit(); 44 } 45 46 public static void sendCustomError(Throwable throwable, int code, HttpResponse response) 47 throws IOException 48 { 49 response.setStatus(code); 50 response.setContentType("text/xml"); 51 52 ErrorDocument errorDocument = buildErrorXml(throwable); 53 errorDocument.save(response.getOutputStream()); 54 response.commit(); 55 } 56 57 public static ErrorDocument buildErrorXml(Throwable throwable) { 58 ErrorDocument errorDocument = ErrorDocument.Factory.newInstance(); 59 ErrorDocument.Error errorXml = errorDocument.addNewError(); 60 CauseType causeXml = errorXml.addNewCause(); 61 createCause(throwable, causeXml); 62 return errorDocument; 63 } 64 65 private static CauseType createCause(Throwable throwable, CauseType causeXml) { 66 CauseType.Exception exceptionXml = causeXml.addNewException(); 67 exceptionXml.setType(throwable.getClass().getName()); 68 exceptionXml.setMessage(throwable.getMessage()); 69 70 if (throwable instanceof RepositoryException) { 71 RepositoryException repositoryException = (RepositoryException)throwable; 72 Map state = repositoryException.getState(); 73 if (state != null) { 74 CauseType.ExceptionData exceptionData = causeXml.addNewExceptionData(); 75 76 Iterator stateIt = state.entrySet().iterator(); 77 while (stateIt.hasNext()) { 78 Map.Entry entry = (Map.Entry )stateIt.next(); 79 CauseType.ExceptionData.Parameter parameter = exceptionData.addNewParameter(); 80 parameter.setName((String )entry.getKey()); 81 parameter.setValue((String )entry.getValue()); 82 } 83 } 84 } 85 86 CauseType.StackTrace stackTraceXml = causeXml.addNewStackTrace(); 87 StackTraceElement [] stackTraceElements = throwable.getStackTrace(); 88 for (int i = 0; i < stackTraceElements.length; i++) { 89 StackTraceElement stackTraceElement = stackTraceElements[i]; 90 CauseType.StackTrace.StackTraceElement stackTraceElementXml = stackTraceXml.addNewStackTraceElement(); 91 stackTraceElementXml.setClassName(stackTraceElement.getClassName()); 92 stackTraceElementXml.setFileName(stackTraceElement.getFileName()); 93 stackTraceElementXml.setLineNumber(stackTraceElement.getLineNumber()); 94 stackTraceElementXml.setMethodName(stackTraceElement.getMethodName()); 95 stackTraceElementXml.setNativeMethod(stackTraceElement.isNativeMethod()); 96 } 97 98 Throwable cause = throwable.getCause(); 99 if (cause != null) { 100 CauseType causeXml2 = causeXml.addNewCause(); 101 createCause(cause, causeXml2); 102 } 103 104 return causeXml; 105 } 106 107 public static String getStringParam(HttpRequest request, String name) throws Exception { 108 String stringValue = request.getParameter(name); 109 if (stringValue == null || stringValue.equals("")) 110 throw new BadRequestException("Missing request parameter: " + name); 111 112 return stringValue; 113 } 114 115 public static String getStringParam(HttpRequest request, String name, String defaultValue) throws Exception { 116 String stringValue = request.getParameter(name); 117 if (stringValue == null || stringValue.equals("")) 118 return defaultValue; 119 120 return stringValue; 121 } 122 123 public static long getLongParam(HttpRequest request, String name) throws Exception { 124 String stringValue = request.getParameter(name); 125 if (stringValue == null || stringValue.equals("")) 126 throw new BadRequestException("Missing request parameter: " + name); 127 128 try { 129 long longValue = Long.parseLong(stringValue); 130 return longValue; 131 } catch (NumberFormatException e) { 132 throw new BadRequestException("The value of the request parameter \"" + name + "\" should be an integer value, got: " + stringValue); 133 } 134 } 135 136 public static boolean getBooleanParam(HttpRequest request, String name) throws Exception { 137 String stringValue = request.getParameter(name); 138 if (stringValue == null || stringValue.equals("")) 139 throw new BadRequestException("Missing request parameter: " + name); 140 141 return stringValue.equalsIgnoreCase("true"); 142 } 143 144 public static long getBranchId(HttpRequest request, Repository repository) throws BadRequestException, RepositoryException { 145 return getBranchId(request, repository, "branch"); 146 } 147 148 public static long getBranchId(HttpRequest request, Repository repository, String paramName) throws BadRequestException, RepositoryException { 149 String branchParam = request.getParameter(paramName); 150 if (branchParam == null || branchParam.length() == 0) { 151 return Branch.MAIN_BRANCH_ID; 152 } else if (Character.isDigit(branchParam.charAt(0))) { 153 try { 154 return Long.parseLong(branchParam); 155 } catch (NumberFormatException e) { 156 throw new BadRequestException("Invalid value in \"" + paramName + "\" request parameter: " + branchParam); 157 } 158 } else { 159 try { 160 return repository.getVariantManager().getBranch(branchParam, false).getId(); 161 } catch (BranchNotFoundException e) { 162 throw new BadRequestException("Non-existing branch in \"" + paramName + "\" request parameter: " + branchParam); 163 } 164 } 165 } 166 167 public static long getLanguageId(HttpRequest request, Repository repository) throws BadRequestException, RepositoryException { 168 return getLanguageId(request, repository, "language"); 169 } 170 171 public static long getLanguageId(HttpRequest request, Repository repository, String paramName) throws BadRequestException, RepositoryException { 172 String languageParam = request.getParameter(paramName); 173 if (languageParam == null || languageParam.length() == 0) { 174 return Language.DEFAULT_LANGUAGE_ID; 175 } else if (Character.isDigit(languageParam.charAt(0))) { 176 try { 177 return Long.parseLong(languageParam); 178 } catch (NumberFormatException e) { 179 throw new BadRequestException("Invalid value in \"" + paramName + "\" request parameter: " + languageParam); 180 } 181 } else { 182 try { 183 return repository.getVariantManager().getLanguage(languageParam, false).getId(); 184 } catch (LanguageNotFoundException e) { 185 throw new BadRequestException("Non-existing language in \"" + paramName + "\" request parameter: " + languageParam); 186 } 187 } 188 } 189 190 public static long parseId(String name, String value) throws BadRequestException { 191 try { 192 return Long.parseLong(value); 193 } catch (NumberFormatException e) { 194 throw new BadRequestException("Invalid " + name + " ID: " + value); 195 } 196 } 197 } 198 | Popular Tags |