aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.tools.internal.ws.processor.generator; aoqi@0: aoqi@0: import com.sun.codemodel.internal.ClassType; aoqi@0: import com.sun.codemodel.internal.JAnnotationUse; aoqi@0: import com.sun.codemodel.internal.JBlock; aoqi@0: import com.sun.codemodel.internal.JClass; aoqi@0: import com.sun.codemodel.internal.JClassAlreadyExistsException; aoqi@0: import com.sun.codemodel.internal.JDefinedClass; aoqi@0: import com.sun.codemodel.internal.JDocComment; aoqi@0: import com.sun.codemodel.internal.JExpr; aoqi@0: import com.sun.codemodel.internal.JFieldRef; aoqi@0: import com.sun.codemodel.internal.JFieldVar; aoqi@0: import com.sun.codemodel.internal.JMethod; aoqi@0: import com.sun.codemodel.internal.JMod; aoqi@0: import com.sun.codemodel.internal.JType; aoqi@0: import com.sun.codemodel.internal.JVar; aoqi@0: import com.sun.tools.internal.ws.processor.model.Fault; aoqi@0: import com.sun.tools.internal.ws.processor.model.Model; aoqi@0: import com.sun.tools.internal.ws.wscompile.ErrorReceiver; aoqi@0: import com.sun.tools.internal.ws.wscompile.WsimportOptions; aoqi@0: aoqi@0: import javax.xml.ws.WebFault; aoqi@0: import java.util.HashMap; aoqi@0: import java.util.Map; aoqi@0: aoqi@0: /** aoqi@0: * aoqi@0: * @author WS Development Team aoqi@0: */ aoqi@0: public class CustomExceptionGenerator extends GeneratorBase { aoqi@0: private Map faults = new HashMap(); aoqi@0: aoqi@0: public static void generate(Model model, aoqi@0: WsimportOptions options, aoqi@0: ErrorReceiver receiver){ aoqi@0: CustomExceptionGenerator exceptionGen = new CustomExceptionGenerator(); aoqi@0: exceptionGen.init(model, options, receiver); aoqi@0: exceptionGen.doGeneration(); aoqi@0: } aoqi@0: aoqi@0: public GeneratorBase getGenerator(Model model, WsimportOptions options, ErrorReceiver receiver) { aoqi@0: GeneratorBase g = new CustomExceptionGenerator(); aoqi@0: g.init(model, options, receiver); aoqi@0: return g; aoqi@0: } aoqi@0: aoqi@0: @Override aoqi@0: public void visit(Fault fault) throws Exception { aoqi@0: if (isRegistered(fault)) aoqi@0: return; aoqi@0: registerFault(fault); aoqi@0: } aoqi@0: aoqi@0: private boolean isRegistered(Fault fault) { aoqi@0: if(faults.keySet().contains(fault.getJavaException().getName())){ aoqi@0: fault.setExceptionClass(faults.get(fault.getJavaException().getName())); aoqi@0: return true; aoqi@0: } aoqi@0: return false; aoqi@0: } aoqi@0: aoqi@0: private void registerFault(Fault fault) { aoqi@0: try { aoqi@0: write(fault); aoqi@0: faults.put(fault.getJavaException().getName(), fault.getExceptionClass()); aoqi@0: } catch (JClassAlreadyExistsException e) { aoqi@0: throw new GeneratorException("generator.nestedGeneratorError",e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private void write(Fault fault) throws JClassAlreadyExistsException { aoqi@0: String className = Names.customExceptionClassName(fault); aoqi@0: aoqi@0: JDefinedClass cls = cm._class(className, ClassType.CLASS); aoqi@0: JDocComment comment = cls.javadoc(); aoqi@0: if(fault.getJavaDoc() != null){ aoqi@0: comment.add(fault.getJavaDoc()); aoqi@0: comment.add("\n\n"); aoqi@0: } aoqi@0: aoqi@0: for (String doc : getJAXWSClassComment()) { aoqi@0: comment.add(doc); aoqi@0: } aoqi@0: aoqi@0: cls._extends(java.lang.Exception.class); aoqi@0: aoqi@0: //@WebFault aoqi@0: JAnnotationUse faultAnn = cls.annotate(WebFault.class); aoqi@0: faultAnn.param("name", fault.getBlock().getName().getLocalPart()); aoqi@0: faultAnn.param("targetNamespace", fault.getBlock().getName().getNamespaceURI()); aoqi@0: aoqi@0: JType faultBean = fault.getBlock().getType().getJavaType().getType().getType(); aoqi@0: aoqi@0: //faultInfo filed aoqi@0: JFieldVar fi = cls.field(JMod.PRIVATE, faultBean, "faultInfo"); aoqi@0: aoqi@0: //add jaxb annotations aoqi@0: fault.getBlock().getType().getJavaType().getType().annotate(fi); aoqi@0: aoqi@0: fi.javadoc().add("Java type that goes as soapenv:Fault detail element."); aoqi@0: JFieldRef fr = JExpr.ref(JExpr._this(), fi); aoqi@0: aoqi@0: //Constructor aoqi@0: JMethod constrc1 = cls.constructor(JMod.PUBLIC); aoqi@0: JVar var1 = constrc1.param(String.class, "message"); aoqi@0: JVar var2 = constrc1.param(faultBean, "faultInfo"); aoqi@0: constrc1.javadoc().addParam(var1); aoqi@0: constrc1.javadoc().addParam(var2); aoqi@0: JBlock cb1 = constrc1.body(); aoqi@0: cb1.invoke("super").arg(var1); aoqi@0: aoqi@0: cb1.assign(fr, var2); aoqi@0: aoqi@0: //constructor with Throwable aoqi@0: JMethod constrc2 = cls.constructor(JMod.PUBLIC); aoqi@0: var1 = constrc2.param(String.class, "message"); aoqi@0: var2 = constrc2.param(faultBean, "faultInfo"); aoqi@0: JVar var3 = constrc2.param(Throwable.class, "cause"); aoqi@0: constrc2.javadoc().addParam(var1); aoqi@0: constrc2.javadoc().addParam(var2); aoqi@0: constrc2.javadoc().addParam(var3); aoqi@0: JBlock cb2 = constrc2.body(); aoqi@0: cb2.invoke("super").arg(var1).arg(var3); aoqi@0: cb2.assign(fr, var2); aoqi@0: aoqi@0: aoqi@0: //getFaultInfo() method aoqi@0: JMethod fim = cls.method(JMod.PUBLIC, faultBean, "getFaultInfo"); aoqi@0: fim.javadoc().addReturn().add("returns fault bean: "+faultBean.fullName()); aoqi@0: JBlock fib = fim.body(); aoqi@0: fib._return(fi); aoqi@0: fault.setExceptionClass(cls); aoqi@0: aoqi@0: } aoqi@0: }