Package railo.runtime.tag

Source Code of railo.runtime.tag.Invoke

package railo.runtime.tag;

import railo.commons.lang.StringUtil;
import railo.runtime.PageContext;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.PageException;
import railo.runtime.ext.tag.BodyTagImpl;
import railo.runtime.ext.tag.DynamicAttributes;
import railo.runtime.net.proxy.ProxyData;
import railo.runtime.net.proxy.ProxyDataImpl;
import railo.runtime.net.rpc.client.RPCClient;
import railo.runtime.op.Caster;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.UDF;

/*
* FUTURE tag invoke
* Attributes: servicePort,timeout
* */


/**
* Invokes component methods from within a page or component.
*       You use this tag to reference a WSDL file and consume a web service from within a block of CFML code.
*
*
*
**/
public final class Invoke  extends BodyTagImpl implements DynamicAttributes {

  private Struct data=new StructImpl(StructImpl.TYPE_LINKED);
  //private Map attributes = new HashTable();
  //private HashSet keys = new HashSet();
 
  private boolean hasBody;
 
  private Object component;
  private String method;
  private String returnvariable;
  private String username;
  private String password;
  private String webservice;
  private int timeout=-1;
  private String serviceport;
  private ProxyData proxy=new ProxyDataImpl();


  @Override
  public void release()  {
    super.release();
    data.clear();
    component=null;
    method=null;
    returnvariable=null;
    username=null;
    password=null;
    webservice=null;
    timeout=-1;
    serviceport=null;
    proxy.release();
  }


  /**
   * @param component the component to set
   */
  public void setComponent(Object component) {
    this.component = component;
  }


  /**
   * @param method the method to set
   */
  public void setMethod(String method) {
    this.method = method;
  }


  /**
   * @param password the password to set
   */
  public void setPassword(String password) {
    this.password = password;
  }

  /**
   * @param proxyserver the proxyserver to set
   */
  public void setProxyserver(String proxyserver) {
    proxy.setServer(proxyserver);
  }

  /**
   * @param proxyport the proxyport to set
   */
  public void setProxyport(double proxyport) {
    proxy.setPort((int)proxyport);
  }

  /**
   * @param proxyuser the proxyuser to set
   */
  public void setProxyuser(String proxyuser) {
    proxy.setUsername(proxyuser);
  }

  /**
   * @param proxypassword the proxypassword to set
   */
  public void setProxypassword(String proxypassword) {
    proxy.setPassword(proxypassword);
  }

  /**
   * @param returnvariable the returnvariable to set
   */
  public void setReturnvariable(String returnvariable) {
    this.returnvariable = returnvariable.trim();
  }


  /**
   * @param serviceport the serviceport to set
   */
  public void setServiceport(String serviceport) {
    this.serviceport = serviceport;
  }


  /**
   * @param timeout the timeout to set
   */
  public void setTimeout(double timeout) {
    this.timeout = (int) timeout;
  }


  /**
   * @param username the username to set
   */
  public void setUsername(String username) {
    this.username = username;
  }


  /**
   * @param webservice the webservice to set
   */
  public void setWebservice(String webservice) {
    this.webservice = webservice.trim();
  }
 
  @Override
  public void setDynamicAttribute(String uri, String localName, Object value) {
    setDynamicAttribute(uri, KeyImpl.init(localName), value);
  }
 
  @Override
  public void setDynamicAttribute(String uri, railo.runtime.type.Collection.Key localName, Object value) {
    data.setEL(localName, value);
  }


  @Override
  public int doStartTag() throws PageException  {
      return EVAL_BODY_INCLUDE;
  }

  @Override
  public int doEndTag() throws PageException  {
    // CFC
    if(component!=null){
      doComponent(component);
    }
    // Webservice
    else if(!StringUtil.isEmpty(webservice)){
      doWebService(webservice);
    }
    // call active cfc or component
    else {
            doFunction(pageContext);
        }
    return EVAL_PAGE;
  }



  /**
   * @param oComponent
   * @throws PageException
   */
  private void doComponent(Object oComponent) throws PageException {
    railo.runtime.Component component=null;
    if(oComponent instanceof railo.runtime.Component)
      component=(railo.runtime.Component)oComponent;
    else
      component=pageContext.loadComponent(Caster.toString(oComponent));
     
    // execute
    Object rtn=component.callWithNamedValues(pageContext,method,data);
   
    // return
    if(!StringUtil.isEmpty(returnvariable)) pageContext.setVariable(returnvariable,rtn);
  }
 
  private void doFunction(PageContext pc) throws PageException {
     
    // execute
    if(StringUtil.isEmpty(method,true))
      throw new ApplicationException("Attribute [method] for tag [invoke] is required in this context.");
   
    Object oUDF=pc.getVariable(method);
    if(!(oUDF instanceof UDF))throw new ApplicationException("there is no function with name "+method);
    Object rtn = ((UDF)oUDF).callWithNamedValues(pageContext, data, false);
   
   
    // return
    if(!StringUtil.isEmpty(returnvariable)) pageContext.setVariable(returnvariable,rtn);
  }

  /**
   * @param webservice
   * @throws PageException
   */
  private void doWebService(String webservice) throws PageException {
        if(username!=null)   {
            if(password==null)password = "";
        }
        ProxyData pd=StringUtil.isEmpty(proxy.getServer())?null:proxy;
        RPCClient ws = username!=null?new RPCClient(webservice,username,password,pd):new RPCClient(webservice,pd);
        Object rtn = ws.callWithNamedValues(pageContext,method,data);
       
        // return
        if(!StringUtil.isEmpty(returnvariable)) pageContext.setVariable(returnvariable,rtn);
       
        //throw new ApplicationException("type webservice is not yet implemented for tag invoke");
  }

  /**
   * @param name
   * @param value
   * @throws PageException
   */
  public void setArgument(String name,Object value) throws PageException {
    data.set(name,value);   
  }
 
  /**
   * sets if taf has a body or not
   * @param hasBody
   */
  public void hasBody(boolean hasBody) {
    this.hasBody=hasBody;
  }

}
TOP

Related Classes of railo.runtime.tag.Invoke

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.