    001    // Copyright 2007, 2008, 2009, 2010 The Apache Software Foundation
    002    //
    003    // Licensed under the Apache License, Version 2.0 (the "License");
    004    // you may not use this file except in compliance with the License.
    005    // You may obtain a copy of the License at
    006    //
    007    // http://www.apache.org/licenses/LICENSE-2.0
    008    //
    009    // Unless required by applicable law or agreed to in writing, software
    010    // distributed under the License is distributed on an "AS IS" BASIS,
    011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012    // See the License for the specific language governing permissions and
    013    // limitations under the License.
    014
    015    package org.apache.tapestry5.internal.services;
    016
    017    import org.apache.tapestry5.Field;
    018    import org.apache.tapestry5.Link;
    019    import org.apache.tapestry5.corelib.data.InsertPosition;
    020    import org.apache.tapestry5.json.JSONArray;
    021    import org.apache.tapestry5.json.JSONLiteral;
    022    import org.apache.tapestry5.json.JSONObject;
    023    import org.apache.tapestry5.services.ClientBehaviorSupport;
    024    import org.apache.tapestry5.services.Environment;
    025    import org.apache.tapestry5.services.FormSupport;
    026    import org.apache.tapestry5.services.javascript.JavaScriptSupport;
    027
    028    public class ClientBehaviorSupportImpl implements ClientBehaviorSupport
    029    {
    030        private final JavaScriptSupport javascriptSupport;
    031
    032        private final Environment environment;
    033
    034        private final JSONObject validations = new JSONObject();
    035
    036        public ClientBehaviorSupportImpl(JavaScriptSupport javascriptSupport, Environment environment)
    037        {
    038            this.javascriptSupport = javascriptSupport;
    039            this.environment = environment;
    040        }
    041
    042        public void addZone(String clientId, String showFunctionName, String updateFunctionName)
    043        {
    044            JSONObject spec = new JSONObject("element", clientId);
    045
    046            addFunction(spec, "show", showFunctionName);
    047            addFunction(spec, "update", updateFunctionName);
    048
    049            FormSupport formSupport = environment.peek(FormSupport.class);
    050
    051            if (formSupport != null)
    052            {
    053                JSONObject parameters = new JSONObject(RequestConstants.FORM_CLIENTID_PARAMETER, formSupport.getClientId(),
    054                        RequestConstants.FORM_COMPONENTID_PARAMETER, formSupport.getFormComponentId());
    055                spec.put("parameters", parameters);
    056            }
    057
    058            javascriptSupport.addInitializerCall("zone", spec);
    059        }
    060
    061        private void addFunction(JSONObject spec, String key, String functionName)
    062        {
    063            if (functionName != null)
    064                spec.put(key, functionName.toLowerCase());
    065        }
    066
    067        public void linkZone(String linkId, String elementId, Link eventLink)
    068        {
    069            JSONObject spec = new JSONObject("linkId", linkId, "zoneId", elementId, "url", eventLink.toURI());
    070
    071            javascriptSupport.addInitializerCall("linkZone", spec);
    072        }
    073
    074        /**
    075         * @deprecated Use {@link #addFormFragment(String,boolean,String,String)} instead
    076         */
    077        public void addFormFragment(String clientId, String showFunctionName, String hideFunctionName)
    078        {
    079            addFormFragment(clientId, false, showFunctionName, hideFunctionName, null);
    080        }
    081
    082        /**
    083         * @deprecated Use {@link #addFormFragment(String, boolean, String, String, String)} instead
    084         */
    085        public void addFormFragment(String clientId, boolean alwaysSubmit, String showFunctionName, String hideFunctionName)
    086        {
    087            addFormFragment(clientId, false, showFunctionName, hideFunctionName, null);
    088        }
    089
    090        public void addFormFragment(String clientId, boolean alwaysSubmit, String showFunctionName, String hideFunctionName, String visibilityBoundFunctionName)
    091        {
    092            JSONObject spec = new JSONObject("element", clientId);
    093
    094            addFunction(spec, "show", showFunctionName);
    095            addFunction(spec, "hide", hideFunctionName);
    096
    097            if (visibilityBoundFunctionName != null)
    098                spec.put("bound", new JSONLiteral(visibilityBoundFunctionName));
    099
    100            if (alwaysSubmit)
    101                spec.put("alwaysSubmit", true);
    102
    103            javascriptSupport.addInitializerCall("formFragment", spec);
    104        }
    105
    106        public void addFormInjector(String clientId, Link link, InsertPosition insertPosition, String showFunctionName)
    107        {
    108            JSONObject spec = new JSONObject("element", clientId, "url", link.toURI());
    109
    110            if (insertPosition == InsertPosition.BELOW)
    111                spec.put("below", true);
    112
    113            addFunction(spec, "show", showFunctionName);
    114
    115            // Always has at least two properties.
    116
    117            javascriptSupport.addInitializerCall("formInjector", spec);
    118        }
    119
    120        public void addValidation(Field field, String validationName, String message, Object constraint)
    121        {
    122            String fieldId = field.getClientId();
    123
    124            JSONArray specs;
    125
    126            if (validations.has(fieldId))
    127                specs = validations.getJSONArray(fieldId);
    128            else
    129            {
    130                specs = new JSONArray();
    131                validations.put(fieldId, specs);
    132            }
    133
    134            JSONArray thisSpec = new JSONArray();
    135
    136            thisSpec.put(validationName);
    137            thisSpec.put(message);
    138
    139            if (constraint != null)
    140                thisSpec.put(constraint);
    141
    142            specs.put(thisSpec);
    143        }
    144
    145        /**
    146         * Invoked at the end of rendering to commit (to the {@link JavaScriptSupport}) any accumulated
    147         * validations.
    148         */
    149        public void commit()
    150        {
    151            if (validations.length() != 0)
    152                javascriptSupport.addInitializerCall("validate", validations);
    153        }
    154    }