Custom shuttle component

Oracle JDeveloper 11.1.1.2.0
Since the current adf component doesn't seem to allow me to show two columns, i'm trying to implement my own shuttle component.
I was able to accomplish this by creating two lists<VOrows> (trailing & leading) and using them as table binding and simple array logic in removing one row and adding to the other list...
Now i'd like to use view objects.
Let me just call the leading table (selected items) as right table and trailing table (available items) as left table.
I'm using an entity based view object for the right table since i'll be deleting or inserting data over there.
For my left table, i'm using a read-only view object which basically says Select all Items that is not on Right table's DB object. Everything seems ok when i placed the shuttle logic in app module as long as i don't re-execute query on the left table because if i re-execute query, it requeries from DB and unless i commit the right table's data, i'll end up getting newly inserted values on the right table showing up on the left all over again.
My shuttle logic is basically using both viewobjects iterator, insert to right table, then remove from left table... same logic on the reverse, delete from right table, insert to left.
This would have been feasible except that i have issues with sorting and filtering. If i allow users to filter or sort, it seems that the viewobject requeries, thus giving me the problem of having the same item in both tables.
In short, i'm trying to look for a solution where i can keep the left table from requerying or if i do choose to use an entity based VO for the left table so that i can use its cache, if i can find a way to commit right table without commiting left table.
Any hints or guides to what direction i should try or study is highly appreciated.
Edited by: Mar Vince Reyes on Jan 30, 2010 11:30 AM
Edited by: Mar Vince Reyes on Jan 30, 2010 11:32 AM

Hi Mar
For the shuttle VOs let us assume Code and Description attributes:
AvailableVo - Read-only VO containing all Available Codes
SelectedEv - Updateable VO containing the Selected Codes
We can override executeQueryForCollection on AvailableVo and set a WHERE clause that excludes the rows in SelectedEv.
Here is a sample implementation:
<li>In SelectedEvImpl add method getSelectedCodes() that returns a string of all Codes in the SelectedEv View Object.
    public String getSelectedCodes() {
        String quote = "'";
        String separator = ",";
        String selectedCodes = null;
        SelectedEvRowImpl row = null;
        //Create a secondary RowSetIterator to loop through this view object
        RowSetIterator rsi = this.createRowSetIterator(null);
     //Loop through the iterator and generate the string with Codes
        while(rsi.hasNext()){
            row = (SelectedEvRowImpl)rsi.next();
            String code = quote+row.getCode()+quote+separator;
            if (selectedCodes == null)
                selectedCodes = code;
            else
                selectedCodes = selectedCodes.concat(code);
        //Close secondary row set iterator
        rsi.closeRowSetIterator();
        //Remove the extra comma at the end of the string
        if (selectedCodes!=null)
          selectedCodes = selectedCodes.substring(0, selectedCodes.length()-1);
        return selectedCodes;
    }<li> In AvailableVoImpl we override executeQueryForCollection and set WHERE clause to exclude the rows in SelectedEv.
    protected void executeQueryForCollection(Object object, Object[] object2,
                                             int i) {
        String selectedCodes = ((AppModuleImpl) getApplicationModule()).getSelectedEv().getSelectedCodes();
        if (selectedCodes != null)
          setWhereClause("code not in ("+selectedCodes+")");
        super.executeQueryForCollection(object, object2, i);
    }<li> On your Page Binding under Executables section verify that SelectedEvIteraor is above the AvailableVoIterator.
<li> Partial trigger AvailableVo to refresh it as you shuttle Codes from AvailableVo to SelectedEv.
Mitesh
Edited by: Mitesh Gajjar on Jan 31, 2010 3:24 PM
Added rsi.closeRowSetIterator();

Similar Messages

  • ADF Shuttle Component - Can we have multiple leading list

    Hi,
    I have requirement where there are multiple lists of different types on the left hand side and user should be able to shuttle the items from any of the list to the single selected list in right side. I know in ADF shuttle there is one leading and one trailing list. I wan to know how can i make ADF shuttle component support multiple leading lists and single trailing list.
    Or should I go for total custom solution mimicking shuttle behavior?
    JDev version is 11.1.1.6.0
    Thanks,
    Sandeep
    Edited by: Sandeep Koul on Aug 26, 2012 10:47 PM

    After consulting other ADF experts offline, we have come to conclusion that there is no off-the shelf component which caters to my requirement.
    We are now going with complete custom solution to achieve shuttle behavior.
    I am marking this query as answered.
    Thanks,
    Sandeep

  • Error while pointing to Custom MSS Component

    Hello,
    We are implementing MSS on Portal. I have Z copied the standard MSS Webdynpro Component HRMSS_C_CATS_APPR_DASHBRD. To point to the custom one in the Homepage, I have the Custom Component Configuration ZHRMSS_HOMEPAGE_OVP, in which when I refer to the Custom Webdynpro Component created, I get the Error : 'Component <z component name> of UIBB (Window Name) implements an Invalid Interface'.
    What can be causing this?
    Any help would be highly Appreciated.

    Try closing and reopening the project. This is a common issue with Web Dynpro projects and closing and reopening tends to fix it.

  • How to add properties to a custom JSF component?

    Hello, everybody!
    I've just developed my first custom JSF component. It's a data pager and it is working pretty well. But now I want to be able to use some of it attributes in my backing beans at runtime. I mean, I want to bind it to component in the JSF page. It already has a binding attribute in the tld file, but I want to be able to accesss two values that the renderer of my custom component calculate inside it, which would relieve me from calculating these values manually in the backing beans. So, I would like to know how to make these values external to the component.
    By now this is my custom pager class:
    import javax.faces.component.UICommand;
    public class UIPaginadorDados extends UICommand
    }You can see that it has no logic because all the logic is in the renderer class:
    import javax.faces.render.Renderer;
    public class PaginadorDadosRenderer extends Renderer
        // logic here
    }As I said I want to be able to do the following in my backing beans:
    private UIPaginadorDados pager = new UIPaginadorDados();
    // and later...
    pager.getCurrentPage();
    pager.getPageCount();In the JSF page:
    // I already can do this, because I have a binding attribute
    <urca:paginadorDados binding="#{backingBean.pager}" />I suppose that I'll have to create the properties getCurrentPage() and getPageCount() in the component class, UIPaginadorDados, but I don't know how to get the values to the properties from the renderer class. I don't even know if this is how I should do it.
    So I would appreciate a lot your help about this subject.
    Thank you.
    Marcos

    Marcos_AntonioPS wrote:
    RaymondDeCampo wrote:
    I neglected to mention: do not forget to implement the methods in StateHolder to preserve the properties you added to your component.Hello, Raymond. Could you elaborate a little more on that? If you could give a short example, it would be helpful.
    MarcosNo problem. I have already found out how.
    Thank you very much, Raymond.
    Marcos

  • Custom Pipeline Component stopped changing input filename

    Hi
    In my project, I have a custom pipeline component to change the input file name. I use it in the receive pipeline decode stage. It was working initially when I had only a receive pipeline and custom pipeline component in my solution. later I introduced
    two schemas, an orchestration, map and a send pipeline. The rename is not working anymore. Please help.
    receive adapter: FILE
    send adapter: FTP
    Custom pipeline component: (File Name Setter)
    Receive pipeline:
      decode: custom pipeline component to rename the filename
      disassemble: flatfile disassembler conecting to a document schema
    Map:
      Schema 1 to Schema 2 (transforms from Windows to Unix format)
    Orchestration:
      receive message
      transform using map above
      send message
      Exception Handler
    Send pipeline:
      FlatFile assembler
    manibest

    May be its not working now, because in the orchestration which you have added,
     you’re constructing a new message from the received message and the context properties from the Received message is not copied across to the newly constructed message. So when you use “%SourceFileName%” macro in the send port,
    the ReceivedFileName context property is missing in the newly constructed message which is sent out.
    So in your Orchestration, while constructing (in MessageAssignment shape) the outbound message from the Received message, copy the context property of the Received message to the newly constructed message. Something like this
    //This line copies all the context properties from received message to the outputted message
    msgOutputted (*)= msgReceived(*)
    //or
    //This line just copies the receive file name context property from received message to the outputted message
    msgOutputted (FILE.ReceivedFileName)= msgReceived (FILE.ReceivedFileName).
    If you’re not using the Orchestration or constructing the new message (even in map), then just add the schemas/orchestration or any pipeline would not affect the ReceiveFileName code. May be in this case, debug the pipeline and also check whether the outputted
    message has ReceivedFileName in its context property.
    If this answers your question please mark it accordingly. If this post is helpful, please vote as helpful by clicking the upward arrow mark next to my reply.

  • Custom pipeline component creates the folder name to archive messages

    Hi 
    I have an requirement that a BizTalk application is receiving untyped messages and at the receive location the pipeline have to archive the incoming message with the specifications:
    suppose I have an xml like
          <PurchaseOrder>
            <OrderId>1001</OrderId>
            <OrderSource>XYZ</OrderSource>
            <Code>O01</Code>
          </PartyType>
    In the pipeline component it has to read this xml and have to use OrderSource value 'XYZ' to create a archival folder and the message have to archive with file name '%MessageId%'
    It has to be done by writing custom pipeline component where I am not familiar with c# coding, Can anyone please how to implement mechanism.
    Thanks In Advance
    Regards
    Arun
    ArunReddy

    Hi Arun,
    Use
    BizTalk Server Pipeline Component Wizard to create a decode pipeline component for receive. Install this wizard. This shall help you to create the template project for your pipeline component stage.
    Use the following code in the Execute method of the pipeline component code. This code archives the file based with name of the file name received.
    public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
    MemoryStream tmpStream = new MemoryStream();
    try
    string strReceivedFilename = null;
    DateTime d = DateTime.Now;
    try
    //Get the file name
    strReceivedFilename = inmsg.Context.Read("ReceivedFileName", "http://schemas.microsoft.com/BizTalk/2003/file-properties").ToString();
    if (strReceivedFilename.Contains("\\"))
    strReceivedFilename = strReceivedFilename.Substring(strReceivedFilename.LastIndexOf("\\") + 1, strReceivedFilename.Length - strReceivedFilename.LastIndexOf("\\") - 1);
    catch
    strReceivedFilename = System.Guid.NewGuid().ToString();
    originalStream = inmsg.BodyPart.GetOriginalDataStream();
    int readCount;
    byte[] buffer = new byte[1024];
    // Copy the entire stream into a tmpStream, so that it can be seakable.
    while ((readCount = originalStream.Read(buffer, 0, 1024)) > 0)
    tmpStream.Write(buffer, 0, readCount);
    tmpStream.Seek(0, SeekOrigin.Begin);
    //ToDo for you..
    //Access the receive message content using standard XPathReader to access values of OrderSource and construct file pathAccess the receive message content using standard XPathReader to acceess values of OrderSource and contruct the file path
    string strFilePath = //Hold the value of the file path with the value of OrderSource
    string strCurrentTime = d.ToString("HH_mm_ss.ffffff");
    strFilePath += "\\" + strReceivedFilename + "_";
    FileStream fileStream = null;
    try
    System.Threading.Thread.Sleep(1);
    fileStream = new FileStream(strFilePath + strCurrentTime + ".dat", FileMode.CreateNew);
    catch (System.IO.IOException e)
    // Handle the exception, it must be 'File already exists error'
    // Wait for 10ms, change the file name and try creating the file again
    // If the second 'file create' also fails, it must be a genuine error, it'll be thrown to BTS engine
    System.Threading.Thread.Sleep(10);
    strCurrentTime = d.ToString("HH_mm_ss.ffffff"); // get current time again
    string dtcurrentTime = DateTime.Now.ToString("yyyy-MM-ddHH_mm_ss.ffffff");
    fileStream = new FileStream(strFilePath + strCurrentTime + ".dat", FileMode.CreateNew);
    while ((readCount = tmpStream.Read(buffer, 0, 1024)) > 0)
    fileStream.Write(buffer, 0, readCount);
    if (fileStream != null)
    fileStream.Close();
    fileStream.Dispose();
    if (originalStream.CanSeek)
    originalStream.Seek(0, SeekOrigin.Begin);
    else
    ReadOnlySeekableStream seekableStream = new ReadOnlySeekableStream(originalStream);
    seekableStream.Position = 0;
    inmsg.BodyPart.Data = seekableStream;
    tmpStream.Dispose();
    catch (Exception ex)
    System.Diagnostics.EventLog.WriteEntry("Archive Pipeline Error", string.Format("MessageArchiver failed: {0}", ex.Message));
    finally
    if (tmpStream != null)
    tmpStream.Flush();
    tmpStream.Close();
    if (originalStream.CanSeek)
    originalStream.Seek(0, SeekOrigin.Begin);
    return inmsg;
    In the above code, you have do a section of code which will access the receive message content using standard XPathReader to access values of OrderSource and construct the file path. I have
    commented the place where you have to do the same. You can read the XPathReader about here..http://blogs.msdn.com/b/momalek/archive/2011/12/21/streamed-xpath-extraction-using-hidden-biztalk-class-xpathreader.aspx
    If this answers your question please mark it accordingly. If this post is helpful, please vote as helpful by clicking the upward arrow mark next to my reply.

  • How does one define a default style for a custom Flex component?

    How does one define a default style for a custom Flex component?
    hello
    I created a new set of Flex component library slib.swc (Flex 4.5). Would also like to have a default style. defaults.css file, making it the default style of the component library.
    Like flex the builder install directory of sdks \ 4.5.0 \ frameworks out \ libs directory has a spark.swc file, open with Winrar will see defaults.css this file. Defaults.css file defines the default style of the flex spark components.
    How can it be achieved?
    As follows
    slib.swc contains a CLabelEx components, and a defaults.css file
    defaults.css source file as follows:
    @ namespace s "library :/ / ns.adobe.com / flex / spark";
    @ namespace mx "library :/ / ns.adobe.com / flex / mx";
    @ namespace cn "http://os.slib.cn";
    cn | CLabelEx
            styBackgroundAlpha: 1;
            styBackgroundColor: # 569CC0;
            styBorderAlpha: 1;
            styBorderColor: # 569CC0;
            styBorderWeight: 1;
            styCornerRadius: 3;
    In slib.swc the application MyLabel.mxml of the source file as follows:
    <? xml version = "1.0" encoding = "utf-8"?>
    <s: Application, the xmlns: fx = "http://ns.adobe.com/mxml/2009
                               xmlns: s = "library :/ / ns.adobe.com / flex / spark"
                               xmlns: mx = "library :/ / ns.adobe.com / flex / mx"
                               xmlns: cn = "http://os.slib.cn
                               the minWidth = "955" The minHeight = "600">
            <fxeclarations>
            </ fxeclarations>
            <cn:CLabelEx x="67" y="112"/>
    </ s: Application>
    I hope CLabelEx default use cn | CLabelEx, style to display its appearance.
    I refer to above approach, but failed to achieve. Can you please re-Detailed
    Thanks!

    dj is right. Any Folder can be a picture folder.
    Create a root level folder and add it to your Pictures Library in Windows.  It will show up with all the scattered pictures from other programs. It can even be a different dirve if you like.  You  can even specify one to be the default save location for pictures in this dialog.
    Navigate to Pictures in your Libraries in Windows Explorer Right Click and select Properties.
    Message was edited by: Rikk Flohr forgot the instructions...

  • Insert icon for every row inside the shuttle component

    Hi,
    I have a requirement where the shuttle component should have an icon side by the text and which also should be able to replace with the different icon based on some conditions
    For example
    The left side the shuttle component consists of list services. When the user moves some of the services to the right, in the right shuttle the 'X' icon should be displayed for each of the selected services.
    When some action is performed these 'X' should be replaced with 'Yes' icon.
    Thanks,
    Manidhar

    It works for me.
    SQL> create table Table_A(a1 number, a2 varchar(10), a3 varchar(10));
    Table created.
    SQL> create table Table_B(b1 number, b2 varchar(10), b3 varchar(10));
    Table created.
    SQL> create table Table_C(c1 number, c2 varchar(10), c3 varchar(10));
    Table created.
    SQL> insert into Table_C
      2  select level, level + 1, level + 2
      3  from dual connect by level <= 3;
    3 rows created.
    SQL> create or replace trigger table_a_tr
      2  after insert or update or delete on table_a
      3  for each row
      4  declare
      5  begin
      6  insert into table_b(b1,b2,b3)
      7  (select c1, c2, c3
      8  from table_c);
      9  end table_a_tr;
    10  /
    Trigger created.
    SQL>
    SQL> insert into table_a values (9, 'x', 'x');
    1 row created.
    SQL> select * from table_b;
            B1 B2         B3
             1 2          3
             2 3          4
             3 4          5Can you show exactly what you are doing in the same way?

  • How to migrate Stellent 7.5.1 custom layout component to OCS 10gR3

    Hi,
    I am in the process of upgrading stellent 7.5.1 to OCS 10gR3. There is a custom layout component in 7.5.1 wanted to find out how can I migrate the layout component. As probably there are changes in 10gR3 so want to find out how to migrate the custom layout component and any changes required before migrating to 10gR3.
    Thanks.

    Hi
    am putting out the steps needed for upgrading an existing CS instance from version 7.5.1 to 10gR3. Its basically a 2 step process where we use Configuration Migration Utility to migrate the CS structure and Archiver to migrate the existing contents. The steps are as follows :
    1. Install a new CS 10gR3 instance on the server and configure it as per the install guide.
    2. Verify that the basic functionalities for the newly installed instance is working fine by doing some simple tests like checkin ,checkout , update etc. Then upgrade the CS to the latest patchset level which can be downloaded from http://updates.oracle.com/download/6907073.html.
    3. Install the latest version of Configuration Migration Utility component (which is found in the same uprgade patch set ) on both the 10gR3 CS (target) instance and the 7.5.1 CS (source).Enable them on both the CS instances and restart the same.
    4. Run the Configuration Migration Utility on the source CS and download the CMU Bundle created on it.
    5. Upload the CMU Bundle created in previous step to the Target CS and import the configurations from that.Verify that the CMU process is completed successfully on the Target CS instance.
    6. Create a new archiver instance on the Source CS and export all the contents in that.
    7. Open the Archiver Applet for the target CS instance and then Point the collections to the collections.hda of the source CS instance so that we can import the contents. Start the Import process on target server.
    8. Once the CMU and Archiver Process are completed then your 10gR3 CS would be an exact replica of the Source 7.5.1 Instance.
    You may also go through System Migration Guide to get more understanding on the Migration / Upgrade processes.
    Hope this helps
    Thanks
    Srinath

  • Shuttle component not posting even when populated

    Hi,
    I am seeing a strange problem when using the shuttle
    component and was wondering if anybody had a workaround
    or more info on where I am going wrong.
    I have a shuttle which is populated from a ViewObject, which is the details part of a master/detail.
    When my screen gets loaded for the first time my leading shuttle is populated correctly,
    with a full list of entries and my trailing component is populated with the correct list of entries.
    However when I submit the form to the server I can see in the log that the leading and the trailing parameters are empty! Very strange.
    If it helps here is how I am creating the shuttle:
    <bc4j:registryDef>
        <bc4j:rootAppModuleDef name="UserManageAppModule"
                               definition="ARCHSSO.UserManageAppModule"
                               releaseMode="stateful">
          <bc4j:viewObjectDef name="UserInfoView" rangeSize="1">
            <bc4j:rowDef name="UpdateUserInfoView" usesCurrency="true" autoCreate="false">
              <bc4j:propertyKey name="key"/>
            </bc4j:rowDef>
          </bc4j:viewObjectDef>
          <bc4j:viewObjectDef name="RoleCodesView" rangeSize="1000"/>
          <bc4j:viewObjectDef name="RolesForUserView" rangeSize="1000"/>
        </bc4j:rootAppModuleDef>
        <bc4j:rootAppModuleDef name="ApplicationsAppModule"
                               definition="ARCHSSO.ApplicationsAppModule"
                               releaseMode="stateful">
          <bc4j:viewObjectDef name="ApplicationsView" rangeSize="100"/>
        </bc4j:rootAppModuleDef>
      </bc4j:registryDef>
    <tableLayout>
      <contents>
         <bc4j:rootAppModuleScope name="UserManageAppModule">
           <contents>
              <bc4j:viewObjectScope name="UserInfoView">
                <contents>
                   <bc4j:rowScope name="UpdateUserInfoView">
                     <contents>
                        <bc4j:messageInput attrName="UriUserid" id="userid" readOnly="true"/>
                        <formValue name="userid" data:value="-99"/>
                        <rowLayout>
                          <contents>
                             <tableLayout>
                               <contents>
                                  <bc4j:messageInput attrName="UriUsername"
                                                         readOnly="true"/>
                                  <bc4j:messageInput attrName="UriUserSurname"/>
                                  <bc4j:messageInput attrName="UriUserFirstname"/>
                                  <bc4j:messageInput attrName="UriUserDesc"/>
                                  <bc4j:messageInput attrName="UriAddr1"/>
                                  <bc4j:messageInput attrName="UriAddr2"/>
                                  <bc4j:messageInput attrName="UriAddr3"/>
                                  <bc4j:messageInput attrName="UriAddr4"/>
                                  <bc4j:messageInput attrName="UriVpnNo"/>
                                  <bc4j:messageInput attrName="UriExtnNo"/>
                                  <bc4j:messageInput attrName="UriPersonnelNo"/>
                                  <bc4j:messageInput attrName="UriTelephoneStd"/>
                                  <bc4j:messageInput attrName="UriTelephoneLine"/>
                                  <bc4j:messageInput attrName="UriCcsCustNo"/>
                                  <bc4j:messageInput attrName="UriPpsNo"/>
                                  <bc4j:messageInput attrName="UriEmail"/>
                                  <spacer height="30" width="400"/>
                               </contents>
                             </tableLayout>
                             <tableLayout width="40%">
                               <contents>
                                  <!-- START ROLE ASSIGNMENT -->
                                  <shuttle
                                             name="UserRolesShuttleEditor"
                                             reorderable="false"
                                             leadingHeader="Available Roles"
                                             trailingHeader="Assigned Roles"
                                             size="5" >
                                    <leading>
                                       <list>
                                         <contents>
                                         <bc4j:optionList voName="RoleCodesView" name="RceRoleId" attrName="RceRoleId" textAttrName="RceRoleDesc"/>
                                         </contents>
                                       </list>
                                    </leading>
                                    <trailing>
                                       <list>
                                         <contents>
                                         <bc4j:optionList voName="RolesForUserView" name="RceRoleId" attrName="RceRoleId" textAttrName="RceRoleDesc"/>
                                         </contents>
                                       </list>
                                    </trailing>
                                    <trailingFooter>
                                       <flowLayout>
                                         <contents>
                                         </contents>
                                       </flowLayout>
                                    </trailingFooter>
                                  </shuttle>
                                  <!-- STOP ROLE ASSIGNMENT -->
                               </contents>
                             </tableLayout>
                          </contents>
                        </rowLayout>
                     </contents>
                   </bc4j:rowScope>
                </contents>
              </bc4j:viewObjectScope>
           </contents>
         </bc4j:rootAppModuleScope>
      </contents>
    </tableLayout>Finally, here is what is popping out in the log:
    Requested page = Page[name=TdcrUserInfoView_Update,key=0001000000
    Event = apply
    Parameter userid=
    Parameter UriUserFirstname=Ken
    Parameter UriExtnNo=
    Parameter UriVpnNo=
    Parameter UriPpsNo=
    Parameter UriPersonnelNo=
    Parameter UriEmail=
    Parameter UriUserSurname=Mulhall
    Parameter UriCcsCustNo=
    Parameter UriAddr4=
    Parameter UriAddr3=
    Parameter UriAddr2=
    Parameter UriAddr1=
    Parameter UriTelephoneStd=
    [u]Parameter UserRolesShuttleEditor:leading:items=;[/u]
    Parameter UriTelephoneLine=
    [u]Parameter UserRolesShuttleEditor:trailing:items=;[/u]
    Parameter UriUserDesc=Enquiry User
    Parameter bajaPage=key=000100000003C20B1000000013000000F68B6BAE3FThe strange thing is if I submit my form which invokes an
    event handler and then refreshes the page all is well and
    the next time the page gets posted the shuttle trailing
    and leading are populated.
    Any help greatly appreciated.
    pj.

    Just a further update if it helps....
    The values from the shuttle are not being submitted in
    the scenario where I do NOT move any of the elements from
    the leading to the trailing. However if I do move
    elements from the leading to the trailing the values will
    get posted correctly.
    Is it possible there is a javascript handler that should
    be populating a hidden field that only gets called once
    the elements are moved?
    Here is the HTML I have on the page returned to the browser:
    <select class="xg" ondblclick="javascript:_moveItems('UserRolesShuttleEditor:leading','UserRolesShuttleEditor:trailing','updateForm');" name="UserRolesShuttleEditor:leading" size="10"><!-- Start:oracle.cabo.ui.composite.TemplateUINode, localName='optionList' --><!-- Start:oracle.cabo.ui.composite.TemplateUINode, localName='viewObjectScope' --><!-- Start:oracle.cabo.ui.BaseMutableUINode, localName='dataScope' --><!-- Start:oracle.cabo.ui.composite.TemplateUINode, localName='rowSetScope' --><!-- Start:oracle.cabo.ui.BaseMutableUINode, localName='dataScope' --><!-- Start:oracle.cabo.ui.composite.TemplateUINode, localName='rowSetIteratorScope' --><!-- Start:oracle.cabo.ui.BaseMutableUINode, localName='dataScope' --><!-- Start:oracle.cabo.ui.composite.TemplateUINode, localName='rowScope' --><!-- Start:oracle.cabo.ui.BaseMutableUINode, localName='dataScope' --><!-- Start:oracle.cabo.ui.BaseMutableUINode, localName='option' -->
                                                  <option value="1">Administrator User</option>
                                                  <!-- Start:oracle.cabo.ui.BaseMutableUINode, localName='option' -->
                                                  <option value="1122">AHCS System Tests Objects Super Role</option>
    etc
    etc
    etc
    <!-- Start:oracle.cabo.ui.beans.form.OptionBean, localName='option' -->
                                                  <option>_______________</option>
                                                </select>
                                              </td>
                                              <td><!-- Start:oracle.cabo.ui.beans.layout.FlowLayoutBean, localName='flowLayout' --><!-- Start:oracle.cabo.ui.beans.form.FormValueBean, localName='formValue' -->
    <input type="hidden" value=";" name="UserRolesShuttleEditor:leading:items">                                            </td>Should the hidden variable above be empty when the form is loaded or should it contain the initial values?
    One other strange behaviour I am seeing is that the
    shuttle does not allow me to select multiple values
    by 'Control+Selecting' - should that be the case?
    Many thanks for any help,
    pj.

  • Custom itemRenderer component based on cell value: error 1009

    I'm working on an item renderer for a dataGrid that has different states depending on the cell and row values.
    The cell value is a toggle (true or null), and sets whether content should be shown in the cell or not
    The row properties determine what is shown when the cell value is true.
    The dataGrid dataProvider is populated based on user id input.
    I created the itemRenderer as a custom actionscript component, closely following this example:
    360Flex Sample: Implementing IDropInListItemRenderer to create a reusable itemRenderer
    However, my component results in Error #1009 (Cannot access a property or method of a null object reference) when a user id is submitted.
    package components
         import mx.containers.VBox;
         import mx.controls.*;     import mx.controls.dataGridClasses.DataGridListData;
         import mx.controls.listClasses.BaseListData;
         import mx.core.*;
         public class toggleCellRenderer extends VBox
              public function ToggleCellRenderer()
              {super();}
              private var _listData:BaseListData;   
                   private var cellState:String;
                   private var cellIcon:Image;
                   private var imagePath:String;
                   private var imageHeight:int;
                   private var qty:String = data.qtyPerTime;
                   private var typ:String = data.type;
              public function get listData():BaseListData
                   {return _listData;}
              public function set listData(value:BaseListData):void
                   {_listData = value;}
              override public function set data(value:Object):void {
                   super.data = value;
                   if (value != null)
                   //errors on next line: Error #1009: Cannot access a property or method of a null object reference.
                   {cellState = value[DataGridListData(_listData).dataField]}
              override protected function createChildren():void {
                   removeAllChildren();
                   if(cellState=='true'){
                        cellIcon = new Image();
                        addChild(cellIcon);
                   //there is another state here that adds another child...
              //next overrides commitProperties()...
    There are no errors if I don't use an itemRenderer--the cells correctly toggle between "true" and empty when clicked.
    I also tried a simple itemRenderer component that disregards the cell value and shows in image based off row data--this works fine without errors or crashing. But I need to tie it to the cell value!
    I have very limited experience programming, in Flex or any other language. Any help would be appreciated.

    Your assumption that the xml file either loads with "true" or nothing  is right.
    After modifying the code to the following, I don't get the error, but it's still not reading the cell value correctly.
    package components
         import mx.containers.VBox;
         import mx.controls.*;   
         import mx.controls.dataGridClasses.DataGridListData;
         import mx.controls.listClasses.BaseListData;
         import mx.core.*;
         public class toggleCellRenderer extends VBox
              public function ToggleCellRenderer()
               super();
              private var _listData:BaseListData;   
              private var cellState:Boolean;
              private var cellIcon:Image;
              private var imagePath:String;
              private var imageHeight:int;
              private var qty:String;
              private var typ:String;
               public function get listData():BaseListData
                 return _listData;
              override public function set data(value:Object):void {
                   cellState = false;
                   if (listData && listData is DataGridListData && DataGridListData(listData).dataField != null){
                       super.data = value;
                       if (value[DataGridListData(this.listData).dataField] == "true"){
                           cellState = true;
              override protected function createChildren():void {
                   removeAllChildren();
                   if(cellState==true){
                        cellIcon = new Image();
                        addChild(cellIcon);
                   //there is another state here that adds another child...
              //next overrides commitProperties()...
    - didn't set the value of qty or typ in the variable declarations (error 1009 by this too--I removed this before but wanted to point out in case its useful)
    - added back in the get listData() function so I could use the listData
    - changed the null check
    All cells are still returning cellState = false when some are set to true, even if I comment out [if (value[DataGridListData(this.listData).dataField] == "true")] and just have it look for non-null data. That shouldn't make a difference anyway, but it confirms that all cells are returning null value.
    Swapping out the first if statement in set data with different variables results in the following:
    [if (listData != null)]  all cells return null (cellState=false for all)
    both [if (value != null)] and  [if (DataGridListData != null)]  results in error 1009 on a line following the if, so I assume they return non-null values.
    All rows have data, just not all fields in all rows, so shouldn't listData be non-null?  Could it be that the xml file hasn't fully loaded before the itemRenderer kicks in?
    I also realized  I had removed the item renderer from many of the columns for testing, and since some columns are hidden by default only one column in the view was using the itemRenderer--hence the single alert per row I was worried about earlier.
    Thanks for your help so far.

  • Emptying the shuttle component not working

    Hi all,
    I am using Jdev 12c. My requirement is to provide user with a Shuttle component in the Popup > Dialog Box and when the user clicks on OK on the Dialog Box, fill the selected values in the Text box on the main page.
    This works fine for me till I try to empty the already selected values from the shuttle component using '<<' option on the Shuttle component and press OK. I get an exception from 'FacesCtrlListBinding.java' file, saying null pointer exception. Following is the exception trace.
    I have shifted my project from Jdev 11g to 12c in between project development, could that be a cause here?
    Thanks!
    Exception Trace:
    Header 1
    <Error> <oracle.adfinternal.controller.application.AdfcExceptionHandler> <ADFC-50016> <ADFc: While handling an exception the application's exception handler threw a new exception.
    java.lang.NullPointerException
      at oracle.adfinternal.view.faces.model.binding.FacesCtrlListBinding.findObjectFromIndex(FacesCtrlListBinding.java:355)
      at oracle.adfinternal.view.faces.model.binding.FacesCtrlListBinding.getInputValue(FacesCtrlListBinding.java:216)
      at oracle.jbo.uicli.binding.JUCtrlValueBinding.internalGet(JUCtrlValueBinding.java:2475)
      at oracle.jbo.uicli.binding.JUCtrlListBinding.internalGet(JUCtrlListBinding.java:3926)
      at oracle.adfinternal.view.faces.model.binding.FacesCtrlListBinding.internalGet(FacesCtrlListBinding.java:499)
      at oracle.adf.model.binding.DCControlBinding.get(DCControlBinding.java:751)
      at javax.el.MapELResolver.getValue(MapELResolver.java:199)
      at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
      at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
      at com.sun.el.parser.AstValue.getValue(AstValue.java:138)
      at com.sun.el.parser.AstValue.getValue(AstValue.java:183)
      at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224)
      at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
      at org.apache.myfaces.trinidad.bean.FacesBeanImpl.getProperty(FacesBeanImpl.java:73)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.getProperty(UIXComponentBase.java:1734)
      at org.apache.myfaces.trinidad.component.UIXValue.getValue(UIXValue.java:79)
      at org.apache.myfaces.trinidad.component.UIXEditableValue.validate(UIXEditableValue.java:211)
      at org.apache.myfaces.trinidad.component.UIXEditableValue._executeValidate(UIXEditableValue.java:724)
      at org.apache.myfaces.trinidad.component.UIXEditableValue.processValidators(UIXEditableValue.java:337)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.validateChildrenImpl(UIXComponentBase.java:1400)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.validateChildren(UIXComponentBase.java:1385)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.processValidators(UIXComponentBase.java:1152)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.validateChildrenImpl(UIXComponentBase.java:1400)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.validateChildren(UIXComponentBase.java:1385)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.processValidators(UIXComponentBase.java:1152)
      at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl$ProcessValidationsCallback.invokeContextCallback(LifecycleImpl.java:1602)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1984)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at oracle.adf.view.rich.component.fragment.ContextSwitchingComponent.invokeOnComponent(ContextSwitchingComponent.java:222)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at oracle.adf.view.rich.component.fragment.UIXInclude.invokeOnComponent(UIXInclude.java:156)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnNamingContainerComponent(UIXComponentBase.java:1942)
      at oracle.adf.view.rich.component.fragment.UIXRegion.invokeOnComponent(UIXRegion.java:594)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at oracle.adf.view.rich.component.fragment.UIXInclude.invokeOnComponent(UIXInclude.java:156)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at oracle.adf.view.rich.component.fragment.UIXInclude.invokeOnComponent(UIXInclude.java:156)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnChildrenComponents(UIXComponentBase.java:1876)
      at org.apache.myfaces.trinidad.component.UIXComponentBase.invokeOnComponent(UIXComponentBase.java:1999)
      at javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1426)
      at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:669)
      at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._executePhase(LifecycleImpl.java:426)
      at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:225)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
      at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
      at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
      at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
      at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:341)
      at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
      at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
      at oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:192)
      at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
      at oracle.adfinternal.view.faces.webapp.rich.RegistrationFilter.doFilter(RegistrationFilter.java:106)
      at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:478)
      at oracle.adfinternal.view.faces.activedata.AdsFilter.doFilter(AdsFilter.java:60)
      at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:478)
      at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:303)
      at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:208)
      at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
      at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
      at oracle.adf.library.webapp.LibraryFilter.doFilter(LibraryFilter.java:202)
      at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
      at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:137)
      at java.security.AccessController.doPrivileged(Native Method)
      at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:315)
      at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:460)
      at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:120)
      at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:217)
      at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:81)
      at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
      at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:225)
      at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
      at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
      at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
      at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3367)
      at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3333)
      at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
      at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
      at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
      at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2220)
      at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2146)
      at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2124)
      at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1564)
      at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
      at weblogic.work.ExecuteThread.execute(ExecuteThread.java:295)
      at weblogic.work.ExecuteThread.run(ExecuteThread.java:254)

    Hi Bala,
    Following is the PageDef XML file code.
    Header 1
    <pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel" version="12.1.2.66.68" id="XYZPageDef"
                    Package="fragments.Management">
      <parameters/>
      <executables>
        <variableIterator id="variables"/>
        <page path="page_template.ManagementTemplatePageDef" id="ptb1" Refresh="ifNeeded"/>
        <iterator Binds="StorageClassLOV" RangeSize="25" DataControl="ManagementAMDataControl" id="StorageClassLOVIterator"/>
      </executables>
      <bindings>
        <list IterBinding="StorageClassLOVIterator" ListOperMode="multiSelect" ListIter="StorageClassLOVIterator"
              id="StorageClassLOV" SelectItemValueMode="ListObject">
          <AttrNames>
            <Item Value="StorageClass1"/>
          </AttrNames>
          <ListDisplayAttrNames>
            <Item Value="StorageClass1"/>
          </ListDisplayAttrNames>
        </list>
      </bindings>
    </pageDefinition>

  • Custom List component in Flash builder 4.5

    Hi,
    Am new to Flash builder 4.5. I want to create a custom list component. In that i have some queries.
    They are,
    1. What are the basic procedures/steps to be followed for Component development in Flash builder 4.5
    2. What are the approaches to the component development in Fladh builder 4.5?
    3. Is there any reference sutes available?
    Thanks,
    Manikandan

    http://www.adobe.com/devnet/flex/videotraining/exercises/ex1_06.html
    you could also search blogs for custom component creation. There might be many implementations for your learning/usage.

  • Steps to create a custom Window component?

    What steps do I need to take to create a custom Window component? My approach now results in the component being uneditable in design view. What I do is simply select "New > MXML component", base it on spark.components.Window and supply a filename. I tried with a Panel component and that works fine.

    Hi,
    Step by Step creation of SAP Payroll Funcitons:
    1) Follow the menu path
       Human Resources>>Time Management>>Administration>>Tools>>Funtions/Operations
       or transaction PE04. Enter a four digit name for e.g ZIABC, and press the create
       button, enter the description. On creation the system proposes the name of
       the routine use it, or enter a name of your choice by selecting the option 'Self-defined'.
    2) During the execution of payroll some tables are filled with wage types and there amounts
       to make these tables available to your routine enter the name of the table for e.g (RT or
       CRT) in the input parameters, and to make the changes done to the data in the tables
       avaiable to the payroll enter the name of the table in the Output parameters as well.
       Input Parameters
       Ctry                                         Num     Object Name
       99                                           1       RT
       99                                           2       CRT
      and same shall be done in the Output Paramters if required.
    3) Create an include in the program PCBURZ990 (using Transaction:
    SE38), in which create a subroutine with the name supplied by SAP or the
    name selected by you during Funtion creation,
    in our case, it is FUZIABC.
    Note: The program PCBURZ990 is in SAP Namespace, so an Access Key
    will be required before you can proceed. But it will not be overwritten during any upgrade.
    *Example of the subroutine
       FORM FUZIABC.
    *enter the code
       ENDFORM.
    4) After this activate the program the Funtion and add it in the schema used for payroll processing.
    Reward points if helpful.
    Regards,
    Manoj.

  • Custom ActionScript Component icon in Design View

    Hi,
    I have created a custom ActionScript component in Flex. I have added the Icon metadata tag before the class definition:
        [IconFile("expandable-panel.png")]   
        public class ExpandablePanel extends TitleWindow
    However, though the path to the image is correct, the icon for the custom component does not show up in Design View.
    Any idea ?
    Thanks.
    Best regards,
    Karl Sigiscar.

    Not very helpful. My question is more where should the icon be placed or what kind of extra configuration is required so that Flex Builder / Flash Builder can find it in Design view.
    Yeah, yeah, I'm in the wrong forum. Doh.

Maybe you are looking for

  • Need help with tables in dreamweaver

    So I can insert a table in dreamweaver but fine tuning it is a problem. I cannot find how to access individual cell properties to apply borders on only the sides of the cells I want. Also I can configure the width of the columns only by dragging the

  • FCPX 10.0.6 - why is the files transcoded as .m4v instead of .mp4 ?

    Hi there, In 10.0.4, after clicking share, the files are transcoded im mp4 format. But now in FCPX 10.0.6 - why are the files transcoded as .m4v instead of .mp4 ? In both instances I selected Apple devices. I noticed both the filesize are about the s

  • Web form tester. don't run the form.

    Dear all, i am using oracle 8i and forms 6i. i am trying to run the web form tester but it give error. i gave the forllowing parameters: form : D:\Accano\logonscreen.fmx Userid : mis other parameters : useSDI= yes ( what is this?) Look and Feel: Gene

  • Sorting date using Comparator.

    Hi frnds, I have a problem sorting a date using comparator Interface. To the compare method I am passing Objects, which contains values retrieved from bean. I have hyperlinks for all the fields, upon clicking am able to sort all the fields except the

  • Epson Stylus Pro 3800 - Prints too dark.

    I had a Hewlett - Packard pigment ink printer and until it bit the dust, it printed very accurate, beautiful and to the display prints. I have a cheap Canon printer that puts out prints that can match the display too. I just purchased a new Epson Sty