001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.myfaces.tobago.taglib.component;
021
022 import org.apache.myfaces.tobago.apt.annotation.BodyContent;
023 import org.apache.myfaces.tobago.apt.annotation.Tag;
024 import org.apache.myfaces.tobago.apt.annotation.TagAttribute;
025 import org.apache.myfaces.tobago.component.ComponentUtil;
026 import org.apache.myfaces.tobago.component.UIPage;
027
028 import javax.faces.context.FacesContext;
029 import javax.servlet.jsp.JspException;
030 import javax.servlet.jsp.tagext.BodyTagSupport;
031
032 /*
033 * $Id: ScriptTag.java 1368577 2012-08-02 16:20:31Z lofwyr $
034 */
035
036 /**
037 * This tag add client side script to the rendered page.
038 */
039 @Tag(name = "script", bodyContent = BodyContent.JSP)
040 // @Tag(name="script", bodyContent=BodyContent.TAGDEPENDENT)
041 // @BodyContentDescription(contentType="javascript")
042 public class ScriptTag extends BodyTagSupport {
043
044 private static final long serialVersionUID = 3253751129824779272L;
045
046 private String file;
047 private String onload;
048 private String onunload;
049 private String onexit;
050 private String onsubmit;
051
052 @Override
053 public int doEndTag() throws JspException {
054
055 FacesContext facesContext = FacesContext.getCurrentInstance();
056 UIPage page = ComponentUtil.findPage(facesContext);
057 if (page == null) {
058 throw new JspException("The ScriptTag cannot find UIPage. "
059 + "Check you have defined the ScriptTag inside of the PageTag!");
060 }
061
062 if (file != null) {
063 page.getScriptFiles().add(ComponentUtil.getValueFromEl(file));
064 }
065 if (onload != null) {
066 page.getOnloadScripts().add(ComponentUtil.getValueFromEl(onload));
067 }
068 if (onunload != null) {
069 page.getOnunloadScripts().add(ComponentUtil.getValueFromEl(onunload));
070 }
071 if (onexit != null) {
072 page.getOnexitScripts().add(ComponentUtil.getValueFromEl(onexit));
073 }
074 if (onsubmit != null) {
075 page.getOnsubmitScripts().add(ComponentUtil.getValueFromEl(onsubmit));
076 }
077 if (bodyContent != null) {
078 String script = bodyContent.getString();
079 bodyContent.clearBody();
080 page.getScriptBlocks().add(ComponentUtil.getValueFromEl(script));
081 }
082
083 return EVAL_PAGE;
084 }
085
086 @Override
087 public int doStartTag() throws JspException {
088 return EVAL_BODY_BUFFERED;
089 }
090
091 @Override
092 public void release() {
093 super.release();
094 file = null;
095 onload = null;
096 onunload = null;
097 onexit = null;
098 onsubmit = null;
099 }
100
101 public String getFile() {
102 return file;
103 }
104
105
106 /**
107 * Absolute url to script file or script name to lookup in tobago resource path
108 */
109 @TagAttribute
110 public void setFile(String file) {
111 this.file = file;
112 }
113
114 public String getOnload() {
115 return onload;
116 }
117
118
119 /**
120 * A script function which is invoked during onLoad Handler on the client.
121 */
122 @TagAttribute
123 public void setOnload(String onload) {
124 this.onload = onload;
125 }
126
127 /**
128 * A script function which is invoked during onUnload Handler on the client,
129 * if the action is a normal submit inside of Tobago.
130 */
131 @TagAttribute
132 public void setOnunload(String onunload) {
133 this.onunload = onunload;
134 }
135
136 /**
137 * A script function which is invoked during onUnload Handler on the client,
138 * when the unload is invoked to a non Tobago page.
139 * E.g. close-button, back-button, entering new url, etc.
140 */
141 @TagAttribute
142 public void setOnexit(String onexit) {
143 this.onexit = onexit;
144 }
145
146 /**
147 * A script function which is invoked on client just before submitting the action.
148 * This should be a single function call. If the result is typeof 'boolean' and false
149 * the further processing is canceled and the page is not submitted.
150 */
151 @TagAttribute
152 public void setOnsubmit(String onsubmit) {
153 this.onsubmit = onsubmit;
154 }
155 }
156