blob: 042ac76f89c4018581daeaff15e53e8f300f5a91 [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.web.struts.wizards;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import javax.swing.JComponent;
import javax.swing.event.ChangeListener;
import org.netbeans.api.project.Sources;
import org.netbeans.modules.web.struts.config.model.FormBeans;
import org.openide.WizardDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataFolder;
import org.openide.loaders.TemplateWizard;
import org.openide.util.NbBundle;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.editor.BaseDocument;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.netbeans.spi.java.project.support.ui.templates.JavaTemplates;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.netbeans.modules.web.struts.StrutsConfigDataObject;
import org.netbeans.modules.web.struts.config.model.FormBean;
import org.netbeans.modules.web.struts.config.model.StrutsConfig;
import org.netbeans.modules.web.struts.editor.StrutsEditorUtilities;
import org.openide.cookies.OpenCookie;
/** A template wizard iterator for new struts action
*
* @author Petr Pisl
*
*/
public class FormBeanIterator implements TemplateWizard.Iterator {
private int index;
private transient WizardDescriptor.Panel[] panels;
private transient boolean debug = false;
public void initialize (TemplateWizard wizard) {
if (debug) log ("initialize"); //NOI18N
index = 0;
// obtaining target folder
Project project = Templates.getProject( wizard );
DataFolder targetFolder=null;
try {
targetFolder = wizard.getTargetFolder();
} catch (IOException ex) {
targetFolder = DataFolder.findFolder(project.getProjectDirectory());
}
SourceGroup[] sourceGroups = ProjectUtils.getSources(project).getSourceGroups(
JavaProjectConstants.SOURCES_TYPE_JAVA);
if (debug) {
log ("\tproject: " + project); //NOI18N
log ("\ttargetFolder: " + targetFolder); //NOI18N
log ("\tsourceGroups.length: " + sourceGroups.length); //NOI18N
}
WizardDescriptor.Panel secondPanel = new FormBeanNewPanel(project, wizard);
WizardDescriptor.Panel javaPanel;
if (sourceGroups.length == 0)
javaPanel = Templates.createSimpleTargetChooser(project, sourceGroups, secondPanel);
else
javaPanel = JavaTemplates.createPackageChooser(project, sourceGroups, secondPanel);
panels = new WizardDescriptor.Panel[] {
javaPanel
};
// Creating steps.
Object prop = wizard.getProperty (WizardDescriptor.PROP_CONTENT_DATA); // NOI18N
String[] beforeSteps = null;
if (prop instanceof String[]) {
beforeSteps = (String[])prop;
}
String[] steps = createSteps (beforeSteps, panels);
for (int i = 0; i < panels.length; i++) {
JComponent jc = (JComponent)panels[i].getComponent ();
if (steps[i] == null) {
steps[i] = jc.getName ();
}
jc.putClientProperty (WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i); // NOI18N
jc.putClientProperty (WizardDescriptor.PROP_CONTENT_DATA, steps); // NOI18N
}
}
public void uninitialize (TemplateWizard wizard) {
panels = null;
}
public Set instantiate(TemplateWizard wizard) throws IOException {
//how to get dynamic form bean properties
//String formBeanClassName = (String) wizard.getProperty(WizardProperties.FORMBEAN_CLASS); //NOI18N
if (debug)
log("instantiate"); //NOI18N
FileObject dir = Templates.getTargetFolder( wizard );
DataFolder df = DataFolder.findFolder( dir );
FileObject template = Templates.getTemplate( wizard );
DataObject dTemplate = DataObject.find( template );
Map<String, Object> attributes = new HashMap<String,Object>();
attributes.put("superclass", wizard.getProperty("formBeanSuperclass"));
DataObject dobj = dTemplate.createFromTemplate(df, Templates.getTargetName(wizard), attributes);
Project project = Templates.getProject( wizard );
WebModule wm = WebModule.getWebModule(project.getProjectDirectory());
String configFile = (String) wizard.getProperty(WizardProperties.FORMBEAN_CONFIG_FILE);
if (wm != null && configFile != null && !"".equals(configFile)){ //NOI18N
// write to a struts configuration file, only when it's inside wm.
dir = wm.getDocumentBase();
String targetName = Templates.getTargetName(wizard);
Sources sources = ProjectUtils.getSources(project);
SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
String packageName = null;
org.openide.filesystems.FileObject targetFolder = Templates.getTargetFolder(wizard);
for (int i = 0; i < groups.length && packageName == null; i++) {
packageName = org.openide.filesystems.FileUtil.getRelativePath (groups [i].getRootFolder (), targetFolder);
if (packageName!=null) break;
}
if (packageName!=null) packageName = packageName.replace('/','.');
else packageName=""; //NOI18N
String className=null;
if (packageName.length()>0)
className=packageName+"."+targetName;//NOI18N
else
className=targetName;
FileObject fo = dir.getFileObject(configFile); //NOI18N
if (fo != null){
StrutsConfigDataObject configDO = (StrutsConfigDataObject)DataObject.find(fo);
StrutsConfig config= configDO.getStrutsConfig();
FormBean formBean = new FormBean();
formBean.setAttributeValue("name", targetName); //NOI18N
formBean.setAttributeValue("type", className); //NOI18N
if (config != null && config.getFormBeans()==null){
config.setFormBeans(new FormBeans());
}
config.getFormBeans().addFormBean(formBean);
BaseDocument doc = (BaseDocument)configDO.getEditorSupport().getDocument();
if (doc == null){
((OpenCookie)configDO.getCookie(OpenCookie.class)).open();
doc = (BaseDocument)configDO.getEditorSupport().getDocument();
}
StrutsEditorUtilities.writeBean(doc, formBean, "form-bean", "form-beans"); //NOI18N
configDO.getEditorSupport().saveDocument();
}
}
return Collections.singleton(dobj);
}
public void previousPanel () {
if (! hasPrevious ()) throw new NoSuchElementException ();
index--;
}
public void nextPanel () {
if (! hasNext ()) throw new NoSuchElementException ();
index++;
}
public boolean hasPrevious () {
return index > 0;
}
public boolean hasNext () {
return index < panels.length - 1;
}
public String name () {
return NbBundle.getMessage (ActionIterator.class, "TITLE_x_of_y", //NOI18N
index + 1, panels.length);
}
public WizardDescriptor.Panel current () {
return panels[index];
}
// If nothing unusual changes in the middle of the wizard, simply:
public final void addChangeListener (ChangeListener l) {}
public final void removeChangeListener (ChangeListener l) {}
private void log (String message){
System.out.println("ActionIterator:: \t" + message); //NOI18N
}
private String[] createSteps(String[] before, WizardDescriptor.Panel[] panels) {
int diff = 0;
if (before == null) {
before = new String[0];
} else if (before.length > 0) {
diff = ("...".equals (before[before.length - 1])) ? 1 : 0; // NOI18N
}
String[] res = new String[ (before.length - diff) + panels.length];
for (int i = 0; i < res.length; i++) {
if (i < (before.length - diff)) {
res[i] = before[i];
} else {
res[i] = panels[i - before.length + diff].getComponent ().getName ();
}
}
return res;
}
private void replaceInDocument(javax.swing.text.Document document, String replaceFrom, String replaceTo) {
javax.swing.text.AbstractDocument doc = (javax.swing.text.AbstractDocument)document;
int len = replaceFrom.length();
try {
String content = doc.getText(0,doc.getLength());
int index = content.lastIndexOf(replaceFrom);
while (index>=0) {
doc.replace(index,len,replaceTo,null);
content=content.substring(0,index);
index = content.lastIndexOf(replaceFrom);
}
} catch (javax.swing.text.BadLocationException ex){}
}
}