blob: b127c059bc568d6586c55964ea14b3acb6f93eb9 [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.client.rest.wizard;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.event.ChangeListener;
import org.netbeans.api.progress.ProgressHandle;
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.client.rest.wizard.RestPanel.JsUi;
import org.netbeans.modules.web.clientproject.api.WebClientProjectConstants;
import org.netbeans.modules.websvc.rest.model.api.RestServiceDescription;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.openide.WizardDescriptor;
import org.openide.WizardDescriptor.Panel;
import org.openide.WizardDescriptor.ProgressInstantiatingIterator;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataFolder;
import org.openide.loaders.DataObject;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
/**
* @author ads
*
*/
public class JSClientIterator implements ProgressInstantiatingIterator<WizardDescriptor>{
public static final String HELP_ID = "js.client.rest"; // NOI18N
private static final Logger LOGGER = Logger.getLogger(JSClientIterator.class.getName());
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.Iterator#addChangeListener(javax.swing.event.ChangeListener)
*/
@Override
public void addChangeListener( ChangeListener listener ) {
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.Iterator#current()
*/
@Override
public Panel<WizardDescriptor> current() {
return myPanels[myIndex];
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.Iterator#hasNext()
*/
@Override
public boolean hasNext() {
return myIndex<myPanels.length-1;
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.Iterator#hasPrevious()
*/
@Override
public boolean hasPrevious() {
return myIndex >0 ;
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.Iterator#name()
*/
@Override
public String name() {
return null;
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.Iterator#nextPanel()
*/
@Override
public void nextPanel() {
if (! hasNext()) {
throw new NoSuchElementException();
}
myIndex++;
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.Iterator#previousPanel()
*/
@Override
public void previousPanel() {
if (!hasPrevious()) {
throw new NoSuchElementException();
}
myIndex--;
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.Iterator#removeChangeListener(javax.swing.event.ChangeListener)
*/
@Override
public void removeChangeListener( ChangeListener listener ) {
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.InstantiatingIterator#initialize(org.openide.WizardDescriptor)
*/
@Override
public void initialize( WizardDescriptor descriptor ) {
myWizard = descriptor;
myRestPanel = new RestPanel( descriptor );
Project project = Templates.getProject( descriptor );
Sources sources = ProjectUtils.getSources(project);
String htmlPanelName = NbBundle.getMessage(JSClientIterator.class,
"TXT_HtmlFile"); // NOI18N
Panel panel = new HtmlPanel( descriptor );
panel.getComponent().setName(htmlPanelName);
FileObject projectDirectory = project.getProjectDirectory();
WebModule webModule = WebModule.getWebModule(projectDirectory);
if (webModule != null) {
FileObject documentBase = webModule.getDocumentBase();
if (documentBase != null) {
Templates.setTargetFolder(myWizard, documentBase);
myWizard.putProperty(HtmlPanel.PROP_DOCUMENT_BASE, documentBase);
}
} else {
FileObject publicHtml = getRootFolder(project);
if (publicHtml != null) {
Templates.setTargetFolder(myWizard, publicHtml);
}
}
myPanels = new WizardDescriptor.Panel[]{new FinishPanelDelegate(
Templates.buildSimpleTargetChooser(project,
sources.getSourceGroups(Sources.TYPE_GENERIC)).
bottomPanel(myRestPanel).create()), panel};
setSteps();
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.InstantiatingIterator#instantiate()
*/
@Override
public Set instantiate(ProgressHandle handle) throws IOException {
handle.start();
Project project = Templates.getProject(myWizard);
Node restNode = myRestPanel.getRestNode();
RestServiceDescription description = restNode.getLookup().lookup(
RestServiceDescription.class);
Boolean addBackbone = (Boolean)myWizard.getProperty(RestPanel.ADD_BACKBONE);
FileObject existedBackbone = (FileObject)myWizard.getProperty(
RestPanel.EXISTED_BACKBONE);
FileObject existedUnderscore = (FileObject)myWizard.getProperty(
RestPanel.EXISTED_UNDERSCORE);
FileObject existedJQuery = (FileObject)myWizard.getProperty(
RestPanel.EXISTED_JQUERY);
JsUi ui = (JsUi)myWizard.getProperty(RestPanel.UI);
if ( existedBackbone == null ) {
if ( addBackbone!=null && addBackbone ) {
handle.progress(NbBundle.getMessage(JSClientGenerator.class,
"TXT_CreateLibs")); // NOI18N
existedBackbone = addLibrary("backbone.js"); // NOI18N
if ( existedUnderscore == null ){
existedUnderscore = addLibrary("underscore.js"); // NOI18N
}
if ( existedJQuery == null ){
existedJQuery = addLibrary("jquery"); // NOI18N
}
}
}
FileObject targetFolder = Templates.getTargetFolder(myWizard);
String targetName = Templates.getTargetName(myWizard);
handle.progress(NbBundle.getMessage(JSClientGenerator.class,
"TXT_GenerateModel")); // NOI18N
JSClientGenerator generator = JSClientGenerator.create( description, ui );
Map<String,String> map = generator.generate() ;
FileObject templateFO = FileUtil.getConfigFile("Templates/ClientSide/rest.js"); //NOI18N
DataObject templateDO = DataObject.find(templateFO);
DataFolder dataFolder = DataFolder.findFolder(targetFolder);
DataObject createdFile = templateDO.createFromTemplate(dataFolder,
targetName ,map);
FileObject jsFile = createdFile.getPrimaryFile();
File htmlFile = (File)myWizard.getProperty(
HtmlPanel.HTML_FILE);
if ( htmlFile != null ){
handle.progress(NbBundle.getMessage(JSClientGenerator.class,
"TXT_GenerateHtml")); // NOI18N
/*FileObject html = */createHtml( htmlFile , jsFile, existedBackbone ,
existedUnderscore, existedJQuery , map , generator );
}
handle.finish();
// TODO: add html ?
return Collections.singleton(jsFile);
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.InstantiatingIterator#instantiate()
*/
@Override
public Set instantiate() throws IOException {
throw new UnsupportedOperationException();
}
/* (non-Javadoc)
* @see org.openide.WizardDescriptor.InstantiatingIterator#uninitialize(org.openide.WizardDescriptor)
*/
@Override
public void uninitialize( WizardDescriptor descriptor ) {
myPanels = null;
}
static FileObject getRootFolder(Project project){
SourceGroup[] groups = ProjectUtils.getSources(project).getSourceGroups(
WebClientProjectConstants.SOURCES_TYPE_HTML5_SITE_ROOT);
if ( groups!= null && groups.length >0 ){
return groups[0].getRootFolder();
}
else {
return project.getProjectDirectory();
}
}
private FileObject createHtml( File htmlFile, FileObject appFile,
FileObject backbone , FileObject underscore, FileObject jQuery,
Map<String,String> map, JSClientGenerator generator ) throws IOException
{
File parentFile = htmlFile.getParentFile();
parentFile.mkdirs();
FileObject folder = FileUtil.toFileObject(FileUtil.normalizeFile(parentFile));
FileObject templateFO = FileUtil.getConfigFile("Templates/ClientSide/js.html"); //NOI18N
DataObject templateDO = DataObject.find(templateFO);
DataFolder dataFolder = DataFolder.findFolder(folder);
String name = htmlFile.getName();
if ( name.endsWith( HtmlPanelVisual.HTML)){
name = name.substring(0 , name.length()-HtmlPanelVisual.HTML.length());
}
StringBuilder builder = new StringBuilder();
if ( generator.hasUi() ){
builder.append("<link rel='stylesheet' href='"); // NOI18N
builder.append(JSClientGenerator.TABLESORTER_URL);
builder.append("css/theme.blue.css'>\n"); // NOI18N
builder.append("<link rel='stylesheet' href='"); // NOI18N
builder.append(JSClientGenerator.TABLESORTER_URL);
builder.append("addons/pager/jquery.tablesorter.pager.css'>\n");// NOI18N
}
if ( underscore == null ){
builder.append("<script src='http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js'>"); // NOI18N
builder.append("</script>\n"); // NOI18N
}
else {
String relativePath = getRelativePath(folder, underscore);
builder.append("<script src='"); // NOI18N
builder.append(relativePath);
builder.append("'></script>\n"); // NOI18N
}
if ( jQuery == null ){
builder.append("<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script>\n");// NOI18N
}
else {
String relativePath = getRelativePath(folder, jQuery);
builder.append("<script src='");// NOI18N
builder.append(relativePath);
builder.append("'></script>\n"); // NOI18N
}
if ( backbone == null ){
builder.append("<script src='http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.2/backbone-min.js'></script>\n");// NOI18N
}
else {
String relativePath = getRelativePath(folder, backbone);
builder.append("<script src='");// NOI18N
builder.append(relativePath);
builder.append("'></script>\n"); // NOI18N
}
if ( generator.hasUi() ){
builder.append("<script src='"); // NOI18N
builder.append(JSClientGenerator.TABLESORTER_URL);
builder.append("js/jquery.tablesorter.min.js'></script>\n"); // NOI18N
builder.append("<script src='"); // NOI18N
builder.append(JSClientGenerator.TABLESORTER_URL);
builder.append("addons/pager/jquery.tablesorter.pager.js'>"); // NOI18N
builder.append("</script>\n"); // NOI18N
}
String relativePath = getRelativePath(folder, appFile );
builder.append("<script src='"); // NOI18N
builder.append(relativePath);
builder.append("'></script>"); // NOI18N
map.put("script", builder.toString()); // NOI18N
return templateDO.createFromTemplate(dataFolder,
name, map).getPrimaryFile();
}
private String getRelativePath(FileObject folder, FileObject file){
String relativePath = FileUtil.getRelativePath(folder, file);
if ( relativePath != null ){
return relativePath;
}
Project project = Templates.getProject(myWizard);
FileObject rootFolder = getRootFolder(project);
relativePath = FileUtil.getRelativePath(rootFolder, file);
if ( relativePath == null ){
rootFolder = project.getProjectDirectory();
relativePath = FileUtil.getRelativePath(rootFolder, file);
}
int upCount = getNestingCount(rootFolder, folder);
StringBuilder builder = new StringBuilder();
for(int i=0; i<upCount ; i++){
builder.append("../"); // NOI18N
}
builder.append(relativePath);
return builder.toString();
}
private int getNestingCount(FileObject parent , FileObject child){
int count=0;
FileObject currentParent = child;
while( !parent.equals( currentParent)){
count++;
currentParent = currentParent.getParent();
}
return count;
}
private void setSteps() {
Object contentData = myWizard.getProperty(WizardDescriptor.PROP_CONTENT_DATA);
if ( contentData instanceof String[] ){
String steps[] = (String[])contentData;
String newSteps[] = new String[ steps.length +1];
System.arraycopy(steps, 0, newSteps, 0, 1);
newSteps[newSteps.length-2]=NbBundle.getMessage(JSClientIterator.class,
"TXT_JsFile"); // NOI18N
newSteps[newSteps.length-1]=NbBundle.getMessage(JSClientIterator.class,
"TXT_HtmlFile"); // NOI18N
for( int i=0; i<myPanels.length; i++ ){
Panel panel = myPanels[i];
JComponent component = (JComponent)panel.getComponent();
component.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, newSteps);
component.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i);
}
}
}
private FileObject addLibrary(String libName) {
return null; // TODO
}
private WizardDescriptor myWizard;
private RestPanel myRestPanel;
private WizardDescriptor.Panel[] myPanels;
private int myIndex;
}