/**
* Copyright 2014-2017 Riccardo Massera (TheCoder4.Eu) and Stephan Rauh (http://www.beyondjava.net).
*
* This file is part of BootsFaces.
*
* 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 net.bootsfaces.component.remoteCommand;
import java.io.IOException;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.FacesRenderer;
import net.bootsfaces.component.ajax.AJAXRenderer;
import net.bootsfaces.render.CoreRenderer;
/** This class generates the HTML code of <b:remoteCommand />. */
@FacesRenderer(componentFamily = "net.bootsfaces.component", rendererType = "net.bootsfaces.component.remoteCommand.RemoteCommand")
public class RemoteCommandRenderer extends CoreRenderer {
/**
* This methods receives and processes input made by the user. More specifically, it ckecks whether the
* user has interacted with the current b:remoteCommand. The default implementation simply stores
* the input value in the list of submitted values. If the validation checks are passed,
* the values in the <code>submittedValues</code> list are store in the backend bean.
* @param context the FacesContext.
* @param component the current b:remoteCommand.
*/
@Override
public void decode(FacesContext context, UIComponent component) {
// RemoteCommand remoteCommand = (RemoteCommand) component;
// if (component.isDisabled() ) {
// return;
// }
decodeBehaviors(context, component);
String clientId = component.getClientId(context);
new AJAXRenderer().decode(context, component, clientId);
}
/**
* This methods generates the HTML code of the current b:remoteCommand.
* @param context the FacesContext.
* @param component the current b:remoteCommand.
* @throws IOException thrown if something goes wrong when writing the HTML code.
*/
@Override
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
if (!component.isRendered()) {
return;
}
RemoteCommand remoteCommand = (RemoteCommand) component;
ResponseWriter rw = context.getResponseWriter();
String clientId = remoteCommand.getClientId();
String parameters=remoteCommand.getParameters();
String parametersAsJson=null;
if (null != parameters && parameters.length()>0) {
parametersAsJson = "";
String[] params = parameters.split(",");
for (String p: params) {
p=p.trim();
parametersAsJson += "'" + p + "':" + p + ",";
}
parametersAsJson=parametersAsJson.substring(0, parametersAsJson.length()-1);
}
StringBuilder call = AJAXRenderer.generateAJAXCall(context, remoteCommand, null, parametersAsJson);
String name = remoteCommand.getName();
if (null == name) {
throw new FacesException("b:remoteCommand: Please define the name of the JavaScript function calling the Java backend.");
}
rw.startElement("script", component);
rw.writeAttribute("id", clientId, null);
String c = call.toString().replace("callAjax(this,", "callAjax(document.getElementById('" + clientId + "'),");
if (parameters!=null) {
rw.append("function " + name + "(" + parameters + "){" + c + "}");
} else {
rw.append("function " + name + "(){" + c + "}");
}
rw.endElement("script");
}
}