/* | |
Copyright 2013 gitblit.com. | |
Licensed 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 com.gitblit.wicket.ng; | |
import java.text.MessageFormat; | |
import java.util.HashMap; | |
import java.util.Map; | |
import org.apache.wicket.ResourceReference; | |
import org.apache.wicket.markup.html.IHeaderContributor; | |
import org.apache.wicket.markup.html.IHeaderResponse; | |
import com.google.gson.Gson; | |
import com.google.gson.GsonBuilder; | |
/** | |
* Simple AngularJS data controller which injects scoped objects as static, | |
* embedded JSON within the generated page. This allows use of AngularJS | |
* client-side databinding (magic) with server-generated pages. | |
* | |
* @author James Moger | |
* | |
*/ | |
public class NgController implements IHeaderContributor { | |
private static final long serialVersionUID = 1L; | |
final String name; | |
final Map<String, Object> variables; | |
public NgController(String name) { | |
this.name = name; | |
this.variables = new HashMap<String, Object>(); | |
} | |
public void addVariable(String name, Object o) { | |
variables.put(name, o); | |
} | |
@Override | |
public void renderHead(IHeaderResponse response) { | |
// add Google AngularJS reference | |
response.renderJavascriptReference(new ResourceReference(NgController.class, "angular.js")); | |
Gson gson = new GsonBuilder().create(); | |
StringBuilder sb = new StringBuilder(); | |
line(sb, MessageFormat.format("<!-- AngularJS {0} data controller -->", name)); | |
line(sb, MessageFormat.format("function {0}($scope) '{'", name)); | |
for (Map.Entry<String, Object> entry : variables.entrySet()) { | |
String var = entry.getKey(); | |
Object o = entry.getValue(); | |
String json = gson.toJson(o); | |
line(sb, MessageFormat.format("\t$scope.{0} = {1};", var, json)); | |
} | |
line(sb, "}"); | |
response.renderJavascript(sb.toString(), null); | |
} | |
private void line(StringBuilder sb, String line) { | |
sb.append(line); | |
sb.append('\n'); | |
} | |
} |