blob: d237c5b0b3dfe5e1a3e64ecc6e8ba2be40d2df54 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.websvc.rest.wizard;
import java.io.IOException;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Set;
import org.netbeans.api.java.source.JavaSource;
import org.netbeans.api.java.source.Task;
import org.netbeans.api.java.source.TreeMaker;
import org.netbeans.api.java.source.WorkingCopy;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.modules.j2ee.core.api.support.java.GenerationUtils;
import org.netbeans.modules.websvc.rest.support.JavaSourceHelper;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.openide.WizardDescriptor;
import org.openide.WizardDescriptor.Panel;
import org.openide.filesystems.FileObject;
import org.openide.util.NbBundle;
import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.MethodTree;
/**
* @author ads
*
*/
public class JaxRsFilterIterator extends AbstractJaxRsFeatureIterator
{
/* (non-Javadoc)
* @see org.netbeans.modules.websvc.rest.wizard.AbstractJaxRsFeatureIterator#createPanel(org.openide.WizardDescriptor)
*/
@Override
protected Panel<?> createPanel( WizardDescriptor wizard ) {
return new JaxRsFilterPanel(wizard);
}
/* (non-Javadoc)
* @see org.netbeans.modules.websvc.rest.wizard.AbstractJaxRsFeatureIterator#getTitleKey()
*/
@Override
protected String getTitleKey() {
return "TXT_CreateJaxRsFilter"; // NOI18N
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.ProgressInstantiatingIterator#instantiate(org.netbeans.api.progress.ProgressHandle)
*/
@Override
public Set<?> instantiate( ProgressHandle handle ) throws IOException {
handle.start();
handle.progress(NbBundle.getMessage(JaxRsFilterIterator.class,
"TXT_GenerateFilterFile"));
FileObject targetFolder = Templates.getTargetFolder(getWizard());
String name = Templates.getTargetName(getWizard());
FileObject filterClass = GenerationUtils.createClass(targetFolder,name, null );
implementFilters(filterClass);
handle.finish();
return Collections.singleton(filterClass);
}
private void implementFilters( FileObject filterClass ) throws IOException{
JavaSource javaSource = JavaSource.forFileObject(filterClass);
if ( javaSource == null ){
return;
}
final boolean client = Boolean.TRUE.equals(
getWizard().getProperty(JaxRsFilterPanel.CLIENT_FILTER));
final boolean server = Boolean.TRUE.equals(
getWizard().getProperty(JaxRsFilterPanel.SERVER_FILTER));
final boolean request = Boolean.TRUE.equals(
getWizard().getProperty(JaxRsFilterPanel.REQUEST));
final boolean response = Boolean.TRUE.equals(
getWizard().getProperty(JaxRsFilterPanel.RESPONSE));
final boolean addPreMatch = Boolean.TRUE.equals(
getWizard().getProperty(JaxRsFilterPanel.PRE_MATCHING));
final boolean addProvider = Boolean.TRUE.equals(
getWizard().getProperty(JaxRsFilterPanel.PROVIDER));
javaSource.runModificationTask( new Task<WorkingCopy>() {
@Override
public void run( WorkingCopy copy ) throws Exception {
copy.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
ClassTree tree = JavaSourceHelper.getTopLevelClassTree(copy);
ClassTree newTree = tree;
TreeMaker treeMaker = copy.getTreeMaker();
GenerationUtils genUtils = GenerationUtils.newInstance(copy);
if ( addPreMatch ){
AnnotationTree preMatching = genUtils.
createAnnotation("javax.ws.rs.container.PreMatching");
newTree = genUtils.addAnnotation(newTree, preMatching);
}
if ( addProvider ){
AnnotationTree provider = genUtils.
createAnnotation("javax.ws.rs.ext.Provider");
newTree = genUtils.addAnnotation(newTree, provider);
}
LinkedHashMap<String,String> params = new LinkedHashMap<String, String>();
if ( client ){
if ( request ){
params.put("requestContext",
"javax.ws.rs.client.ClientRequestContext"); // NOI18N
newTree = genUtils.addImplementsClause(newTree,
"javax.ws.rs.client.ClientRequestFilter"); // NOI18N
MethodTree method = createMethod(genUtils, treeMaker, params);
newTree = treeMaker.addClassMember( newTree, method);
}
if ( response ){
params.put("requestContext",
"javax.ws.rs.client.ClientRequestContext"); // NOI18N
params.put("responseContext",
"javax.ws.rs.client.ClientResponseContext"); // NOI18N
newTree = genUtils.addImplementsClause(newTree,
"javax.ws.rs.client.ClientResponseFilter"); // NOI18N
MethodTree method = createMethod(genUtils, treeMaker, params);
newTree = treeMaker.addClassMember( newTree, method);
}
}
if ( server ){
params.clear();
if ( request ){
params.put("requestContext",
"javax.ws.rs.container.ContainerRequestContext");// NOI18N
newTree = genUtils.addImplementsClause(newTree,
"javax.ws.rs.container.ContainerRequestFilter");// NOI18N
MethodTree method = createMethod(genUtils, treeMaker, params);
newTree = treeMaker.addClassMember( newTree, method);
}
if ( response ){
params.put("requestContext",
"javax.ws.rs.container.ContainerRequestContext");// NOI18N
params.put("responseContext",
"javax.ws.rs.container.ContainerResponseContext");// NOI18N
newTree = genUtils.addImplementsClause(newTree,
"javax.ws.rs.container.ContainerResponseFilter");// NOI18N
MethodTree method = createMethod(genUtils, treeMaker, params);
newTree = treeMaker.addClassMember( newTree, method);
}
}
copy.rewrite(tree, newTree);
}
}).commit();
}
private MethodTree createMethod(GenerationUtils genUtils,TreeMaker maker,
LinkedHashMap<String,String> methodParams)
{
return createMethod(genUtils, maker, "filter", methodParams); // NOI18N
}
}