001    package org.apache.myfaces.tobago.webapp;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one or more
005     * contributor license agreements.  See the NOTICE file distributed with
006     * this work for additional information regarding copyright ownership.
007     * The ASF licenses this file to You under the Apache License, Version 2.0
008     * (the "License"); you may not use this file except in compliance with
009     * the License.  You may obtain a copy of the License at
010     *
011     *      http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing, software
014     * distributed under the License is distributed on an "AS IS" BASIS,
015     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016     * See the License for the specific language governing permissions and
017     * limitations under the License.
018     */
019    
020    import org.apache.myfaces.tobago.renderkit.css.Classes;
021    import org.apache.myfaces.tobago.renderkit.css.Style;
022    import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
023    import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
024    import org.apache.myfaces.tobago.renderkit.html.StyleClasses;
025    
026    import javax.faces.component.UIComponent;
027    import javax.faces.context.ResponseWriter;
028    import java.io.IOException;
029    import java.io.Writer;
030    
031    /**
032     * This provides an alternative ResponseWriter interfaces, which allows optimizations.
033     * E. g. some attributes needed to to be escaped.
034     * <p/>
035     * Date: 08.05.2007 13:51:43
036     */
037    public abstract class TobagoResponseWriter extends ResponseWriter {
038    
039      // same as in ResponseWriter
040    
041      @Override
042      public abstract void startElement(String name, UIComponent component) throws IOException;
043    
044      /**
045       * @deprecated Use {@link #startElement(String, UIComponent) startElement(name, null)} instead.
046       */
047      @Deprecated
048      public void startElement(String name) throws IOException {
049        startElement(name, null);
050      }
051    
052      @Override
053      public abstract void endElement(String name) throws IOException;
054        
055      public abstract void write(String string) throws IOException;
056    
057      @Override
058      public abstract void writeComment(Object comment) throws IOException;
059    
060      @Override
061      public abstract ResponseWriter cloneWithWriter(Writer writer);
062    
063      /**
064       * @deprecated Should not directly called via this interface. There is be a special method which might be better.
065       */
066      @Deprecated
067      public abstract void writeAttribute(String name, Object value, final String property) throws IOException;
068    
069      /**
070       * @deprecated Should not directly called via this interface. There is be a special method which might be better.
071       */
072      @Deprecated
073      public abstract void writeText(Object text, String property) throws IOException;
074    
075      @Override
076      public abstract void flush() throws IOException;
077    
078      // others (not from ResponseWriter)
079    
080      /**
081       * Writes a string attribute. The renderer may set escape=false to switch of escaping of the string,
082       * if it is not necessary.
083       */
084      public abstract void writeAttribute(String name, String string, boolean escape) throws IOException;
085    
086      /**
087       * Writes a boolean attribute. The value will not escaped.
088       */
089      public void writeAttribute(String name, boolean on) throws IOException {
090        if (on) {
091          writeAttribute(name, name, false);
092        }
093      }
094    
095      /**
096       * Writes a integer attribute. The value will not escaped.
097       */
098      public void writeAttribute(String name, int number) throws IOException {
099        writeAttribute(name, Integer.toString(number), false);
100      }
101    
102      /**
103       * Writes a propery as attribute. The value will be escaped.
104       */
105      public void writeAttributeFromComponent(String name, String property) throws IOException {
106        writeAttribute(name, null, property);
107      }
108    
109      /**
110       * Write the id attribute. The value will not escaped.
111       */
112      public void writeIdAttribute(String id) throws IOException {
113        writeAttribute(HtmlAttributes.ID, id, false);
114      }
115    
116      /**
117       * Write the name attribute. The value will not escaped.
118       */
119      public void writeNameAttribute(String name) throws IOException {
120        writeAttribute(HtmlAttributes.NAME, name, false);
121      }
122    
123      /**
124       * Write the class attribute. The value will not escaped.
125       * @deprecated since Tobago 1.5.0
126       */
127      @Deprecated
128      public void writeClassAttribute(String cssClass) throws IOException {
129        writeAttribute(HtmlAttributes.CLASS, cssClass, false);
130      }
131    
132      /**
133       * Write the class attribute. The value will not escaped.
134       * @deprecated since Tobago 1.5.0
135       */
136      @Deprecated
137      public void writeClassAttribute(StyleClasses styleClasses) throws IOException {
138        writeAttribute(HtmlAttributes.CLASS, styleClasses.toString(), false);
139      }
140    
141      /**
142       * Write the class attribute. The value will not escaped.
143       * <br/>
144       * <b>Note:</b> For backward compatibility the value of the Attribute
145       * <code>{@link org.apache.myfaces.tobago.component.Attributes#STYLE_CLASS}</code>
146       * will be inserted additionally. This function will be removed in later releases.
147       * @param classes The abstract representation of the css class string, normally created by the renderer.
148       */
149      public void writeClassAttribute(Classes classes) throws IOException {
150        String styleClasses = getStyleClasses();
151        String stringValue = classes.getStringValue();
152        if (styleClasses != null) {
153          stringValue += " " + styleClasses;
154        }
155        writeAttribute(HtmlAttributes.CLASS, stringValue, false);
156      }
157    
158      @Deprecated
159      public abstract String getStyleClasses();
160    
161      /**
162       * Write the class attribute. The value will not escaped.
163       * @deprecated since Tobago 1.5.0
164       */
165      @Deprecated
166      public abstract void writeClassAttribute() throws IOException;
167    
168      /**
169       * Write the style attribute. The value will not escaped.
170       */
171      public void writeStyleAttribute(Style style) throws IOException {
172        if (style != null) {
173          writeAttribute(HtmlAttributes.STYLE, style.encode(), false);
174        }
175      }
176    
177      /**
178       * Write the style attribute. The value will not escaped.
179       * @deprecated since 1.5.0, use writeStyleAttribute(Style) instead.
180       */
181      @Deprecated
182      public void writeStyleAttribute(String style) throws IOException {
183        writeAttribute(HtmlAttributes.STYLE, style, false);
184      }
185    
186      public void writeJavascript(String script) throws IOException {
187        startJavascript();
188        write(script);
189        endJavascript();
190      }
191    
192      public void endJavascript() throws IOException {
193    //    write("\n// -->\n"); // todo: for XHMTL we may need
194        endElement(HtmlElements.SCRIPT);
195      }
196    
197      public void startJavascript() throws IOException {
198        startElement(HtmlElements.SCRIPT, null);
199        writeAttribute(HtmlAttributes.TYPE, "text/javascript", false);
200    //    write("\n<!--\n");
201      }
202    
203      /**
204       * Write text content. The text will be escaped.
205       */
206      public void writeText(String text) throws IOException {
207        writeText(text, null);
208      }
209    
210      /**
211       * Writes a property as text. The text will be escaped.
212       */
213      public void writeTextFromComponent(String property) throws IOException {
214        writeText(null, property);
215      }
216    
217      public String getContentTypeWithCharSet() {
218        String contentType = getContentType();
219        if (contentType == null) {
220          contentType = "text/html";
221        }
222        String characterEncoding = getCharacterEncoding();
223        if (characterEncoding == null) {
224          characterEncoding = "UTF-8";
225        }
226    
227        StringBuilder builder = new StringBuilder(contentType);
228        builder.append(";charset=");
229        builder.append(characterEncoding);
230        return builder.toString();
231    
232      }
233    }