blob: 66cea7402913c7507dfefbb6bda67918d067ca85 [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.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.lang.model.element.TypeElement;
import org.netbeans.api.java.source.CompilationController;
import org.netbeans.modules.web.client.rest.wizard.JSClientGenerator.HttpRequests;
import org.netbeans.modules.web.client.rest.wizard.RestPanel.JsUi;
/**
* @author ads
*
*/
class RouterGenerator {
RouterGenerator(StringBuilder routers, String name , ModelGenerator generator){
myRouters = routers;
myRouterName = name;
myModelGenerator = generator;
}
void generateRouter( TypeElement entity, String path,
String collectionPath, Map<HttpRequests, String> httpPaths,
CompilationController controller)
{
myRouters.append("var "); // NOI18N
myRouters.append(myRouterName);
myRouters.append(" = Backbone.Router.extend({\n"); // NOI18N
boolean hasCollection = collectionPath != null;
String modelVar = getModelGenerator().getModelName().toLowerCase(Locale.ENGLISH);
/*
* Fill routes
*/
// default route used on page loading
myRouters.append("routes:{\n"); // NOI18N
if ( hasCollection ){
myRouters.append("'':'list'"); // NOI18N
}
else {
myRouters.append("'':'details'"); // NOI18N
}
// #new route if there is a corresponding POST request in the REST
if ( httpPaths.get( HttpRequests.POST) != null ){
myRouters.append(",\n'new':'create'\n"); // NOI18N
}
// #id route if REST has a method for collection
if ( hasCollection ){
myRouters.append(",\n':id':'details'\n"); // NOI18N
}
myRouters.append("},\n"); // NOI18N
// CTOR ( initialize ) function assign CreateView for "tpl-create" template
myRouters.append("initialize:function(){\n"); // NOI18N
myRouters.append("var self = this;\n"); // NOI18N
myRouters.append("$('#"); // NOI18N
myRouters.append(getHeaderId());
myRouters.append("').html(new views.CreateView({\n"); // NOI18N
myRouters.append(" // tpl-create is template identifier for 'create' block\n");// NOI18N
myRouters.append("templateName :'#"); // NOI18N
myRouters.append(getCreateTemplate());
myRouters.append("',\n"); // NOI18N
myRouters.append("navigate: function(){\n"); // NOI18N
myRouters.append("self.navigate('new', true);\n}\n"); // NOI18N
myRouters.append("}).render().el);\n},\n"); // NOI18N
if ( hasCollection ){
if ( useUi() ){
mySideBarId = "datatable"; // NOI18N
}
else {
mySideBarId = "sidebar"; // NOI18N
}
myRouters.append("list:function () {\n"); // NOI18N
myRouters.append("this.collection = new models."); // NOI18N
myRouters.append(getModelGenerator().getCollectionModelName());
myRouters.append("();\nvar self = this;\n"); // NOI18N
myRouters.append("this.collection.fetch({\n"); // NOI18N
myRouters.append("success:function () {\n"); // NOI18N
myRouters.append("self.listView = new views.ListView({\n"); // NOI18N
myRouters.append("model:self.collection,\n");
StringBuilder builder = new StringBuilder("tpl-"); // NOI18N
builder.append(modelVar);
builder.append("-list-item"); // NOI18N
myListItemTemplate = builder.toString();
myRouters.append(" // "); // NOI18N
myRouters.append(myListItemTemplate);
myRouters.append("is template identifier for item\n"); // NOI18N
myRouters.append("templateName : '#"); // NOI18N
myRouters.append(myListItemTemplate);
myRouters.append("'\n});\n"); // NOI18N
myRouters.append("$('#"); // NOI18N
myRouters.append(getSideBarId());
myRouters.append("').html(self.listView.render().el)"); // NOI18N
if ( useUi() ){
myRouters.append(".append(_.template($('#"); // NOI18N
myRouters.append(getTableHeadId());
myRouters.append("').html())())");
}
myRouters.append(";\nif (self.requestedId) {\n"); // NOI18N
myRouters.append("self.details(self.requestedId);\n}\n"); // NOI18N
if ( useUi() ){
myRouters.append("var pagerOptions = {\n"); // NOI18N
myRouters.append(" // target the pager markup \n"); // NOI18N
myRouters.append("container: $('.pager'),\n"); // NOI18N
myRouters.append(" // output string - default is "); // NOI18N
myRouters.append("'{page}/{totalPages}'; possible"); // NOI18N
myRouters.append("variables: {page}, {totalPages},"); // NOI18N
myRouters.append("{startRow}, {endRow} and {totalRows}\n"); // NOI18N
myRouters.append("output: '{startRow} to"); // NOI18N
myRouters.append(" {endRow} ({totalRows})',\n"); // NOI18N
myRouters.append(" // starting page of the pager (zero based index)\n");// NOI18N
myRouters.append("page: 0,\n"); // NOI18N
myRouters.append(" // Number of visible rows - default is 10\n");// NOI18N
myRouters.append("size: 10\n};\n$('#"); // NOI18N
myRouters.append(getSideBarId());
myRouters.append("').tablesorter({widthFixed: true, \n"); // NOI18N
myRouters.append("widgets: ['zebra']}).\n"); // NOI18N
myRouters.append("tablesorterPager(pagerOptions);\n"); // NOI18N
}
myRouters.append("}\n});\n},\n"); // NOI18N
}
StringBuilder builder = new StringBuilder("tpl-"); // NOI18N
builder.append(modelVar);
builder.append("-details"); // NOI18N
myDetailsTemplateName = builder.toString();
// details function
myRouters.append("details:function ("); // NOI18N
if ( hasCollection ){
myRouters.append("id"); // NOI18N
}
myRouters.append("){\n"); // NOI18N
if ( hasCollection ){
myRouters.append("if (this.collection) {\n"); // NOI18N
myRouters.append("this."); // NOI18N
myRouters.append(modelVar);
myRouters.append("= this.collection.get(id);\n"); // NOI18N
myRouters.append("if (this.view) {\n"); // NOI18N
myRouters.append("this.view.close();\n}\n"); // NOI18N
myRouters.append("var self = this;\n"); // NOI18N
myRouters.append("this.view = new views.ModelView({\n"); // NOI18N
myRouters.append("model:this."); // NOI18N
myRouters.append(modelVar);
myRouters.append(",\n // "); // NOI18N
myRouters.append( myDetailsTemplateName );
myRouters.append(" is template identifier for chosen model element\n");// NOI18N
myRouters.append("templateName: '#"); // NOI18N
myRouters.append( myDetailsTemplateName );
myRouters.append("',\ngetHashObject: function(){\n"); // NOI18N
myRouters.append("return self.getData();\n}\n});\n"); // NOI18N
myRouters.append("$('#"); // NOI18N
myRouters.append(getContentId());
myRouters.append("').html(this.view.render().el);"); // NOI18N
myRouters.append("} else {\n"); // NOI18N
myRouters.append("this.requestedId = id;\n"); // NOI18N
myRouters.append("this.list();\n}\n},\n"); // NOI18N
}
else {
myRouters.append("if (this.view) {\n"); // NOI18N
myRouters.append("this.view.close();\n}\n"); // NOI18N
myRouters.append("var self = this;\n"); // NOI18N
myRouters.append("this."); // NOI18N
myRouters.append(modelVar);
myRouters.append(" = models."); // NOI18N
myRouters.append(getModelGenerator().getModelName());
myRouters.append("();\nthis."); // NOI18N
myRouters.append(modelVar);
myRouters.append(".fetch({\n"); // NOI18N
myRouters.append("success:function(){\n"); // NOI18N
myRouters.append("self.view = new views.ModelView({\n"); // NOI18N
myRouters.append("model: self.newclass,\n // "); // NOI18N
myRouters.append(myDetailsTemplateName);
myRouters.append(" is template identifier for chosen model element\n");// NOI18N
myRouters.append("templateName : '#"); // NOI18N
myRouters.append(myDetailsTemplateName);
myRouters.append("'\n});\n"); // NOI18N
myRouters.append("$('#"); // NOI18N
myRouters.append(getContentId());
myRouters.append("').html(self.view.render().el);}\n});\n},\n");// NOI18N
}
if ( httpPaths.get( HttpRequests.POST) != null){
myRouters.append("create:function () {\n"); // NOI18N
myRouters.append("if (this.view) {\n"); // NOI18N
myRouters.append("this.view.close();\n}\n"); // NOI18N
myRouters.append("var self = this;\n"); // NOI18N
myRouters.append("var dataModel = new models.");
myRouters.append( getModelGenerator().getModelName());
myRouters.append("();\n"); // NOI18N
myRouters.append(" // see isNew() method implementation in the model\n");// NOI18N
myRouters.append("dataModel.notSynced = true;\n"); // NOI18N
myRouters.append("this.view = new views.ModelView({\n"); // NOI18N
myRouters.append("model: dataModel,\n");
if ( hasCollection ){
myRouters.append("collection: this.collection,\n"); // NOI18N
}
myRouters.append(" // "); // NOI18N
myRouters.append(myDetailsTemplateName);
myRouters.append(" is a template identifier for chosen model element\n");// NOI18N
myRouters.append("templateName: '#"); // NOI18N
myRouters.append(myDetailsTemplateName);
myRouters.append("',\n"); // NOI18N
myRouters.append("navigate: function( id ){\n"); // NOI18N
myRouters.append("self.navigate(id, false);\n},\n\n"); // NOI18N
myRouters.append("getHashObject: function(){\n"); // NOI18N
myRouters.append("return self.getData();\n}\n"); // NOI18N
myRouters.append("});\n"); // NOI18N
myRouters.append("$('#"); // NOI18N
myRouters.append(getContentId());
myRouters.append("').html(this.view.render().el);\n},\n"); // NOI18N
}
// add method getData which returns composite object data got from HTML controls
myRouters.append("getData: function(){\n"); // NOI18N
myRouters.append("return {\n"); // NOI18N
if ( useUi() ){
ModelAttribute id = getModelGenerator().getIdAttribute();
if ( id!= null ){
myRouters.append(id.getName());
myRouters.append(":$('#"); // NOI18N
myRouters.append(id.getName());
myRouters.append("').val(),\n"); // NOI18N
}
Set<ModelAttribute> attributes = getModelGenerator().getAttributes();
int size = attributes.size();
int i=0;
for (ModelAttribute attribute : attributes) {
myRouters.append(attribute.getName());
myRouters.append(":$('#"); // NOI18N
myRouters.append(attribute.getName());
myRouters.append("').val()"); // NOI18N
i++;
if ( i <size ){
myRouters.append(',');
}
myRouters.append("\n"); // NOI18N
}
}
else {
String mainModelAttribute = getModelGenerator()
.getDisplayNameAlias();
myRouters.append("/*\n * get values from the HTML controls and"); // NOI18N
myRouters.append(" put them here as a hash of attributes\n"); // NOI18N
if ( mainModelAttribute!= null ){
myRouters.append(" * f.e.\n * "); // NOI18N
myRouters.append(mainModelAttribute);
myRouters.append(":$('#"); // NOI18N
myRouters.append(mainModelAttribute);
myRouters.append("').val(),\n * ....\n"); // NOI18N
}
myRouters.append(" */\n"); // NOI18N
}
myRouters.append("};\n}\n"); // NOI18N
myRouters.append("});\n"); // NOI18N
myRouters.append("new "); // NOI18N
myRouters.append(myRouterName);
myRouters.append("();\n"); // NOI18N
}
ModelGenerator getModelGenerator(){
return myModelGenerator;
}
String getDetailsTemplate(){
return myDetailsTemplateName;
}
String getListItemTemplate(){
return myListItemTemplate;
}
String getCreateTemplate(){
return "tpl-create"; // NOI18N
}
String getTableHeadId(){
return "thead"; // NOI18N
}
String getHeaderId(){
if ( useUi() ){
return "create"; // NOI18N
}
return "header"; // NOI18N
}
boolean useUi(){
return getModelGenerator().hasCollection() &&
getModelGenerator().getUi() == JsUi.TABLESORTER;
}
String getContentId(){
if ( useUi() ){
return "details"; // NOI18N
}
return "content"; // NOI18N
}
String getSideBarId(){
return mySideBarId;
}
private ModelGenerator myModelGenerator;
private StringBuilder myRouters;
private String myRouterName;
private String myDetailsTemplateName;
private String mySideBarId;
private String myListItemTemplate;
}