public void handleMessage(Message msg) { Fault fault = (Fault) msg.getContent(Exception.class); if (fault.getDetail() != null && !MessageUtils.getContextualBoolean(msg, DISABLE_FAULT_MAPPING, false)) { processFaultDetail(fault, msg); setStackTrace(fault, msg); } FaultMode faultMode = FaultMode.UNCHECKED_APPLICATION_FAULT; // Check if the raised exception is declared in the WSDL or by the JAX-RS resource Method m = msg.getExchange().get(Method.class); if (m != null) { Exception e = msg.getContent(Exception.class); for (Class<?> cl : m.getExceptionTypes()) { if (cl.isInstance(e)) { faultMode = FaultMode.CHECKED_APPLICATION_FAULT; break; } } } msg.getExchange().put(FaultMode.class, faultMode); }
public void doCall(String method, Object value) throws Exception { Call call = new Call(); call.setTargetObjectURI("http://soapinterop.org/"); call.setMethodName(method); call.setEncodingStyleURI(encodingStyleURI); Vector params = new Vector(); params.addElement(new Parameter("in", value.getClass(), value, null)); call.setParams(params); // make the call: note that the action URI is empty because the // XML-SOAP rpc router does not need this. This may change in the // future. Response resp = call.invoke(url, ""); // Check the response. if (resp.generatedFault()) { Fault fault = resp.getFault(); System.out.println("Ouch, the call failed: "); System.out.println(" Fault Code = " + fault.getFaultCode()); System.out.println(" Fault String = " + fault.getFaultString()); } else { Parameter result = resp.getReturnValue(); System.out.println("Call succeeded: "); System.out.println("Result = " + result.getValue()); } }
private void outputFault(String methodName, Response resp) { Fault fault = resp.getFault(); System.err.println("Generated fault (" + methodName + "()):"); System.err.println(" Fault Code = " + fault.getFaultCode()); System.err.println(" Fault String = " + fault.getFaultString()); }
private void setStackTrace(Fault fault, Message msg) { Throwable cause = null; Map<String, String> ns = new HashMap<String, String>(); XPathUtils xu = new XPathUtils(ns); ns.put("s", Fault.STACKTRACE_NAMESPACE); String ss = (String) xu.getValue( "//s:" + Fault.STACKTRACE + "/text()", fault.getDetail(), XPathConstants.STRING); List<StackTraceElement> stackTraceList = new ArrayList<StackTraceElement>(); if (!StringUtils.isEmpty(ss)) { Iterator<String> linesIterator = Arrays.asList(CAUSE_SUFFIX_SPLITTER.split(ss)).iterator(); while (linesIterator.hasNext()) { String oneLine = linesIterator.next(); if (oneLine.startsWith("Caused by:")) { cause = getCause(linesIterator, oneLine); break; } stackTraceList.add(parseStackTrackLine(oneLine)); } if (stackTraceList.size() > 0 || cause != null) { Exception e = msg.getContent(Exception.class); if (!stackTraceList.isEmpty()) { StackTraceElement[] stackTraceElement = new StackTraceElement[stackTraceList.size()]; e.setStackTrace(stackTraceList.toArray(stackTraceElement)); } if (cause != null) { e.initCause(cause); } } } }
@Test public void test_faultcode_messageargs_constructor() { IFaultCode expectedFaultCode = ExampleFaultCode.ACCESS_DENIED; UncheckedException e = new UncheckedException(expectedFaultCode, "sangeeth"); Fault expectedFault = Fault.valueOf(expectedFaultCode, "sangeeth"); AssertEx.assertException( null, expectedFault, expectedFaultCode, Locale.getDefault(), // expectedLocale expectedFault.getSummary(), // expectedMessage Severity.SEVERE, // expectedSeverity e); // actualException }
@Test public void test_cause_faultcode_severity_messageargs_constructor() { IFaultCode expectedFaultCode = ExampleFaultCode.ACCESS_DENIED; IllegalArgumentException expectedCause = new IllegalArgumentException(); ISeverity expectedSeverity = CustomSeverity.DISASTER; UncheckedException e = new UncheckedException(expectedCause, expectedFaultCode, expectedSeverity, "sangeeth"); Fault expectedFault = Fault.valueOf(expectedFaultCode, "sangeeth"); AssertEx.assertException( expectedCause, expectedFault, expectedFaultCode, Locale.getDefault(), // expectedLocale expectedFault.getSummary(), // expectedMessage expectedSeverity, // expectedSeverity e); // actualException }
@Test public void test_faultcode_severity_locale_messageargs_constructor() { IFaultCode expectedFaultCode = ExampleFaultCode.ACCESS_DENIED; ISeverity expectedSeverity = CustomSeverity.DISASTER; UncheckedException e = new UncheckedException(expectedFaultCode, expectedSeverity, Locale.FRENCH, "sangeeth"); Fault expectedFault = Fault.valueOf(expectedFaultCode, Locale.FRENCH, "sangeeth"); AssertEx.assertException( null, expectedFault, expectedFaultCode, Locale.FRENCH, // expectedLocale expectedFault.getSummary(), // expectedMessage expectedSeverity, // expectedSeverity e); // actualException }
@Test public void test_with_undefined_faultCode() { IFaultCode expectedFaultCode = UndefinedFaultCode.SOME_FAULT_WITH_NO_DEFINITION; ISeverity expectedSeverity = Severity.UNKNOWN; UncheckedException e = new UncheckedException(expectedFaultCode); Fault expectedFault = Fault.valueOf(expectedFaultCode); AssertEx.assertException( null, expectedFault, expectedFaultCode, Locale.getDefault(), // expectedLocale FaultCode.FQN(expectedFaultCode), // expectedMessage expectedSeverity, // expectedSeverity e); // actualException }
private Exception convertFaultBean(Class<?> exClass, Object faultBean, Fault fault) throws Exception { Constructor<?> constructor = exClass.getConstructor(new Class[] {String.class}); Exception e = (Exception) constructor.newInstance(new Object[] {fault.getMessage()}); // Copy fault bean fields to exception for (Class<?> obj = exClass; !obj.equals(Object.class); obj = obj.getSuperclass()) { Field[] fields = obj.getDeclaredFields(); for (Field f : fields) { try { Field beanField = faultBean.getClass().getDeclaredField(f.getName()); ReflectionUtil.setAccessible(beanField); ReflectionUtil.setAccessible(f); f.set(e, beanField.get(faultBean)); } catch (NoSuchFieldException e1) { // do nothing } } } // also use/try public getter/setter methods Method meth[] = faultBean.getClass().getMethods(); for (Method m : meth) { if (m.getParameterTypes().length == 0 && (m.getName().startsWith("get") || m.getName().startsWith("is"))) { try { String name; if (m.getName().startsWith("get")) { name = "set" + m.getName().substring(3); } else { name = "set" + m.getName().substring(2); } Method m2 = exClass.getMethod(name, m.getReturnType()); m2.invoke(e, m.invoke(faultBean)); } catch (Exception e1) { // ignore } } } return e; }
/* (non-Javadoc) * @see ExtensionHandlerBase#handleFaultExtension(TWSDLParserContextImpl, TWSDLExtensible, org.w3c.dom.Element) */ @Override public boolean handleFaultExtension( TWSDLParserContext context, TWSDLExtensible parent, Element e) { if (XmlUtil.matchesTagNS(e, JAXWSBindingsConstants.JAXWS_BINDINGS)) { context.push(); context.registerNamespaces(e); JAXWSBinding jaxwsBinding = new JAXWSBinding(context.getLocation(e)); for (Iterator iter = XmlUtil.getAllChildren(e); iter.hasNext(); ) { Element e2 = Util.nextElement(iter); if (e2 == null) { break; } if (XmlUtil.matchesTagNS(e2, JAXWSBindingsConstants.CLASS)) { parseClass(context, jaxwsBinding, e2); if ((jaxwsBinding.getClassName() != null) && (jaxwsBinding.getClassName().getJavaDoc() != null)) { ((Fault) parent) .setDocumentation(new Documentation(jaxwsBinding.getClassName().getJavaDoc())); } } else { Util.fail("parsing.invalidExtensionElement", e2.getTagName(), e2.getNamespaceURI()); return false; } } parent.addExtension(jaxwsBinding); context.pop(); // context.fireDoneParsingEntity( // JAXWSBindingsConstants.JAXWS_BINDINGS, // jaxwsBinding); return true; } else { Util.fail("parsing.invalidExtensionElement", e.getTagName(), e.getNamespaceURI()); return false; } }
protected void processFaultDetail(Fault fault, Message msg) { Element exDetail = (Element) DOMUtils.getChild(fault.getDetail(), Node.ELEMENT_NODE); if (exDetail == null) { return; } QName qname = new QName(exDetail.getNamespaceURI(), exDetail.getLocalName()); FaultInfo faultWanted = null; MessagePartInfo part = null; BindingOperationInfo boi = msg.getExchange().get(BindingOperationInfo.class); if (boi == null) { return; } if (boi.isUnwrapped()) { boi = boi.getWrappedOperation(); } for (FaultInfo faultInfo : boi.getOperationInfo().getFaults()) { for (MessagePartInfo mpi : faultInfo.getMessageParts()) { if (qname.equals(mpi.getConcreteName())) { faultWanted = faultInfo; part = mpi; break; } } if (faultWanted != null) { break; } } if (faultWanted == null) { // did not find it using the proper qualified names, we'll try again with just the localpart for (FaultInfo faultInfo : boi.getOperationInfo().getFaults()) { for (MessagePartInfo mpi : faultInfo.getMessageParts()) { if (qname.getLocalPart().equals(mpi.getConcreteName().getLocalPart())) { faultWanted = faultInfo; part = mpi; break; } } if (faultWanted != null) { break; } } } if (faultWanted == null) { return; } Service s = msg.getExchange().get(Service.class); DataBinding dataBinding = s.getDataBinding(); Object e = null; if (isDOMSupported(dataBinding)) { DataReader<Node> reader = this.getNodeDataReader(msg); reader.setProperty(DataReader.FAULT, fault); e = reader.read(part, exDetail); } else { DataReader<XMLStreamReader> reader = this.getDataReader(msg); XMLStreamReader xsr = new W3CDOMStreamReader(exDetail); try { xsr.nextTag(); } catch (XMLStreamException e1) { throw new Fault(e1); } reader.setProperty(DataReader.FAULT, fault); e = reader.read(part, xsr); } if (!(e instanceof Exception)) { try { Class<?> exClass = faultWanted.getProperty(Class.class.getName(), Class.class); if (exClass == null) { return; } if (e == null) { Constructor<?> constructor = exClass.getConstructor(new Class[] {String.class}); e = constructor.newInstance(new Object[] {fault.getMessage()}); } else { try { Constructor<?> constructor = getConstructor(exClass, e); e = constructor.newInstance(new Object[] {fault.getMessage(), e}); } catch (NoSuchMethodException e1) { // Use reflection to convert fault bean to exception e = convertFaultBean(exClass, e, fault); } } msg.setContent(Exception.class, e); } catch (Exception e1) { LogUtils.log(LOG, Level.INFO, "EXCEPTION_WHILE_CREATING_EXCEPTION", e1, e1.getMessage()); } } else { if (fault.getMessage() != null) { Field f; try { f = Throwable.class.getDeclaredField("detailMessage"); ReflectionUtil.setAccessible(f); f.set(e, fault.getMessage()); } catch (Exception e1) { // ignore } } msg.setContent(Exception.class, e); } }