001    // Copyright 2006, 2007, 2008, 2009, 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    
015    package org.apache.tapestry5.internal.services;
016    
017    import org.apache.tapestry5.Asset;
018    import org.apache.tapestry5.ComponentResources;
019    import org.apache.tapestry5.FieldFocusPriority;
020    import org.apache.tapestry5.RenderSupport;
021    import org.apache.tapestry5.ioc.internal.util.InternalUtils;
022    import org.apache.tapestry5.ioc.services.SymbolSource;
023    import org.apache.tapestry5.json.JSONArray;
024    import org.apache.tapestry5.json.JSONObject;
025    import org.apache.tapestry5.services.AssetSource;
026    import org.apache.tapestry5.services.javascript.JavaScriptSupport;
027    import org.apache.tapestry5.services.javascript.StylesheetLink;
028    import org.apache.tapestry5.services.javascript.StylesheetOptions;
029    
030    public class RenderSupportImpl implements RenderSupport
031    {
032        private final SymbolSource symbolSource;
033    
034        private final AssetSource assetSource;
035    
036        private final JavaScriptSupport javascriptSupport;
037    
038        // As of 5.2.1, RenderSupportImpl doesn't have any internal mutable state and could be converted
039        // to a service (using the service proxy to the JSS)
040        // instead of an Environmental. But we'll just delete it in 5.3.
041    
042        /**
043         * @param symbolSource
044         *            Used to expand symbols (in {@linkplain #addClasspathScriptLink(String...)}
045         * @param assetSource
046         *            Used to convert classpath scripts to {@link org.apache.tapestry5.Asset}s
047         * @param javascriptSupport
048         *            Used to add JavaScript libraries and blocks of initialization JavaScript to the rendered page
049         */
050        public RenderSupportImpl(SymbolSource symbolSource, AssetSource assetSource, JavaScriptSupport javascriptSupport)
051        {
052            this.symbolSource = symbolSource;
053            this.assetSource = assetSource;
054            this.javascriptSupport = javascriptSupport;
055        }
056    
057        public String allocateClientId(String id)
058        {
059            return javascriptSupport.allocateClientId(id);
060        }
061    
062        public String allocateClientId(ComponentResources resources)
063        {
064            return javascriptSupport.allocateClientId(resources);
065        }
066    
067        public void addScriptLink(Asset... scriptAssets)
068        {
069            for (Asset asset : scriptAssets)
070            {
071                assert asset != null;
072    
073                javascriptSupport.importJavaScriptLibrary(asset);
074            }
075        }
076    
077        public void addScriptLink(String... scriptURLs)
078        {
079            for (String url : scriptURLs)
080                javascriptSupport.importJavaScriptLibrary(url);
081        }
082    
083        public void addClasspathScriptLink(String... classpaths)
084        {
085            for (String path : classpaths)
086                addScriptLinkFromClasspath(path);
087        }
088    
089        private void addScriptLinkFromClasspath(String path)
090        {
091            String expanded = symbolSource.expandSymbols(path);
092    
093            Asset asset = assetSource.getAsset(null, expanded, null);
094    
095            addScriptLink(asset);
096        }
097    
098        public void addScript(String script)
099        {
100            javascriptSupport.addScript(script);
101        }
102    
103        public void addScript(String format, Object... arguments)
104        {
105            javascriptSupport.addScript(format, arguments);
106        }
107    
108        public void addInit(String functionName, JSONArray parameterList)
109        {
110            javascriptSupport.addInitializerCall(functionName, parameterList);
111        }
112    
113        public void addInit(String functionName, JSONObject parameter)
114        {
115            javascriptSupport.addInitializerCall(functionName, parameter);
116        }
117    
118        public void addInit(String functionName, String... parameters)
119        {
120            JSONArray array = new JSONArray();
121    
122            for (String parameter : parameters)
123            {
124                array.put(parameter);
125            }
126    
127            addInit(functionName, array);
128        }
129    
130        public void autofocus(FieldFocusPriority priority, String fieldId)
131        {
132            javascriptSupport.autofocus(priority, fieldId);
133        }
134    
135        public void addStylesheetLink(Asset stylesheet, String media)
136        {
137            javascriptSupport.importStylesheet(new StylesheetLink(stylesheet, new StylesheetOptions(media)));
138        }
139    
140        public void addStylesheetLink(String stylesheetURL, String media)
141        {
142            javascriptSupport.importStylesheet(new StylesheetLink(stylesheetURL, new StylesheetOptions(media)));
143        }
144    }