001 package org.apache.myfaces.tobago.taglib.component; 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.apt.annotation.BodyContent; 021 import org.apache.myfaces.tobago.apt.annotation.Tag; 022 import org.apache.myfaces.tobago.apt.annotation.TagAttribute; 023 import org.apache.myfaces.tobago.component.ComponentUtil; 024 import org.apache.myfaces.tobago.component.UIPage; 025 026 import javax.faces.context.FacesContext; 027 import javax.servlet.jsp.JspException; 028 import javax.servlet.jsp.tagext.BodyTagSupport; 029 030 /* 031 * $Id: ScriptTag.java 578592 2007-09-23 18:51:32Z bommel $ 032 */ 033 034 /** 035 * This tag add client side script to the rendered page. 036 */ 037 @Tag(name = "script", bodyContent = BodyContent.JSP) 038 // @Tag(name="script", bodyContent=BodyContent.TAGDEPENDENT) 039 // @BodyContentDescription(contentType="javascript") 040 public class ScriptTag extends BodyTagSupport { 041 042 private static final long serialVersionUID = 3253751129824779272L; 043 044 private String file; 045 private String onload; 046 private String onunload; 047 private String onexit; 048 private String onsubmit; 049 050 @Override 051 public int doEndTag() throws JspException { 052 053 FacesContext facesContext = FacesContext.getCurrentInstance(); 054 UIPage page = ComponentUtil.findPage(facesContext); 055 if (page == null) { 056 throw new JspException("The ScriptTag cannot find UIPage. " 057 + "Check you have defined the ScriptTag inside of the PageTag!"); 058 } 059 060 if (file != null) { 061 page.getScriptFiles().add(ComponentUtil.getValueFromEl(file)); 062 } 063 if (onload != null) { 064 page.getOnloadScripts().add(ComponentUtil.getValueFromEl(onload)); 065 } 066 if (onunload != null) { 067 page.getOnunloadScripts().add(ComponentUtil.getValueFromEl(onunload)); 068 } 069 if (onexit != null) { 070 page.getOnexitScripts().add(ComponentUtil.getValueFromEl(onexit)); 071 } 072 if (onsubmit != null) { 073 page.getOnsubmitScripts().add(ComponentUtil.getValueFromEl(onsubmit)); 074 } 075 if (bodyContent != null) { 076 String script = bodyContent.getString(); 077 bodyContent.clearBody(); 078 page.getScriptBlocks().add(ComponentUtil.getValueFromEl(script)); 079 } 080 081 return EVAL_PAGE; 082 } 083 084 @Override 085 public int doStartTag() throws JspException { 086 return EVAL_BODY_BUFFERED; 087 } 088 089 @Override 090 public void release() { 091 super.release(); 092 file = null; 093 onload = null; 094 onunload = null; 095 onexit = null; 096 onsubmit = null; 097 } 098 099 public String getFile() { 100 return file; 101 } 102 103 104 /** 105 * Absolute url to script file or script name to lookup in tobago resource path 106 */ 107 @TagAttribute 108 public void setFile(String file) { 109 this.file = file; 110 } 111 112 public String getOnload() { 113 return onload; 114 } 115 116 117 /** 118 * A script function which is invoked during onLoad Handler on the client. 119 */ 120 @TagAttribute 121 public void setOnload(String onload) { 122 this.onload = onload; 123 } 124 125 /** 126 * A script function which is invoked during onUnload Handler on the client, 127 * if the action is a normal submit inside of Tobago. 128 */ 129 @TagAttribute 130 public void setOnunload(String onunload) { 131 this.onunload = onunload; 132 } 133 134 /** 135 * A script function which is invoked during onUnload Handler on the client, 136 * when the unload is invoked to a non Tobago page. 137 * E.g. close-button, back-button, entering new url, etc. 138 */ 139 @TagAttribute 140 public void setOnexit(String onexit) { 141 this.onexit = onexit; 142 } 143 144 /** 145 * A script function which is invoked on client just before submitting the action. 146 * This should be a single function call. If the result is typeof 'boolean' and false 147 * the further processing is canceled and the page is not submitted. 148 */ 149 @TagAttribute 150 public void setOnsubmit(String onsubmit) { 151 this.onsubmit = onsubmit; 152 } 153 } 154