blob: 7318b909a89a5c751bfae55b041ac81e503bbc8b [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.jsf.wizards;
import java.awt.Component;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.NoSuchElementException;
import java.util.Set;
import javax.swing.JComponent;
import javax.swing.event.ChangeListener;
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.api.project.Sources;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
import org.netbeans.modules.web.jsf.JSFFrameworkProvider;
import org.netbeans.modules.web.jsf.JSFUtils;
import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
import org.netbeans.modules.web.jsf.palette.JSFPaletteUtilities;
import org.netbeans.modules.web.jsf.wizards.TemplateClientPanel.TemplateEntry;
import org.netbeans.modules.web.jsfapi.api.NamespaceUtils;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.openide.WizardDescriptor;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileSystem;
import org.openide.loaders.DataFolder;
import org.openide.loaders.DataObject;
import org.openide.loaders.TemplateWizard;
import org.openide.util.MapFormat;
import org.openide.util.NbBundle;
/**
*
* @author Petr Pisl
*/
public class TemplateClientIterator implements TemplateWizard.Iterator {
private static final long serialVersionUID = 1L;
private int index;
private transient WizardDescriptor.Panel[] panels;
private TemplateClientPanel templateClientPanel;
private static final String ENCODING = "UTF-8"; //NOI18N
private static String END_LINE = System.getProperty("line.separator"); //NOI18N
/** Creates a new instance of TemplateClientIterator */
public TemplateClientIterator() {
}
@Override
public Set instantiate(final TemplateWizard wiz) throws IOException {
final org.openide.filesystems.FileObject dir = Templates.getTargetFolder( wiz );
final String targetName = Templates.getTargetName(wiz);
final DataFolder df = DataFolder.findFolder( dir );
df.getPrimaryFile().getFileSystem().runAtomicAction(new FileSystem.AtomicAction(){
@Override
public void run() throws IOException {
InputStream is = templateClientPanel.getTemplateClient();
String content = JSFFrameworkProvider.readResource(is, ENCODING);
FileObject target = df.getPrimaryFile().createData(targetName, "xhtml");
TemplateEntry templateEntry = templateClientPanel.getTemplate();
String relativePath = getTemplatePath(target, templateEntry);
String definedTags = createDefineTags(templateClientPanel.getTemplateDataToGenerate(),
((content.indexOf("<html") == -1)?1:3)); //NOI18N
Project project = Templates.getProject(wiz);
final JSFVersion jsfVersion = JSFVersion.forProject(project);
String namespaceLocation = (jsfVersion != null && jsfVersion.isAtLeast(JSFVersion.JSF_2_2))
? NamespaceUtils.JCP_ORG_LOCATION : NamespaceUtils.SUN_COM_LOCATION;
HashMap args = new HashMap();
args.put("TEMPLATE", relativePath); //NOI18N
args.put("DEFINE_TAGS", definedTags); //NOI18N
args.put("NS_LOCATION", namespaceLocation); //NOI18N
MapFormat formater = new MapFormat(args);
formater.setLeftBrace("__"); //NOI18N
formater.setRightBrace("__"); //NOI18N
formater.setExactMatch(false);
content = formater.format(content);
JSFFrameworkProvider.createFile(target, content, ENCODING);
}
});
FileObject target = df.getPrimaryFile().getFileObject(targetName, "xhtml");
DataObject dob = DataObject.find(target);
if (dob != null) {
JSFPaletteUtilities.reformat(dob);
}
return Collections.singleton(dob);
}
private static String getTemplatePath(FileObject target, TemplateEntry templateEntry) {
if (!templateEntry.isResourceLibraryContract()) {
return JSFUtils.getRelativePath(target, templateEntry.getTemplate());
} else {
String fullpath = templateEntry.getTemplate().getPath();
return TemplateClientPanelVisual.getRelativePathInsideResourceLibrary(fullpath);
}
}
@Override
public void initialize(TemplateWizard wiz) {
index = 0;
Project project = Templates.getProject( wiz );
panels = createPanels(project, wiz);
// Creating steps.
Object prop = wiz.getProperty(WizardDescriptor.PROP_CONTENT_DATA); // NOI18N
String[] beforeSteps = null;
if (prop != null && prop instanceof String[]) {
beforeSteps = (String[])prop;
}
String[] steps = createSteps(beforeSteps, panels);
for (int i = 0; i < panels.length; i++) {
Component c = panels[i].getComponent();
if (steps[i] == null) {
// Default step name to component name of panel.
// Mainly useful for getting the name of the target
// chooser to appear in the list of steps.
steps[i] = c.getName();
}
if (c instanceof JComponent) { // assume Swing components
JComponent jc = (JComponent) c;
// Step #.
jc.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i);
// Step name (actually the whole list for reference).
jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps);
}
}
}
@Override
public void uninitialize(TemplateWizard wiz) {
panels = null;
}
@Override
public WizardDescriptor.Panel current() {
return panels[index];
}
@Override
public String name() {
return NbBundle.getMessage(TemplateIterator.class, "TITLE_x_of_y", index + 1, panels.length);
}
@Override
public void previousPanel() {
if (! hasPrevious()) throw new NoSuchElementException();
index--;
}
@Override
public void nextPanel() {
if (! hasNext()) throw new NoSuchElementException();
index++;
}
@Override
public boolean hasPrevious() {
return index > 0;
}
@Override
public boolean hasNext() {
return index < panels.length - 1;
}
@Override
public void addChangeListener(ChangeListener l) {
}
@Override
public void removeChangeListener(ChangeListener l) {
}
protected WizardDescriptor.Panel[] createPanels(Project project, TemplateWizard wiz) {
Sources sources = (Sources) ProjectUtils.getSources(project);
SourceGroup[] docSourceGroups = sources.getSourceGroups(WebProjectConstants.TYPE_DOC_ROOT);
SourceGroup[] sourceGroups;
if (docSourceGroups.length == 0) {
sourceGroups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
} else {
sourceGroups = docSourceGroups;
}
templateClientPanel = new TemplateClientPanel(wiz);
// creates simple wizard panel with bottom panel
return new WizardDescriptor.Panel[] {
Templates.buildSimpleTargetChooser(project, sourceGroups).bottomPanel(templateClientPanel).create()
};
}
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 String createDefineTags(Collection<String> data, int indent) {
StringBuffer sb = new StringBuffer();
final String basicIndent = " ";
for (String temp : data) {
sb.append(END_LINE);
for (int i = 0; i < indent; i++)
sb.append(basicIndent);
sb.append("<ui:define name=\"").append(temp).append("\">"); //NOI18N
sb.append(END_LINE);
for (int i = 0; i < (indent + 1); i++)
sb.append(basicIndent);
sb.append(temp);
sb.append(END_LINE);
for (int i = 0; i < indent; i++)
sb.append(basicIndent);
sb.append("</ui:define>"); //NOI18N
sb.append(END_LINE);
}
return sb.toString();
}
}