Hook Method for a view !

Hi,
I just want to know as to how many times hook methods [ initView, modifyView ] of a view are called if I have a following scenario -
Say I have 2 links in View1. Based on the linked selected, my right side view contents should change. I want to use a single view on the right cell of the viewset. I'm changing the visibility of transparent containers contained in that view. Each container has UI elements based on the link selected in left cell view i.e view1.
In this case i have to fire multiple outbound plugs from view1 so, after the 1st time the view2 is displayed, is the initView2() called for second time on firing the outbound plug from view1 again.
Please tell me the sequence & no. of times hook methods of view2 are called.
Thanks,
Prasanna

Hi,
When ever u call the out fire plug if it goes to next view then it will take initialize  hook methods every time when ever u call your outbound plug.
When ever you call link it will call the hooks methods automatically.
U mean to say you have create the links in first view to pass them second view but u can go only one action one time ony when ever u go over there the hook mathods activated.
Thanks,
Lohi.

Similar Messages

  • Hook methods in component controller vs hook methods in view controller

    Hi,
    I want to know how WDDoInit in component controller differs from the same in view controller.
    How the lifecycle flows in both controllers?
    Eg. if i create a method intialize() in both component  & view controllers and if i called initalize method in view, which one will be called?
    Need to know how the flow works.
    Regards,
    Manoj

    Dear Manoj,
    Please check if it is helpful.
    The order of execution of standard hook methods when a WDJ application is called the first time is as follows:
    1. Component Controller DoInIt()
    2. View Controller DoInIt()
    3. Interface Window Controller
    4. Component Controller DoBeforeNavigation()
    5. Component Controller DoModify()
    6. Component Controller DoPostProcessing()
    After this, if you navigate to some other view, then the order of execution of methods of that New view will be:
    1. Component Controller DoBeforeNavigation()
    2. New View DoInIt()
    3. New View onPlugfromFirstView
    4. Component Controller DoModify()
    5. Component Controller DoPostProcessing()
    Then, if you again navigate back to the first view, then the order of execution of methods is:
    1. Component Controller DoBeforeNavigation()
    2. New View onPlugfromNewView
    3. Component Controller DoModify()
    4. Component Controller DoPostProcessing()
    Webdynpro - Sequence of Execution
    Thanks & Regards,
    Patralekha

  • Line Level DFF for a quote using user hook method

    Hi ALL,
    My requirement is to set default value in line level DFF for a quote using user hook method, so please suggest me how to achive this, i have checked the API "ASO_QUOTE_CUHK.update_quote_pre " but not successed please suggest.
    Thanks

    Hi Dipanjan,
    Thanks for reply, do u have any idea how to achieve thsi through user hooks or any APIs so that i can place the default value to the corresponding DFF field.
    Thanks
    Edited by: user13424229 on Jan 22, 2012 11:52 PM

  • Methods of a view

    Hi experts ,
    please explain the use of following methods,i mean what these methods are meant for:
    1. WDDOINIT
    2. WDDOMODIFYVIEW
    3. WDDOEXIT
    4. WDDOBEFOREACTION 
    Thanks,
    Sushant

    Hi,
      WDDOINIT  ->Hook method called to initialize controller
      WDDOMODIFYVIEW -> Hook method called to modify a view just before rendering.    *
       This method conceptually belongs to the view itself, not to the
        controller (cf. MVC pattern).
        It is made static to discourage a way of programming that
        routinely stores references to UI elements in instance fields
        for access by the view controller's event handlers, and so on.
        The Web Dynpro programming model recommends that UI elements can
        only be accessed by code executed within the call to this hook method. <p>
        wdThis Generated private interface of the view's controller, as
               provided by Web Dynpro. Provides access to the view controller's
               outgoing controller usages, etc.
       wdContext Generated interface of the view's context, as provided
               by Web Dynpro. Provides access to the view's data.
        view The view's generic API, as provided by Web Dynpro.
               Provides access to UI elements.
       firstTime Indicates whether the hook is called for the first time
               during the lifetime of the view.
    WDDOEXIT->Hook method called to clean up controller.
    WDDOBEFOREACTION->Hook method called for additional validation of user input.
       validation Interface for reporting validation errors
    Regards
    Ayyapparaj

  • Oracle.jbo.AttrValException: JBO-27019: Get method for attribute

    Hi Guys,
    I am trying to add a new column to Oracle quoting.It has already been customized by some consultant few years back. I followed the note 392728.1 on metalink and also have the documentation by the previous consultant but getting the error oracle.jbo.AttrValException: JBO-27019: Get method for attribute Draft in HeaderVO could not be resolved after adding my column, when I try to print the quote.
    Here are the steps I took
    1) added a column to the query (at the end) in HeaderVO.xml
    2) added the below code in the HeaderVO.xml
    <ViewAttribute
    Name="DRAFT"
    IsQueriable="false"
    IsPersistent="false"
    Precision="100"
    Type="java.lang.String"
    AliasName="DRAFT"
    ColumnType="VARCHAR2"
    Expression="DRAFT"
    SQLType="VARCHAR" >
    <DesignTime>
    <Attr Name="_DisplaySize" Value="100" />
    </DesignTime>
    </ViewAttribute>
    3). Modify HeaderVORowImpl.java file to add setters and getters for the newly added view attribute. For example,
    a) case 67: //
    setDRAFT((String)obj);
    return;
    b) case 67:
    return getDRAFT();
    c) ublic void setDRAFT(String s)
    setAttributeInternal(67, s);
    public String getDRAFT()
    return (String)getAttributeInternal(67);
    d) protected static final int DRAFT = 67;
    Everything is dont exactly as per the manual but not sure why I am getting this issue. Any help will be appreciated.

    a) case 67: //
    setDraft((String)obj);
    return;
    b) case 67:
    return getDraft();
    c)public void setDraft(String s){
    setAttributeInternal(67, s);
    public String getDraft(){
    return (String)getAttributeInternal(67);
    d) protected static final int DRAFT = 67;
    can u change it as explained above.. setDRAFT should be setDraft.. and getDRAFT should be getDraft..
    and make sure that the index.. number is exactly matching with the attribute order in the VO

  • Action reference in the MAIN view for other Views

    Hi Experts,
    I have created a view(MAIN) that contains SUBMIT button and also included four other views(Using ViewContainerUIElement) in the MAIN view itslef. So am calling the respective view based on some certain condition from MAIN view.
    Now my problem is, am using  check_mandatory_attr_on_view() method which is being called on SUBMIT action from MAIN view of WDDOBEFOREACTION. But it is not checking Required Fields from other views. It checks the Required Fields only in the MAIN view.
    I know that I want to call the reference of other views in MAIN view, but how can I do it?
    Please help me, as how I can check the Required fields on action of SUBMIT button in MAIN view for other views.
    BR,
    RAM.

    Hi,
    Though am in MAIN view, If i clicks the submit button it checks the Required fields on both MAIN and Sub views, where still I have not called the Sub view.
    If you didn't call the sub view, the WDDOINIT method of your sub view wouldn't have been triggered and so the sub view reference is not set in the component controller, isn't it.?
    OR you are calling sub view separately in the initial state and get the reference and then in your MAIN view calling the sub view based on condition in the View Container UI..?
    If so, create an attribute in your Main view (say sub_view_name of type string) and then use the below code to get the current sub view name and then pass the corresponding sub view reference:
    DATA:lr_view_controller    type ref to        IF_WD_VIEW_CONTROLLER,
           lr_main_view_usage  type ref to        IF_WD_RR_VIEW_USAGE.
           lr_vc_assignment      type ref to        IF_WD_RR_VIEW_CNT_ASSIGNMENT.
           lr_view_usage           type ref to        IF_WD_RR_VIEW_USAGE.
           lr_t_views                 type                WDRR_VCA_OBJECTS.
           lr_s_view                  like line of        lr_t_views.
           lr_view                     type ref to        if_wd_rr_view.    
          lr_view_controller = wd_this->wd_get_api( ).
        lr_main_view_usage = lr_view_controller->GET_VIEW_USAGE( ).
       lr_t_views  = lr_main_view_usage->GET_VIEW_CNT_ASSIGNMENTS( ). "This will return all the View Container assignments.
    * Now loop over all the View containers and get the reference of embedding view.
       loop at lr_t_views  into lr_s_view .
          lr_vc_assignment = lr_s_view-VIEW_CNT_ASSIGNMENT.
          lr_view_usage  = lr_vc_assignment->GET_DEFAULT_VIEW_USAGE( ). " This will return view usage reference
          lr_view = lr_view_usage->get_view( ). " This will have the meta info of view
          wd_this->sub_view_name = lr_view->get_name( ).   
       endloop.
    Now in onAction submit,
    CL_WD_DYNAMIC_TOOL=>CHECK_MANDATORY_ATTR_ON_VIEW(
                                  EXPORTING
                                   view_controller =  lr_view_controller " MAin view reference
    case wd_this->sub_view_name.
    when 'SUB_VIEW1'.
    CL_WD_DYNAMIC_TOOL=>CHECK_MANDATORY_ATTR_ON_VIEW(
                                  EXPORTING
                                   view_controller = wd_comp_controller->gr_emb_view1.
    when 'SUB_VIEW2'.
    CL_WD_DYNAMIC_TOOL=>CHECK_MANDATORY_ATTR_ON_VIEW(
                                  EXPORTING
                                   view_controller = wd_comp_controller->gr_emb_view2.
    Or, alternatively; create all the nodes(of sub views) in component controller, then map all those to MAIN view, then read the required node attributes and validate manually.
    hope this helps u,
    Regards,
    Kiran

  • Can a web service be used as the datasource for a View Object?

    Has anyone used a web service as the datasource for a View Object?
    I am trying to do the same thing as "Publishing BC4J Components as a Web Service" example, except I want to recreate the View Objects on the client so that I can iterate through them and display them on a web page.
    I probably have two choices:
    1. Use the web service as the datasource.
    2. Use a file as the datasource with no data and then populate the View Objects from the XML from the Web Service.
    Please advise.
    Thank you.
    Richard Catlin
    SAIC

    You can adapt the examples provided in the BC4J Toy Store demo for how to build a programmatically-populated view object to create a view object that fetches its data from a web service.
    The methods that you need to override are the same for any kind of programmatically-populated view object.

  • Calling a method in the view controller from the component controller

    Hi
    Is there anyway to call a method in the view implementation from the component controller??
    Thanks
    jack

    Thanks for all your replies. I want this kind of a functionality because Im trying to invove a DC (Child DC) from a Parent DC such that the Child DC's view is displayed onto the view container of the Parent DC. I have embedded using 'interface view of a component instance' in the Parent Window and am able to create the component and set usage though the onPlugDefault of the Child View.
    But I observe that when i make a call from the parent, the flow is like this:
    1. The wdDoInit of the Child Component Controller gets triggered first.
    2. Then the wdDoInit of the Child's <b>VIEW</b> gets triggered
    3. and <b>THEN</b> the onPlugDefault of the Child Component Interface View
    What I had actually wanted was to Fire onPlugDefault where Im calling a method LoadData(), after which the Child DC's view must be triggered so it can display the fetched data.
    What is actually happening is the view gets displayed, but no data is displayed in the view.
    Right now I have just given a work around where Im triggering <b>LoadData()</b> of the <b>COmponent COntroller</b> from the <b>wdDoInit</b> of the <b>VIEW</b>.
    Is there a better way to do this? I find it strange that I have to load the Data from the view.
    Thanks
    Jack

  • "Refresh after" insert fails for DB-View with INSTEAD OF Triggers

    Hi,
    I have a database view with INSTEAD OF triggers defined for INSERT, UPDATE, DELETE.
    For some EO attributes the refresh after insert and update is defined.
    Posting to database fails.
    According to Database 9.2 Manual and a previous thread (BC4J and Updatable Views the RETURNING clause is not allowed for database views with INSTEAD OF triggers.
    Is there a workaround so the refresh after is done, but without the RETURNING feature?
    I only need to refresh some values. The PK i can set in the create method of the EO so refresh via a additional SELECT would be possible.
    If not Feature Request:
    Add the possibility to do the "refresh after ..." with a 2nd SELECT using the PK instead of using the RETURNING clause.
    Of course then it is not possible to set the PK in the database trigger. PK has to be set in the create method of the EO.
    Thanks,
    Markus
    GEMS IT

    Hi Markus,
    Turning on the stack trace (-Djbo.debugout put=Console - in the Project/runner) did help and I should have done it sooner. Turns out that when I constructed my EO based upon a database view - I should have left out the PKs of the base tables.
    In my case, I am using an "Instead Of Trigger" to populate a multi-table arrangement (parent - child - grandChild - greatGrandChild relationship) where all base tables are using dbSequence/dbTriggers.
    Final analysis - I would like to see BC4J handle this situation. I do not want to use View-Links and I should * not * have to resort to stored procedures and BC4J/doDML. If I construct a DB View this is participating in an parent - child - grandChild - greatGrandChild relationship that are using dbSequence/dbTriggers, then BC4J should be smart enough to construct VO knowing that I want to do insert, update, delete, selects - based upon this structure.
    Thanks Markus,
    Bill G...

  • How to handle the button "cancel" in a dialog box for displaying views?

    Hello!
    I ve a question about handling the cancel button in a dialog box for displaying views.
    I ve already implemented the dialog box by using the following code:
    METHOD eh_onnewqact.
      DATA stitle TYPE string.
      IF m_popup IS BOUND.
        stitle = cl_bsp_runtime=>get_otr_text( alias = 'ZCC_ICRM/NEW_TASK' )."cl_wd_utilities=>get_otr_text_by_alias( 'ZCC_ICRM/NEW_TASK' ).
        m_popup = comp_controller->window_manager->create_popup(
          iv_interface_view_name = 'ZCC_POPUP_NEWBT/NewQActWindow'
          iv_usage_name = 'CUNewQAct'
          iv_title = stitle
        CALL METHOD m_popup->set_on_close_event
          EXPORTING
            iv_view       = me
            iv_event_name = 'NEWQACT_POPUP_CLOSED'.
      ENDIF.
      m_popup->open( ).
    ENDMETHOD.
    My dialog box consists two buttons - cancel and create.
    The cancel buttons should close the popup and the create button should create an entity of a specified object. but let us come to the cancel button. I did´nt find any information about implementing an cancel button. So, how should I implement it? I thougt
    me->close( ). But that didnt works!
    Could u give me further information about that, because my cancel event-handler is empty?
    method EH_ONCANCEL_QACT.
    endmethod.
    After that I would know how my calling view could know that the user pushes the Create Button and how the data of 2 inputfields of the dialog box finds their way to the calling view in order to process this data there?
    Thank you very much!

    Hi Michael,
    thank you for your advice! This problem is solved...
    ...but I have another issue. Ive implemented 2 editable fields in my popup. The user should fill that fields with context and that context should be processed in the calling view of my popup.
    My question is how to transfer these information from my popup to my calling view or method?
    I tried the following...
          lv_context_node ?= m_popup->get_context_node( 'QUICKACT' ).
          IF lv_context_node IS NOT INITIAL.
            lv_text = lv_context_node->get_date( attribute_path = '' ).
          ENDIF.
    But it doesnt work! The context node object is always empty/initial.
    Thank you!
    PS: Another possibility could be that the object / node of the calling view is transferred to the pop-up in order to process it there.
    Edited by: Marcus Findeisen on Feb 22, 2011 12:13 PM

  • **URGENT** No getter method for property searchText of bean org.apache.stru

    I'm implementing a query page as described in the HowTo ADF_ComplexMasterDetail.zip
    When running the query page, I'm receiving the error:
    javax.servlet.jsp.JspException: No getter method for property searchText of bean org.apache.struts.taglib.html.BEAN
    I have my searchEmployees writen and 'exposed' (at least I can see it in the Data palette). But seems like something is missing, and can't find this searchText beam property specified in the html:text tag.
    Can someone help in this one?
    Here is the Help description inside the HowTo example:
    Section 3
    queryEmployees
    queryEmployeesInDept provides an interface for entering a simple search criteria for querying a list of
    employees. This does not use the Find mode Query By Example functionality that the other query screens
    use, but rather presents a much simpler search interface. The actual search is carried out using a
    function
    searchEmployees that the underlying view object exposes. (See the EmployeesView view object in the
    model project)
    1. Drop a new Data Page onto the page flow diagram call it queryEmployees
    2. In the page flow diagram, drag the searchEmployees operation from the AllEmployeesView
    collection in the Data Control Palette and drop it on top of the new Data Page. This will cause the
    framework to run a search whenever the page is called.
    3. In the Structure pane, locate the queryEmployees node and expand it, select the child node
    paramNames[0], and change it's value attribute to ${param.searchText}. This will pass the URL
    parameter searchText on to the business method to qualify the query.
    4. Drill down into the page and expand the Data Control Palette to select the AllEmployeesView
    collection. Set the Drag and Drop as: list to Read-OnlyTable. Then drag the collection onto the page.
    This will create a tabular containing the query results.
    5. Select the Struts HTML component palette and drag a Form onto the page above the output table. Set
    the handling action to this Data Page (queryEmployees.do)
    6. Drag a text field from the component palette inside of this new form. Set the property attribute of
    the
    <html:text> tag to searchText (the same value you used in the paramNames[0] for the Data Page)
    7. Create a new submit button in the form to submit the search. Set the property attribute of the button
    to
    event_search.
    8. Finally we need to subclass the data page to prevent the search action from being fired when it is not
    appropriate for the page ( for instance when we first display it). To do this we need to Go to Code on
    the Data Page's context menu, and override the invokeCustomMethod() method:
    * We only want to invoke the custom method i.e. the call to change
    * the Where clause on the collection, if the Action has been called with
    * a search event on the page with a search term supplied.
    * If the user got here via a link or another event, we bypass the model call
    * unless a URL parameter event=search is supplied, in which
    * case the method will also be called.
    protected void invokeCustomMethod(DataActionContext actionContext)
    List events = actionContext.getEvents();
    // If the event is "search" do the custom event call
    if ((events != null) && (events.contains("search")))
    String searchTerm = (String)((DynaActionForm)actionContext.getActionForm())
    Get("searchText");
    if (searchTerm != null)
    super.invokeCustomMethod(actionContext);
    }

    Solved with Oracle JDeveloper HowTo:
    Creating Search Pages with Both Fixed and Dynamic Criteria
    Author: Steve Muench, Oracle ADF Development Team
    Date: September 16, 2004
    http://www.oracle.com/technology/products/jdev/howtos/10g/dynamiccrit/index.html

  • Bookmark method for a page is not getting called

    Hi,
    I am developing a simple ADF application which contains two jspx pages, in JDEVELOPER 11g (build JDEVADF_MAIN_GENERIC_080910.1420.5124).
    I have a commandLink in Page1 which takes me to the Page2.I have a bookmark method for Page2, which gets called when I load the page.
    When I access the Page2 directly,the corresponding bookmark method is getting called.But when I navigates it through commandLink provided in Page1,the bookmark method is not getting called.
    Page1.jspx:
    <?xml version='1.0' encoding='UTF-8'?>
    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <f:view>
    <af:document maximized="true">
    <af:form>
    <af:commandLink text="Go to Page2" action="page2" />
    </af:form>
    </af:document>
    </f:view>
    </jsp:root>
    Page2.jspx:
    <?xml version='1.0' encoding='UTF-8'?>
    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
    xmlns:bib="http://xmlns.oracle.com/dss/adf/faces">
    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <f:view>
    <af:document maximized="true">
    <af:form>
    <af:outputText value="This is Page2"/>
    </af:form>
    </af:document>
    </f:view>
    </jsp:root>
    adfc-config.xml:
    <?xml version="1.0" encoding="UTF-8" ?>
    <adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2">
    <view id="page1">
    <page>/page1.jspx</page>
    </view>
    <view id="page2">
    <page>/page2.jspx</page>
    <bookmark>
    <method>#{mBean.bookMarkMethod}</method>
    </bookmark>
    </view>
    <control-flow-rule>
    <from-activity-id>page1</from-activity-id>
    <control-flow-case>
    <from-outcome>page2</from-outcome>
    <to-activity-id>page2</to-activity-id>
    </control-flow-case>
    </control-flow-rule>
    <managed-bean>
    <managed-bean-name>mBean</managed-bean-name>
    <managed-bean-class>view.ManagedBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    </adfc-config>
    ManagedBean.java:
    public class ManagedBean {
    public ManagedBean() {
    super();
    public void bookMarkMethod() {
    System.out.println("Inside bookmark method");
    Please look into this...........

    Hi Frank,
    I need to provide the af:commandLink inside af:table component and the values which I pass to page2 depends on the row I select at runtime.
    so,I am trying to use ad:setActionListener inside af:commandLink.
    If I use FacesContext.getCurrentInstance.getExternalContext.redirect() inside the actionListener of af:commandLink, I need to extract all the required values in the actionListener.
    Isn't there any way so that, I can pass the values using af:setActionListener inside af:commandLink and a method ( which will initialise the managed bean) will be called when page2 loads ???
    Regards,
    Lokesh.

  • To enable multiple selection for tree view in web ui .

    Hi Experts ,
    We have requirement to add a multiple selection to a tree view in web ui  for a standard view.
    Component: BP_HIER
    View: BP_HIER/EOVPHierarchyTreeV
    Currently only single select is enabled for this view. I have added the following code in the HTMl page to multi selection.
    selectionMode          = "<%= AccountHierarchy->selection_mode %>"
    <%--selectedRowIndexTable = "<%= AccountHierarchy->SELECTION_TAB %>"--%>
    And in "DO_INIT_CONTEXT " method I have added the following code to enable multi select.
    typed_context->accounthierarchy->set_selection_mode(
            iv_selection_mode = cl_bsp_wd_context_node_tv=>selmode_multi.
    But still multi selection is not working.
    Let me know if any code changes are required in method "EH_ONSELECT" to enable multi selection.
    Regards,
    Shweta Nimje

    Hi Shweta,
    Why did you comment attribute selectedRowIndexTable? Uncomment and try again.
    selectedRowIndexTable = "<%= AccountHierarchy->SELECTION_TAB %>"

  • Alternative method for loadObjectLibrary()

    Hi,
    Iam new commer to this openscript.Urgent.. Please any one help me which one is the alternative method for loadObjectLibrary() in openscript9.2.

    Termination
    Set Up Personnel Actions
    Create reasons for Personnel Actions
    Define Action Type for Termination
    Define Infogroups
    Determine Periods of Notice
    Before making the settings in feature 40TRM, you must set the same Action Type for the Action
    Reasons N0, N1 and N2 in the table view Reason for Action (V_T530).
    you can use IMG link under Payroll India -> Termination -> Create reasons for Personnel Actions.
    For example- if 40TRM return value is 10 then there shud be action reasons N0, N1, N2 for the Action 10 in V_T530.
    well 1 more thing, enter the pernr in termination workbench and press ENTER then try to check F4 of 'Reason'.
    I know it looks funny but as the pernr is mandatory field there, you need to press 'Enter' after this.
    Determine Deadline Type
    Maintain Calculation Factor for Retiral Benefits
    Calculation method for Notice Pay
    Try this hope u have maintained the Gratutiy configuration correctly

  • What is the best method for synchronizing tables in two different DB?

    We have a core banking database and this database includes our customer related tables and these tables are really huge.
    And we have other database for some applications and this database needs fresh customer data which take place in core banking database.
    Our current method is materalized views but we have some performance problems about it.
    What can give better performace for synchronizing the tables between databases?
    -oracle streams?
    -triggers?
    -dbms_comparison?
    or anything else?
    Edited by: 983327 on Jan 28, 2013 2:14 PM

    Assuming that both databases are Oracle, both run relatively recent versions of Oracle, and your organization has administrative access to both systems ("core banking" databases are often run by third parties), Streams is a more efficient architecture than materialized views on the capture side (assuming that you are doing incremental refreshes with materialized views). It's more work to configure than materialized views but you get much greater flexibility and better performance.
    Oracle's direction is to move away from Streams and towards GoldenGate which requires additional licenses. Since Oracle does not plan on enhancing Streams moving forward, if this is a strategic decision for your organization, you might want to look at GoldenGate instead even if it doesn't offer any benefits today over Streams.
    Justin

Maybe you are looking for