1 19 package org.netbeans.modules.websvc.core.jaxws.actions; 20 21 import com.sun.source.tree.AnnotationTree; 22 import com.sun.source.tree.ClassTree; 23 import com.sun.source.tree.ExpressionTree; 24 import com.sun.source.tree.MethodTree; 25 import com.sun.source.tree.ModifiersTree; 26 import com.sun.source.tree.PrimitiveTypeTree; 27 import com.sun.source.tree.Tree.Kind; 28 import com.sun.source.tree.VariableTree; 29 import java.io.IOException ; 30 import java.util.ArrayList ; 31 import java.util.Collections ; 32 import java.util.List ; 33 import javax.lang.model.element.TypeElement; 34 import javax.lang.model.type.TypeKind; 35 import org.netbeans.api.java.source.CancellableTask; 36 import org.netbeans.api.java.source.Comment; 37 import org.netbeans.api.java.source.JavaSource; 38 import org.netbeans.api.java.source.TreeMaker; 39 import org.netbeans.modules.j2ee.common.source.GenerationUtils; 40 import static org.netbeans.api.java.source.JavaSource.Phase; 41 import org.netbeans.api.java.source.WorkingCopy; 42 import org.netbeans.modules.websvc.api.jaxws.project.config.Service; 43 import org.openide.ErrorManager; 44 import org.openide.filesystems.FileObject; 45 import org.openide.util.NbBundle; 46 47 public class JaxWsClassesCookieImpl implements JaxWsClassesCookie { 48 Service service; 49 FileObject implClassFO; 50 51 public JaxWsClassesCookieImpl(Service service, FileObject implClassFO) { 52 this.service = service; 53 this.implClassFO = implClassFO; 54 } 55 56 public void addOperation(final MethodTree method) { 57 JavaSource targetSource = JavaSource.forFileObject(implClassFO); 58 CancellableTask<WorkingCopy> modificationTask = new CancellableTask<WorkingCopy>() { 59 public void run(WorkingCopy workingCopy) throws IOException { 60 workingCopy.toPhase(Phase.RESOLVED); 61 TreeMaker make = workingCopy.getTreeMaker(); 62 GenerationUtils genUtils = GenerationUtils.newInstance(workingCopy); 63 if (genUtils!=null) { 64 ClassTree javaClass = genUtils.getClassTree(); 65 TypeElement webMethodAn = workingCopy.getElements().getTypeElement("javax.jws.WebMethod"); TypeElement webParamAn = workingCopy.getElements().getTypeElement("javax.jws.WebParam"); 68 AnnotationTree webMethodAnnotation = make.Annotation( 69 make.QualIdent(webMethodAn), 70 Collections.<ExpressionTree>emptyList() 71 ); 72 ModifiersTree modifiersTree = make.addModifiersAnnotation(method.getModifiers(), webMethodAnnotation); 74 75 if (Kind.PRIMITIVE_TYPE == method.getReturnType().getKind()) { 77 PrimitiveTypeTree primitiveType = (PrimitiveTypeTree)method.getReturnType(); 78 if (TypeKind.VOID == primitiveType.getPrimitiveTypeKind()) { 79 TypeElement oneWayAn = workingCopy.getElements().getTypeElement("javax.jws.Oneway"); AnnotationTree oneWayAnnotation = make.Annotation( 81 make.QualIdent(oneWayAn), 82 Collections.<ExpressionTree>emptyList() 83 ); 84 modifiersTree = make.addModifiersAnnotation(modifiersTree, oneWayAnnotation); 85 } 86 } 87 88 List <? extends VariableTree> parameters = method.getParameters(); 90 List <VariableTree> newParameters = new ArrayList <VariableTree>(); 91 for (VariableTree param:parameters) { 92 AnnotationTree paramAnnotation = make.Annotation( 93 make.QualIdent(webParamAn), 94 Collections.<ExpressionTree>singletonList( 95 make.Assignment(make.Identifier("name"), make.Literal(param.getName().toString()))) ); 97 newParameters.add(genUtils.addAnnotation(param, paramAnnotation)); 98 } 99 MethodTree annotatedMethod = make.Method( 101 modifiersTree, 102 method.getName(), 103 method.getReturnType(), 104 method.getTypeParameters(), 105 newParameters, 106 method.getThrows(), 107 method.getBody(), 108 (ExpressionTree)method.getDefaultValue()); 109 Comment comment = Comment.create(NbBundle.getMessage(JaxWsClassesCookieImpl.class, "TXT_WSOperation")); 110 make.addComment(annotatedMethod, comment, true); 111 112 ClassTree modifiedClass = make.addClassMember(javaClass,annotatedMethod); 113 workingCopy.rewrite(javaClass, modifiedClass); 114 } 115 } 116 public void cancel() {} 117 }; 118 try { 119 targetSource.runModificationTask(modificationTask).commit(); 120 } catch (IOException ex) { 121 ErrorManager.getDefault().notify(ex); 122 } 123 } 124 208 } 209 210 | Popular Tags |