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 }