webwork/src/main/webwork/view/taglib/vui AbstractVUITag.java,NONE,1.1 AudioTag.java,NONE,1.1 BrowserSupport.java,NONE,1.1 FieldTag.java,NONE,1.1 FilledTag.java,NONE,1.1 GrammarTag.java,NONE,1.1 LogTag.java,NONE,1.1 PromptTag.java,NONE,1.1

[email protected] Mon, 20 May 2002 22:27:01 -0700
Newsgroups gmane.comp.java.webwork.cvs
Message-ID <[email protected]>
Update of /cvsroot/webwork/webwork/src/main/webwork/view/taglib/vui
In directory usw-pr-cvs1:/tmp/cvs-serv11834/main/webwork/view/taglib/vui

Added Files:
	AbstractVUITag.java AudioTag.java BrowserSupport.java 
	FieldTag.java FilledTag.java GrammarTag.java LogTag.java 
	PromptTag.java 
Log Message:
-added support for VoiceXML JSP tags
-added support for SOAP JSP tags
-updated documentation

--- NEW FILE: AbstractVUITag.java ---
/*
 * WebWork, Web Application Framework
 *
 * Distributable under Apache license.
 * See terms of license at opensource.org
 */
package webwork.view.taglib.vui;

import org.apache.log4j.Category;
import webwork.config.Configuration;
import webwork.util.ContainUtil;
import webwork.view.taglib.IncludeTag;
import webwork.view.taglib.ParamTag;
import webwork.view.taglib.WebWorkBodyTagSupport;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;

/**
 * Abstract VUI tag
 *
 * @author Jeff Haynie ([email protected])
 * @version $Revision: 1.1 $
 */
public abstract class AbstractVUITag
      extends WebWorkBodyTagSupport
      implements ParamTag.Parametric {
   // Attributes ----------------------------------------------------
   private static Category log = Category.getInstance(AbstractVUITag.class);
   protected String themeAttr;
   protected String theme;
   protected String templateHeaderAttr;
   protected String templateFooterAttr;
   protected Map params = new HashMap();

   // Public --------------------------------------------------------

   public abstract String getHeaderTemplate();

   public abstract String getFooterTemplate();

   public String getTheme() {
      // If theme set is not explicitly given,
      // try to find attribute which states the theme set to use
      if ((theme == null) || (theme == "")) {
         theme = (String) pageContext.findAttribute("theme");
      }

      // Default template set
      if ((theme == null) || (theme == "")) {
         theme = Configuration.getString("webwork.ui.theme");
      }

      return theme;
   }

   public void setTheme(String aName) {
      themeAttr = aName;
   }

   public void setTemplateHeader(String aName) {
      templateHeaderAttr = aName;
   }

   public void setTemplateFooter(String aName) {
      templateFooterAttr = aName;
   }

   public void addParameter(String name, Object value) {
      addParameterInternal(name, value);
   }

   private void addParameterInternal(String name, Object value) {
      params.put(name, value);
   }

   public Map getParameters() {
      return params;
   }

   public boolean memberOf(Object obj1, Object obj2) {
      return ContainUtil.contains(obj1, obj2);
   }

   protected void getSetParameter(String a, String n)
   {
        if (a!=null)
        {
           Object value = findValue(a);
           if (value!=null)
           {
              addParameterInternal(n,value);
           }
        }
   }

   protected abstract void initializeAttributes();


   // FieldTag overrides ------------------------------------------
   public int doStartTag()
   {
      if (themeAttr != null)
         theme = (String) findValue(themeAttr);

      initializeAttributes();

      getStack().pushValue(this);
      try
      {
         // header
         String template = templateHeaderAttr;
         if (template == null)
            template = getHeaderTemplate();
         IncludeTag.include(getTemplateDirectory() + template, pageContext);
      }
      catch (Exception ex)
      {
         ex.printStackTrace();
         return SKIP_BODY;
      }
      finally
      {
         getStack().popValue();
      }

      return EVAL_BODY_INCLUDE;
   }
   public int doAfterBody() throws JspException {
      if (bodyContent != null) {
         try {
            JspWriter out =  getPreviousOut();
            out.print(bodyContent.getString());
            bodyContent.clearBody();
         } catch (Exception ex) {
            ex.printStackTrace();
            throw new JspTagException("Exception:: "+toString(ex));
         }
         return (EVAL_BODY_BUFFERED);
      }
      return (SKIP_BODY);
   }
   public int doEndTag()
         throws JspException
   {
      if (themeAttr != null)
         theme = (String) findValue(themeAttr);

      getStack().pushValue(this);
      try
      {
         // footer
         String template = templateFooterAttr;
         if (template == null)
            template = getFooterTemplate();

         IncludeTag.include(getTemplateDirectory() + template, pageContext);
      }
      catch (Exception ex)
      {
         ex.printStackTrace();
         throw new JspTagException("Exception including footer: "+toString(ex));
      }
      return EVAL_PAGE;
   }

   public void release() {
      super.release();
      getStack().popValue();
      params = new HashMap();
   }

   public String getBrowserUserAgent ()
   {
      HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
      String ua = request.getHeader("User-Agent");
      if (ua==null)
      {
         ua=request.getHeader("user-agent");
      }
      return (ua==null ? "": ua);
   }

   /**
    * get the template directory for a specific voice browser
    */
   protected String getTemplateDirectory ()
   {
      String ua = getBrowserUserAgent();
      return BrowserSupport.getBrowserTemplateDirectory(ua);
   }
   protected String constructURL (String value)
   {
      // this was taken from URLTag
      HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
      HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();
      StringBuffer link = new StringBuffer();

      if (value != null) {
         // Check if context path needs to be added
         // Add path to absolute links
         if (value.startsWith("/")) {
            link.append(request.getContextPath());
         }

         // Add page
         link.append(value);
      } else {
         // Go to "same page"
         String requestURI = (String) request.getAttribute("webwork.request_uri");
//         String contextPath=(String)request.getAttribute("webwork.context_path");
         if (requestURI == null) requestURI = request.getRequestURI();
//         if(contextPath==null) contextPath=request.getContextPath();
         link.append(requestURI);
      }

      String result;
      try {
         //Category.getInstance(this.getClass().getName()).debug(link.toString());
         result = response.encodeURL(link.toString());
      } catch (Exception e) {
         // Could not encode URL for some reason
         // Use it unchanged
         result = link.toString();
      }
      return result;

   }


}

--- NEW FILE: AudioTag.java ---
/*
 * WebWork, Web Application Framework
 *
 * Distributable under Apache license.
 * See terms of license at opensource.org
 */
package webwork.view.taglib.vui;

import org.apache.log4j.Category;
import webwork.config.Configuration;
import webwork.util.ContainUtil;
import webwork.view.taglib.IncludeTag;
import webwork.view.taglib.ParamTag;
import webwork.view.taglib.WebWorkBodyTagSupport;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;

/**
 * Voice UI for grammar tag
 *
 * @author Jeff Haynie ([email protected])
 * @version $Revision: 1.1 $
 */
public class AudioTag
      extends AbstractVUITag
{
   // Attributes ----------------------------------------------------
   protected static Category log = Category.getInstance(AudioTag.class);
   protected String srcAttr;
   protected String exprAttr;
   protected String ttsAttr;
   protected String personaAttr;
   protected String fetchhintAttr;
   protected String fetchtimeoutAttr;
   protected String maxageAttr;
   protected String maxstaleAttr;

   // Public --------------------------------------------------------

   public String getHeaderTemplate() {
      return "audio-header.jsp";
   }

   public String getFooterTemplate() {
      return "audio-footer.jsp";
   }

   public void setSrc(String aName) {
      srcAttr = aName;
   }
   public String getSrc ()
   {
      return srcAttr;
   }
   public void setTts(String aName) {
      ttsAttr = aName;
   }
   public String getTts ()
   {
      return ttsAttr;
   }
   public void setPersona(String aName) {
      personaAttr = aName;
   }
   public String getPersona ()
   {
      return personaAttr;
   }
   public void setExpr(String aName) {
      exprAttr = aName;
   }
   public String getExpr ()
   {
      return exprAttr;
   }
   public void setFetchhint(String aName) {
      fetchhintAttr = aName;
   }
   public String getFetchhint ()
   {
      return fetchhintAttr;
   }
   public void setFetchtimeout(String aName) {
      fetchtimeoutAttr = aName;
   }
   public String getFetchtimeout ()
   {
      return fetchtimeoutAttr;
   }
   public void setMaxage(String aName) {
      maxageAttr = aName;
   }
   public String getMaxage ()
   {
      return maxageAttr;
   }
   public void setMaxstale (String aName) {
      maxstaleAttr = aName;
   }
   public String getMaxstale()
   {
      return maxstaleAttr;
   }


   protected void initializeAttributes()
   {
      getSetParameter(srcAttr,"src");
      getSetParameter(exprAttr,"expr");
      getSetParameter(ttsAttr,"tts");
      getSetParameter(personaAttr,"persona");
      getSetParameter(fetchhintAttr,"fetchhint");
      getSetParameter(fetchtimeoutAttr,"fetchtimeout");
      getSetParameter(maxageAttr,"maxage");
      getSetParameter(maxstaleAttr,"maxstale");
   }
}

--- NEW FILE: BrowserSupport.java ---
/*
 * WebWork, Web Application Framework
 *
 * Distributable under Apache license.
 * See terms of license at opensource.org
 */
package webwork.view.taglib.vui;

import java.io.InputStream;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.Collections;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.apache.log4j.Category;

/**
 * Utility class for handling multiple types of voice browsers
 *
 * @author Jeff Haynie ([email protected])
 * @version $Revision: 1.1 $
 */
public final class BrowserSupport
{
   static Category log = Category.getInstance(BrowserSupport.class);

   static Properties properties;
   static Map browserMap = Collections.synchronizedMap(new HashMap(2));
   static List browserMatch = Collections.synchronizedList(new ArrayList(2));

   static
   {
      InputStream in = null;
      Properties p = new Properties();

      try
      {
          in = Thread.currentThread().getContextClassLoader().getResourceAsStream("/vxml.properties");
          if ( in!=null )
          {
             p.load(in);
             loadBrowserInfo(p);
          }
      }
      catch (Exception ex)
      {
         ex.printStackTrace();
      }
      finally
      {
          if (in!=null)
          {
            try
            {
               in.close();
            }
            catch (Exception ignore){}
            in=null;
          }
      }
   }
   static final class Match
   {
      String match;
      String userAgent;
      String templateDirectory;
   }
   /**
    * add a browser match pattern to use when trying to match a user-agent if the
    * exact user agent string is specified. the uaString can contain a
    * wildcard, such as <tt>VocalOS/*</tt> which will match up to <tt>VocalOS/</tt>
    */
   public static void addBrowserMatch (String uaString, String templateDir)
   {
      int w = uaString.indexOf("*");
      Match m = new Match();
      m.userAgent=uaString;
      if ( w>0 )
      {
         m.match = uaString.substring(0,w);
      }
      else
      {
         m.match = null; // * - all/default
      }
      m.templateDirectory=templateDir;
      if (log.isDebugEnabled())
      {
         log.debug("Loading useragent match: "+m.match+" ["+uaString+"] directory: "+templateDir);
      }
      browserMatch.add(m);
   }
   /**
    * load browser settings from properties file
    */
   public static void loadBrowserInfo (Properties p)
   {
      properties = p;

      String browsers = p.getProperty("browsers");
      if ( browsers!=null )
      {
         StringTokenizer tok=new StringTokenizer(browsers,",");
         while (tok.hasMoreTokens())
         {
            String token=tok.nextToken();
            String ua = p.getProperty(token+".useragent");
            if ( ua!=null )
            {
                String template = p.getProperty(token+".templatedirectory");
                if ( template!=null )
                {
                   if (log.isDebugEnabled())
                   {
                      log.debug("Loading useragent: "+token+" ["+ua+"] directory: "+template);
                   }
                   browserMap.put(ua,template);
                   if ( ua.indexOf("*")>-1 )
                   {
                      addBrowserMatch(ua,template);
                   }
                }
            }
         }
      }
   }
   /**
    * for a given user agent, return a near match if any
    */
   public static String getTemplateDirectoryFromMatch (String userAgent)
   {
      Iterator i = browserMatch.iterator();
      Match dm = null;
      while (i.hasNext())
      {
         Match m=(Match)i.next();
         if (m.match==null)
         {
            dm=m; // default
            continue;
         }
         if ( userAgent.startsWith(m.match) )
         {
            return m.templateDirectory;
         }
      }
      return (dm==null ? null : dm.templateDirectory);
   }
   /**
    * for a given user agent, return a vxml browser template directory
    */
   public static String getBrowserTemplateDirectory (String userAgent)
   {
      String tempDir = (String)browserMap.get(userAgent);
      if ( tempDir==null )
      {
          tempDir = getTemplateDirectoryFromMatch (userAgent);
          if ( tempDir==null )
          {
          }
      }
      return (tempDir==null ? "/template/standard/vxml/" : tempDir);
   }
}
--- NEW FILE: FieldTag.java ---
/*
 * WebWork, Web Application Framework
 *
 * Distributable under Apache license.
 * See terms of license at opensource.org
 */
package webwork.view.taglib.vui;

import org.apache.log4j.Category;
import webwork.config.Configuration;
import webwork.util.ContainUtil;
import webwork.view.taglib.IncludeTag;
import webwork.view.taglib.ParamTag;
import webwork.view.taglib.WebWorkBodyTagSupport;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;

/**
 * Voice UI for field tag
 *
 * @author Jeff Haynie ([email protected])
 * @version $Revision: 1.1 $
 */
public class FieldTag
      extends AbstractVUITag
{
   // Attributes ----------------------------------------------------
   protected static Category log = Category.getInstance(FieldTag.class);
   protected String nameAttr;
   protected String slotAttr;
   protected String modalAttr;
   protected String condAttr;
   protected String typeAttr;

   // Public --------------------------------------------------------

   public String getHeaderTemplate() {
      return "field-header.jsp";
   }

   public String getFooterTemplate() {
      return "field-footer.jsp";
   }

   public void setName(String aName) {
      nameAttr = aName;
   }

   public void setModal (String aName)
   {
      modalAttr = aName;
   }
   public String getModal ()
   {
      return modalAttr;
   }

   public void setSlot (String aName)
   {
      slotAttr = aName;
   }
   public String getSlot ()
   {
      return slotAttr;
   }

   public void setCond (String aName)
   {
      condAttr = aName;
   }
   public String getCond ()
   {
      return condAttr;
   }

   public void setType (String aName)
   {
      typeAttr = aName;
   }
   public String getType ()
   {
      return typeAttr;
   }

   protected void initializeAttributes()
   {
      getSetParameter(nameAttr,"name");
      getSetParameter(condAttr,"cond");
      getSetParameter(modalAttr,"modal");
      getSetParameter(slotAttr,"slot");
      getSetParameter(typeAttr,"type");
   }
}

--- NEW FILE: FilledTag.java ---
/*
 * WebWork, Web Application Framework
 *
 * Distributable under Apache license.
 * See terms of license at opensource.org
 */
package webwork.view.taglib.vui;

import org.apache.log4j.Category;
import webwork.config.Configuration;
import webwork.util.ContainUtil;
import webwork.view.taglib.IncludeTag;
import webwork.view.taglib.ParamTag;
import webwork.view.taglib.WebWorkBodyTagSupport;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;

/**
 * Voice UI for filled tag
 *
 * @author Jeff Haynie ([email protected])
 * @version $Revision: 1.1 $
 */
public class FilledTag
      extends AbstractVUITag
{
   // Attributes ----------------------------------------------------
   protected static Category log = Category.getInstance(FilledTag.class);
   protected String actionAttr;
   protected String actionaudioAttr;
   protected String modeAttr;
   protected String namelistAttr;

   // Public --------------------------------------------------------

   public String getHeaderTemplate() {
      return "filled-header.jsp";
   }

   public String getFooterTemplate() {
      return "filled-footer.jsp";
   }

   public void setAction(String aName) {
      actionAttr = aName;
   }
   public String getAction ()
   {
      return actionAttr;
   }
   public void setActionaudio(String aName) {
      actionaudioAttr = aName;
   }
   public String getActionaudio ()
   {
      return actionaudioAttr;
   }
   public void setMode(String aName) {
      modeAttr = aName;
   }
   public String getMode ()
   {
      return modeAttr;
   }
   public void setNamelist (String aName) {
      namelistAttr = aName;
   }
   public String getNamelist ()
   {
      return namelistAttr;
   }
   protected void initializeAttributes()
   {
      String url = (actionAttr!=null ? constructURL((String)findValue(actionAttr)) : null);
      if (url!=null)
      {
         addParameter("action",url);
         url = (actionaudioAttr!=null ? constructURL((String)findValue(actionaudioAttr)) : null);
         if (url!=null)
         {
            addParameter("actionaudio",url);
         }
      }
      getSetParameter(namelistAttr,"namelist");
      getSetParameter(modeAttr,"mode");
   }
}

--- NEW FILE: GrammarTag.java ---
/*
 * WebWork, Web Application Framework
 *
 * Distributable under Apache license.
 * See terms of license at opensource.org
 */
package webwork.view.taglib.vui;

import org.apache.log4j.Category;
import webwork.config.Configuration;
import webwork.util.ContainUtil;
import webwork.view.taglib.IncludeTag;
import webwork.view.taglib.ParamTag;
import webwork.view.taglib.WebWorkBodyTagSupport;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;

/**
 * Voice UI for grammar tag
 *
 * @author Jeff Haynie ([email protected])
 * @version $Revision: 1.1 $
 */
public class GrammarTag
      extends AbstractVUITag
{
   // Attributes ----------------------------------------------------
   protected static Category log = Category.getInstance(GrammarTag.class);
   protected String nameAttr;
   protected String langAttr;
   protected String modelAttr;
   protected String modeAttr;
   protected String weightAttr;

   // Public --------------------------------------------------------

   public String getHeaderTemplate() {
      return "grammar-header.jsp";
   }

   public String getFooterTemplate() {
      return "grammar-footer.jsp";
   }

   public void setName(String aName) {
      nameAttr = aName;
   }
   public String getName ()
   {
      return nameAttr;
   }
   public void setLang(String aName) {
      langAttr = aName;
   }
   public String getLang ()
   {
      return langAttr;
   }
   public void setModel(String aName) {
      modelAttr = aName;
   }
   public String getModel ()
   {
      return modelAttr;
   }
   public void setMode(String aName) {
      modeAttr = aName;
   }
   public String getMode ()
   {
      return modeAttr;
   }
   public void setWeight(String aName) {
      weightAttr = aName;
   }
   public String getWeight ()
   {
      return weightAttr;
   }
   protected void initializeAttributes()
   {
      getSetParameter(nameAttr,"name");
      getSetParameter(langAttr,"lang");
      getSetParameter(modelAttr,"model");
      getSetParameter(modeAttr,"mode");
      getSetParameter(weightAttr,"weight");
   }
}

--- NEW FILE: LogTag.java ---
/*
 * WebWork, Web Application Framework
 *
 * Distributable under Apache license.
 * See terms of license at opensource.org
 */
package webwork.view.taglib.vui;

import org.apache.log4j.Category;
import webwork.config.Configuration;
import webwork.util.ContainUtil;
import webwork.view.taglib.IncludeTag;
import webwork.view.taglib.ParamTag;
import webwork.view.taglib.WebWorkBodyTagSupport;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;

/**
 * Voice UI for log tag
 *
 * @author Jeff Haynie ([email protected])
 * @version $Revision: 1.1 $
 */
public class LogTag
      extends AbstractVUITag
{
   // Attributes ----------------------------------------------------
   protected static Category log = Category.getInstance(LogTag.class);
   protected String labelAttr;
   protected String exprAttr;

   // Public --------------------------------------------------------

   public String getHeaderTemplate() {
      return "log-header.jsp";
   }

   public String getFooterTemplate() {
      return "log-footer.jsp";
   }

   public void setLabel(String aName) {
      labelAttr = aName;
   }
   public String getLabel ()
   {
      return labelAttr;
   }

   public void setExpr(String aName) {
      exprAttr = aName;
   }
   public String getExpr ()
   {
      return exprAttr;
   }

   protected void initializeAttributes()
   {
      getSetParameter(labelAttr,"label");
      getSetParameter(exprAttr,"expr");
   }
}

--- NEW FILE: PromptTag.java ---
/*
 * WebWork, Web Application Framework
 *
 * Distributable under Apache license.
 * See terms of license at opensource.org
 */
package webwork.view.taglib.vui;

import org.apache.log4j.Category;
import webwork.config.Configuration;
import webwork.util.ContainUtil;
import webwork.view.taglib.IncludeTag;
import webwork.view.taglib.ParamTag;
import webwork.view.taglib.WebWorkBodyTagSupport;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import java.util.HashMap;
import java.util.Map;
import java.io.IOException;

/**
 * Voice UI for prompt tag
 *
 * @author Jeff Haynie ([email protected])
 * @version $Revision: 1.1 $
 */
public class PromptTag
      extends AbstractVUITag
{
   // Attributes ----------------------------------------------------
   protected static Category log = Category.getInstance(PromptTag.class);
   protected String bargeinAttr;
   protected String timeoutAttr;
   protected String langAttr;
   protected String condAttr;

   // Public --------------------------------------------------------

   public String getHeaderTemplate() {
      return "prompt-header.jsp";
   }

   public String getFooterTemplate() {
      return "prompt-footer.jsp";
   }

   public void setBargein(String aName) {
      bargeinAttr = aName;
   }
   public String getBargein ()
   {
      return bargeinAttr;
   }

   public void setTimeout(String aName) {
      timeoutAttr = aName;
   }
   public String getTimeout ()
   {
      return timeoutAttr;
   }

   public void setLang(String aName) {
      langAttr = aName;
   }
   public String getLang ()
   {
      return langAttr;
   }

   public void setCond(String aName) {
      condAttr = aName;
   }
   public String getCond ()
   {
      return condAttr;
   }

   protected void initializeAttributes()
   {
      getSetParameter(bargeinAttr,"bargein");
      getSetParameter(timeoutAttr,"timeout");
      getSetParameter(langAttr,"lang");
      getSetParameter(condAttr,"cond");
   }
}



_______________________________________________________________

Don't miss the 2002 Sprint PCS Application Developer's Conference
August 25-28 in Las Vegas -- http://devcon.sprintpcs.com/adp/index.cfm