001// Copyright 2008, 2010, 2011 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
015package org.apache.tapestry5.internal.services;
016
017import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
018import org.apache.tapestry5.json.JSONArray;
019import org.apache.tapestry5.json.JSONObject;
020import org.apache.tapestry5.services.javascript.InitializationPriority;
021import org.apache.tapestry5.services.javascript.StylesheetLink;
022
023import java.util.Map;
024
025public class PartialMarkupDocumentLinker implements DocumentLinker
026{
027    private final JSONArray scripts = new JSONArray();
028
029    private final JSONArray stylesheets = new JSONArray();
030
031    private final Map<InitializationPriority, JSONObject> priorityToInits = CollectionFactory.newMap();
032
033    public void addScriptLink(String scriptURL)
034    {
035        scripts.put(scriptURL);
036    }
037
038    public void addStylesheetLink(StylesheetLink stylesheet)
039    {
040        JSONObject object = new JSONObject(
041
042                "href", stylesheet.getURL(),
043
044                "media", stylesheet.getOptions().media);
045
046        stylesheets.put(object);
047    }
048
049    public void addScript(InitializationPriority priority, String script)
050    {
051        throw new UnsupportedOperationException(
052                "DocumentLinker.addScript() is not implemented for partial page renders.");
053    }
054
055    public void setInitialization(InitializationPriority priority, JSONObject initialization)
056    {
057        priorityToInits.put(priority, initialization);
058    }
059
060    /**
061     * Commits changes, adding one or more keys to the reply.
062     *
063     * @param reply JSON Object to be sent to client
064     */
065    public void commit(JSONObject reply)
066    {
067        if (scripts.length() > 0)
068            reply.put("scripts", scripts);
069
070        if (stylesheets.length() > 0)
071            reply.put("stylesheets", stylesheets);
072
073        JSONArray inits = new JSONArray();
074
075        for (InitializationPriority p : InitializationPriority.values())
076        {
077            JSONObject init = priorityToInits.get(p);
078
079            if (init != null)
080                inits.put(init);
081        }
082
083        if (inits.length() > 0)
084            reply.put("inits", inits);
085    }
086}