/* * © Copyright IBM Corp. 2011 * * 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.ibm.xsp.extlib.renderkit.html_extended.sbt; import java.io.IOException; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import com.ibm.commons.runtime.Context; import com.ibm.commons.runtime.RuntimeConstants; import com.ibm.commons.util.PathUtil; import com.ibm.commons.util.StringUtil; import com.ibm.commons.util.io.json.JsonException; import com.ibm.commons.util.io.json.JsonGenerator; import com.ibm.commons.util.io.json.JsonJavaFactory; import com.ibm.commons.util.io.json.JsonJavaObject; import com.ibm.commons.util.io.json.JsonObject; import com.ibm.sbt.service.basic.ProxyEndpointService; import com.ibm.sbt.services.endpoints.Endpoint; import com.ibm.sbt.services.endpoints.EndpointFactory; import com.ibm.xsp.FacesExceptionEx; import com.ibm.xsp.ajax.AjaxUtil; import com.ibm.xsp.component.UIViewRootEx2; import com.ibm.xsp.extlib.component.sbt.UISbtClient; import com.ibm.xsp.extlib.renderkit.html_extended.FacesRendererEx; import com.ibm.xsp.extlib.resources.ExtLibResources; import com.ibm.xsp.extlib.sbt.connections.proxy.ConnectionsProxyHandler; import com.ibm.xsp.resource.DojoModuleResource; import com.ibm.xsp.resource.ScriptResource; import com.ibm.xsp.resource.StyleSheetResource; /** * @author Philippe Riand */ public class SbtClientRenderer extends FacesRendererEx { public static final String PROFILES_SEMANTICTAGSERVLET = "/profiles/ibm_semanticTagServlet/javascript/semanticTagService.js"; // $NON-NLS-1$ public static final String COMMUNITIES_DOJO = "/communities/javascript/build/dojo/dojo.js"; // $NON-NLS-1$ //public static final String COMMUNITIES_SEMANTICTAGSERVLET = "/communities/javascript/build/dojo/semanticTagService.js"; // $NON-NLS-1$ public static final String COMMUNITIES_SEMANTICTAGSERVLET = PROFILES_SEMANTICTAGSERVLET; public static final String SBTLIBRARY = RuntimeConstants.get().getConstant(RuntimeConstants.LIBRARY_BASEURL); @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { // If we are in partial refresh mode, we assume that they are already loaded if(AjaxUtil.isAjaxPartialRefresh(context)) { return; } UISbtClient ctClient = (UISbtClient)component; // Ensure that the dojo theme is loaded UIViewRootEx2 rootEx = (UIViewRootEx2)context.getViewRoot(); rootEx.setDojoTheme(true); // Make the client enabled UISbtClient.enableClient(rootEx, true); // Find the Connections Endpoint String endpointName = ctClient.getEndpoint(); if(StringUtil.isEmpty(endpointName)) { endpointName = EndpointFactory.SERVER_CONNECTIONS; } Endpoint ctServer = EndpointFactory.getEndpointUnchecked(endpointName); if(ctServer==null) { //Platform.getInstance().log("Sametime server URL is undefined."); return; } boolean inclProfiles = ctClient.isProfilesBusinessCard(); boolean inclCommunities = ctClient.isCommunitiesBusinessCard(); if(inclProfiles || inclCommunities) { // Write the Profiles semantic servlet if(inclProfiles) { writeCommunitiesConfig(context, rootEx, ctClient, ctServer, endpointName); } // Write the Communities semantic servlet if(inclCommunities) { writeCommunitiesConfig(context, rootEx, ctClient, ctServer, endpointName); } // Add the semantic tag resource addSemanticTagResource(context, rootEx, ctClient, ctServer, endpointName, inclProfiles, inclCommunities); } String sbtlib_dojo = SBTLIBRARY + "?lib=dojo"; rootEx.addEncodeResource(new ScriptResource(sbtlib_dojo, true)); // Required by the profiles card code... //dijit._Widget,dijit._Templated,dijit._Container,dijit.form.ComboBox rootEx.addEncodeResource(ExtLibResources.dojoI18n); // $NON-NLS-1$ rootEx.addEncodeResource(ExtLibResources.dojoCookie); // $NON-NLS-1$ //rootEx.addEncodeResource(new DojoModuleResource("dijit._Widget")); // $NON-NLS-1$ //rootEx.addEncodeResource(new DojoModuleResource("dijit._Templated")); // $NON-NLS-1$ rootEx.addEncodeResource(new DojoModuleResource("dijit._Container")); // $NON-NLS-1$ rootEx.addEncodeResource(new DojoModuleResource("dijit.form.ComboBox")); // $NON-NLS-1$ } // // Profiles // protected void writeProfilesConfig(FacesContext context, UIViewRootEx2 rootEx, UISbtClient ctClient, Endpoint ctServer, String endpointName) throws IOException { } // // Communities // protected void writeCommunitiesConfig(FacesContext context, UIViewRootEx2 rootEx, UISbtClient ctClient, Endpoint ctServer, String endpointName) throws IOException { try { // Create the configuration object and the corresponding script JsonObject semConfig = createCommunitiesSemConfig(context, ctClient, ctServer, endpointName); StringBuilder b = new StringBuilder(256); b.append("var SemTagSvcConfig="); JsonGenerator.toJson(JsonJavaFactory.instance,b,semConfig,true); b.append(";\n"); String onInitSvcConfig = ctClient.getInitSvcConfigScript(); if(StringUtil.isNotEmpty(onInitSvcConfig)) { b.append(onInitSvcConfig); b.append("\n"); } ScriptResource configJS = new ScriptResource(); configJS.setClientSide(true); configJS.setContents(b.toString()); rootEx.addEncodeResource(context,configJS); } catch(JsonException ex) { throw new FacesExceptionEx(ex); } } protected JsonObject createCommunitiesSemConfig(FacesContext context, UISbtClient ctClient, Endpoint ctServer, String endpointName) throws IOException { // Get the proxy object in memory JsonObject proxyConfig = new JsonJavaObject(); String baseUrl = PathUtil.concat(ctServer.getUrl(),"communities",'/'); proxyConfig.putJsonProperty("baseUrl", baseUrl); String proxyUrl = getProxyUrl(context, ctClient, ctServer, endpointName); //PathUtil.concat(ctServer.getUrl(),"communities",'/'); if(StringUtil.isNotEmpty(proxyUrl)) { proxyConfig.putJsonProperty("proxyURL", proxyUrl); } proxyConfig.putJsonProperty("loadCssFiles", ctClient.isLoadCSS()); return proxyConfig; } protected String getProxyUrl(FacesContext context, UISbtClient ctClient, Endpoint ctServer, String endpointName) { Context ctx = Context.getUnchecked(); return ProxyEndpointService.getProxyUrlForEndpoint(ctx, ConnectionsProxyHandler.URL_PATH,endpointName, null); } // // Semantic tag service // protected void addSemanticTagResource(FacesContext context, UIViewRootEx2 rootEx, UISbtClient ctClient, Endpoint ctServer, String endpointName, boolean inclProfiles, boolean inclCommunities) throws IOException { String connSrvUrl = PathUtil.concat(ctServer.getUrl(),PROFILES_SEMANTICTAGSERVLET,'/'); StringBuilder b = new StringBuilder(128); b.append(connSrvUrl); // boolean loadDojo = ctClient.isLoadDojo(); // b.append("?inclDojo="); // b.append(loadDojo?"true":"false"); // boolean loadCss = ctClient.isLoadCSS(); // b.append("?loadCssFiles="); // b.append(loadCss?"true":"false"); // if(inclCommunities) { // b.append("&inclComm=true"); // } // if(ctClient.isDebug()) { // b.append("&debug=uncompressed"); // } // Add the resources ScriptResource js = new ScriptResource(b.toString(), true); //js.setAttribute("defer", "defer"); rootEx.addEncodeResource(js); // Try to load the vcard only CSS which is anyway required, even when OneUI is // already loaded by the application // if(!loadCss) { // //https://w3.ibm.com/connections/profiles/nav/common/styles/base/standaloneVcard.css // String semtagUrl = PathUtil.concat(ctServer.getUrl(),"/profiles/nav/common/styles/base/semanticTagStyles.css",'/'); // StyleSheetResource semtag = new StyleSheetResource(semtagUrl); // rootEx.addEncodeResource(context,semtag); // } } }