/*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at http://www.netbeans.org/cddl.html
* or http://www.netbeans.org/cddl.txt.
*
* When distributing Covered Code, include this CDDL Header Notice in each file
* and include the License file at http://www.netbeans.org/cddl.txt.
* If applicable, add the following below the CDDL Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* The Original Software is NetBeans. The Initial Developer of the Original
* Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.gwt4nb.services;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.StringTokenizer;
import java.util.logging.Level;
import javax.swing.event.ChangeListener;
import org.netbeans.api.project.Project;
import org.netbeans.modules.gwt4nb.GWTProjectInfo;
import org.netbeans.modules.gwt4nb.GWT4NBUtil;
import org.netbeans.modules.j2ee.dd.api.web.WebApp;
import org.netbeans.modules.j2ee.dd.api.web.Servlet;
import org.netbeans.modules.j2ee.dd.api.web.DDProvider;
import org.netbeans.modules.j2ee.dd.api.web.ServletMapping;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.openide.WizardDescriptor;
import org.openide.WizardDescriptor.Panel;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataFolder;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectNotFoundException;
/**
* @author Tomasz.Slota@Sun.COM
* @author lemnik@dev.java.net
* @author see https://github.com/gwt4nb/gwt4nb/
*/
public class NewServiceWizardIterator implements
WizardDescriptor.InstantiatingIterator<WizardDescriptor> {
/**
* Creates a Java package if necessary.
*
* @param project a project
* @param packageName package name
* @return directory for the package
*/
public static FileObject ensurePackageExists(
final Project project,
final String packageName) throws IOException {
final FileObject dirSrc = GWTProjectInfo.getSourcesDir(project);
final String packagePath = packageName.replace('.', '/');
FileObject packageDir = dirSrc.getFileObject(packagePath);
if (packageDir == null) {
final StringTokenizer tokenizer = new StringTokenizer(
packagePath, "/"); // NOI18N
FileObject dir = dirSrc;
while (tokenizer.hasMoreTokens()) {
final String name = tokenizer.nextToken();
final FileObject subdir = dir.getFileObject(name);
if (subdir == null) {
dir = dir.createFolder(name);
} else {
dir = subdir;
}
}
packageDir = dir;
}
return packageDir;
}
private NewServicePanel panel;
private WizardDescriptor wizard;
static final String SERVICE_NAME_PROPERTY = "GWTServiceName"; // NOI18N
static final String SERVICE_SERVLET_MAPPING = "GWTServiceServletMapping"; // NOI18N
static final String CREATE_USAGE_EXAMPLE = "GWTCreateUsageExample"; // NOI18N
static final String SERVICE_SUBPACKAGE = "GWTServiceSubpackage"; // NOI18N
static final String MODULE_NAME_PROPERTY = "GWTModuleName"; // NOI18N
/** Creates a new instance of NewServiceWizardIterator */
public NewServiceWizardIterator() {
}
/**
* @return selected module name like "org.yournamehere.Main"
*/
private String getModuleName() {
return (String) wizard.getProperty(MODULE_NAME_PROPERTY);
}
private String getPackageName(final String basePackage) {
final String subpackage = (String) wizard.getProperty(SERVICE_SUBPACKAGE);
if (subpackage != null && subpackage.length() > 0) {
return basePackage + "." + subpackage; // NOI18N
} else {
return basePackage;
}
}
private String getServiceName() {
return (String)wizard.getProperty(SERVICE_NAME_PROPERTY);
}
private String getServletPackage() {
return getPackageName(GWTProjectInfo.getServerPackage(
getModuleName()));
}
private String getClientSyncInterface() {
return getServiceName();
}
private String getClientAsyncInterface() {
return getServiceName() + "Async"; // NOI18N
}
private String getServletClassName() {
return getServiceName() + "Impl"; // NOI18N
}
private FileObject processTemplate(
final String templateName,
final DataFolder outputDir,
final String className,
final Map<String, ? extends Object> templateParameters)
throws DataObjectNotFoundException, IOException {
final DataObject template = DataObject.find(
FileUtil.getConfigFile(templateName));
return template.createFromTemplate(
outputDir,
className,
templateParameters).getPrimaryFile();
}
private void createWebAppBinding(
final Project project,
final String servletMapping) throws IOException {
String gwtOutputDir = "/" + getModuleName() + "/"; // NOI18N
// Add servlet entry to web.xml
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
WebApp webApp = DDProvider.getDefault().
getDDRoot(webModule.getDeploymentDescriptor());
if(webApp != null) {
try {
Servlet servlet = (Servlet) webApp.createBean("Servlet"); // NOI18N
servlet.setServletName(getServiceName());
servlet.setServletClass(getServletPackage() + "." + // NOI18N
getServletClassName()); // NOI18N
webApp.addServlet(servlet);
ServletMapping mapping = (ServletMapping)
webApp.createBean("ServletMapping"); // NOI18N
mapping.setServletName(getServiceName());
mapping.setUrlPattern(gwtOutputDir + servletMapping);
webApp.addServletMapping(mapping);
webApp.write(webModule.getDeploymentDescriptor());
} catch(ClassNotFoundException e) {
GWT4NBUtil.LOGGER.log(Level.SEVERE, "", e); // NOI18N
}
}
}
public Set<FileObject> instantiate() throws IOException {
final Project project = Templates.getProject(wizard);
String clientPackage = getPackageName(
GWTProjectInfo.getClientPackage(getModuleName()));
final String servletPackage = getServletPackage();
final String serviceName = getServiceName();
final String servletMapping = (String)wizard.getProperty(
SERVICE_SERVLET_MAPPING);
final Map<String, Object> templateParameters = new HashMap<String, Object>(3);
templateParameters.put("url", servletMapping); // NOI18N
templateParameters.put("gwtversion", // NOI18N
GWTProjectInfo.get(project).
getGWTVersion());
templateParameters.put("servicename", getServiceName()); // NOI18N
templateParameters.put("clientpackage", clientPackage); // NOI18N
templateParameters.put("servletpackage", servletPackage); // NOI18N
final DataFolder clientPackageDir = DataFolder.findFolder(
ensurePackageExists(project,
clientPackage));
final DataFolder servletPackageDir = DataFolder.findFolder(
ensurePackageExists(project, servletPackage));
final Set<FileObject> toOpen = new LinkedHashSet<FileObject>(3);
toOpen.add(processTemplate(
"Templates/Classes/GWTService.java", // NOI18N
clientPackageDir,
getClientSyncInterface(),
templateParameters));
toOpen.add(processTemplate(
"Templates/Classes/GWTServiceAsync.java", // NOI18N
clientPackageDir,
getClientAsyncInterface(),
templateParameters));
toOpen.add(processTemplate(
"Templates/Classes/GWTServiceImpl.java", // NOI18N
servletPackageDir,
getServletClassName(),
templateParameters));
createWebAppBinding(project, servletMapping);
// create usage example
if ((Boolean)wizard.getProperty(CREATE_USAGE_EXAMPLE)){
toOpen.add(processTemplate(
"Templates/Classes/GWTServiceUsageExample.java", // NOI18N
clientPackageDir,
serviceName + "UsageExample", // NOI18N
templateParameters));
}
return toOpen;
}
public void initialize(WizardDescriptor wizard) {
this.wizard = wizard;
panel = new NewServicePanel(Templates.getProject(wizard));
}
public void uninitialize(WizardDescriptor wizard) {
panel = null;
}
public Panel<WizardDescriptor> current() {
return panel;
}
public String name() {
return "1"; // NOI18N
}
public boolean hasNext() {
return false;
}
public boolean hasPrevious() {
return false;
}
public void nextPanel() {
// should never be called
}
public void previousPanel() {
// should never be called
}
public void addChangeListener(ChangeListener l) {
}
public void removeChangeListener(ChangeListener l) {
}
public static NewServiceWizardIterator createIterator(){
return new NewServiceWizardIterator();
}
}