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