Soap mapping question

Gurus,
i need to send a request to a third party app as a soap message, then map the response to an idoc, how do we do it..any ideas.
Has this been done..before, all tips are rewarded
Venkat

I need more information about your scenario, but i know that you need to call a WebService using SOAP (a syncronous call) and then, call a IDoc with the result of the SOAP call, right?
So, the mapping program between the sender(?) and the receiver(IDoc), you create a Java Mapping that calls the WebService with a code like this:
try {
                         StringBuffer sb = new StringBuffer();
                         sb.append(your_POST_data_here);
                         System.setProperty("javax.net.ssl.trustStore", "C:\j2sdk1.4.2_14\jre\lib\security\truststore"); //Set the keystore for the ssl connection
                         int port = 443;
                         String hostname = "your_third_party_hostname";
                         SocketFactory socketFactory = SSLSocketFactory.getDefault();
                         Socket socket = socketFactory.createSocket(hostname, port);
                         // Create streams to securely send and receive data to the server
                         InputStream in = socket.getInputStream();
                         OutputStream out = socket.getOutputStream();
                         // Read from in and write to out...
                         out.write(sb.toString().getBytes("US-ASCII"));
                         out.flush();
                         int character = in.read();
                         sb = new StringBuffer();
                         while (character != -1) {
                               sb.append( (char) character);                              character = in.read();
                         String ret = sb.toString(); //this is your return
                         // Close the socket
                         in.close();
                         out.close();
               } catch(IOException e) {
                    e.printStackTrace();
The code above calls the webservice using socks.
All you have to do is map the xml using DOM or SAX.

Similar Messages

  • CRMXIF_REL_SAVE_M01 - Mapping Question

    Hello All,
    I have a mapping question, hope some one can answer my question. Please see the link first and the see my question
    http://www.flickr.com/photos/8764045@N06/4265246260/sizes/o/
    I'm mapping the CRM IDOC to the JDBC Call. I have small problem here. All the target fields are Mandatory 1..1 .
    I will explain with an example:
    I have field from source E102BUS_EI_STRUC_TEL_DATA/COUNTRY mapped to target field.
    I used Map With Default so that even if the values are not there frm the source the target field will be mapped with blank.
    But the problem is the parent node for E102BUS_EI_STRUC_TEL_DATA is E102BUS_EI_BUPA_TELEPHONE is 0.999999 , so sometimes that segment is not coming. In this case Map with Default won't work. Map with Default willl work only if the Parent node is present.
    If you ask me to do Exists node function on E102BUS_EI_BUPA_TELEPHONE and then apply Map with Default, then even this won't work.
    Apologize if I confused you guys. Please let me know if you need more clarification.
    Thanks!
    Raj.

    Hi Raj,
    Try to do a mapping like this
    E102BUS_EI_STRUC_TEL_DATA(context E102S_EI_BUPA_TELEPHONE_CON)--mapwithdefault-->then
    E102BUS_EI_BUPA_TELEPHONE-->exists------------------------------------------------------------------>if---->splitbyValue
    let us say this output (the output of splitbyvalue) as 'VALUE'
    VALUE-----------------------------------------------> then
    VALUE|-->count--->greater----------------------->if----->targetField                            
          Constant(0)---->              Constant(blank)-->else
    Regards
    Suraj

  • A top difficulty mapping question

    Hello
    dose anyone can give solution for this mapping question?
    soruce :
    <header>header</header>
    <item>
         <A>a1</A>
         <B>b1</B>
         <C>c1</C>
    </item>
    <item>
         <A>a2</A>
         <B>b2</B>
         <C>c2</C>
    </item>
    <item>
         <A>a3</A>
         <B>b3</B>
         <C>c3</C>
    </item>
    target:
    <header>header</header>
    <item>
         <A>a1,a2,a3  .....</A>
         <B>b1,b2,b3  .....</B>
         <C>c1,c2,c3  .....</C>
    </item>
    The numbers of item is not fixed,it is unbounded.
    so the target line length is not fixed at design time
    welcome any hits,
    Thanks !!
    BR,
    Jeffrey

    Hi,
    Use cache parameter as Context.
    public void add_element(String[] a,ResultList result,Container container)
      //write your code here
    String c = "";
    int i;
    for(i= 0 ; i < a.length; i++)
             c = c + a<i> ;
             if(i != (a.length-1))
                  c = c + ",";
    result.addValue(c);
    A(src)-->removecontext->UDF--->A(tgt)
    B(src)--->removecontext->UDF--->B(tgt)
    C(src)--->removecontext->UDF--->C(tgt)

  • Many-to-many mapping question

    Hi,
    I'm working with two classes Car and Customer. The Car class has a Vector of Customers and the Customer class has a Vector of Car. Both are related by a many to many mapping.
    I have noticed that I have to set one of the vector to read only to avoid the error message "More than one writable many-to-many mapping can not use the same relation table" in the mapping workbench.
    I can understand that but is there a way to work around, I mean to be able to add a car to a customer and add a customer to a car with the both vectors?
    Is there something to do with the cache?
    I use Vector for the collection or Map class, have I to do otherwise?

    Hello Vladislav, I understand your first question in this thread, but I'm not sure I follow the rest, so let me respond to your first post:
    "I have noticed that I have to set one of the vector to read only to avoid the error message "More than one writable many-to-many mapping can not use the same relation table" in the mapping workbench.
    I can understand that but is there a way to work around, I mean to be able to add a car to a customer and add a customer to a car with the both vectors?"
    The issue here is that with a Many to Many mapping the mapping is responsible for writing to the association table. So, you have a "CAR_CUST" association table. Imagine you add a Car "101" to a customer "501" and the requisite customer "501" to that car "101" in your object model. Then the association table should only be updated once, with an entry of "101, 501". But since the M-M is mapped in both directions, you need to tell TopLink which of these to consider as the "master" when updating the database.
    If you didn't make one of the M-M mappings "read only", then TopLink would insert "101, 501" twice in the association table, and then at a later date you would see that the customer 501 had two 101 cars!
    We do have a feature that allows for TopLink to maintain bidirectional relationships such that if you add or remove a target from one relationship, TopLink will automatically add/remove it from the opposite direction. In my opinion this is lazy programming! A good Java developer should insist on keeping his model up to date on his own. This feature was added because it's part of the EJB spec, not necessarily because it's a good idea ;)
    - Don
    Is there something to do with the cache?
    I use Vector for the collection or Map class, have I to do otherwise?

  • Mapping question

    Hello,
    I have a rather simple question regarding a mapping.
    Lets say my input message is as following:
    <mes1>
       <seg1>
          <name1>Peter</name1>
          <street1>HighCrt</street1>
       </seg1>
       <seg2>
          <name2>Vlad</name2>
          <sub2>Trickst</sub2>
       </seg2>
       <seg2>
          <name2>Rinaldo</name2>
          <sub2>fiave</sub2>
       </seg2>
    </mes1>
    My output should be:
    <out>
       <put>
          <name>Peter</name>
          <name>Vlad</name>
          <name>Rinaldo</name>
       </put>
    </out>
    So my output field "name" should created in case I have a "name1" field in the source message and additionally it should be created for every "seg2" element that is present in the source message and it should be filled with the value of "name2".
    How can I in the mapping trigger that the "name" element of the output message will be generated for each of the two described elements of the source message?
    Best Regards,
    Peter

    Hi,
    Could be possible using user defined function.
    Create a user defined Function with  cache = context
    public void createNodeName(String[] a,String[] b,ResultList result,Container container){
    if ( a.length > 0 )
      result.addValue ( a[0] ) ;
    for ( int i = 0; i < b.length; i++ )
         result.addValue ( b<i> );
    in Mapping use
    1. name1 as first argument
    2. name2 with removeContext as second argument

  • Mapping - Questions

    Hi,
       I have few basic questions regarding mappings.
       1)  I think we can do everything by using Graphical Mapping. Then what is the purpose for Java, XSLT and ABAP mapping? Please give me an example for this...
       2) Which mapping will give better performance? Is there any comparison document available in SDN?
      Appreciate your help!
    Thanks,
    Vivek

    hi,
    Mapping Techniques
    XI provides 3 standard ways of interface mapping between source and target.
    Graphical mapping
    Java Mapping
    XSLT Mapping
    Two more additional mapping types can be activated in XI by making changes to the exchange profile. Those two mappings are
    ABAP mapping
    XSLT mapping with ABAP Extensions
    Graphical Mapping
    Graphical mapping is a common approach followed by everyone for generating desired target structure. It involves simple drag-n-drop to correlate respective nodes (fields) from source and target structure. It hardly involves coding. (Exception - User defined functions). But sometimes with graphical mapping it is difficult to produce required output. For example ... text/html output, namespace change, sorting or grouping of records etc.
    ABAP Mapping
    A person comfortable with Object Oriented ABAP can go for ABAP mapping instead.
    Java Mapping
    Java Mapping uses 2 types of parsers. DOM and SAX. DOM is easier to use with lots of classes to help you create nodes and elements, but , DOM is very processor intensive.
    SAX parser is something that parses your XML one after the other, and so is not processor intensive. But, it is not exaclty easy to develop either.
    XSLT Mapping
    One can also think of Java mapping as another option but it is a bit complex and required knowledge of Java. In such cases, XSLT mapping can be the best approach to meet the requirements.
    check these links too..
    Mapping:
    http://help.sap.com/saphelp_nw04/helpdata/en/c8/b78d406b305537e10000000a1550b0/frameset.htm
    For Java Mapping:
    http://help.sap.com/saphelp_nw04/helpdata/en/e2/e13fcd80fe47768df001a558ed10b6/frameset.htm
    For XSLT Mapping:
    http://help.sap.com/saphelp_nw04/helpdata/en/73/f61eea1741453eb8f794e150067930/frameset.htm
    Error handling in XSLT Mapping:
    http://help.sap.com/saphelp_nw04/helpdata/en/8a/7672f7d7e444439fd7024f806221a4/frameset.htm
    You can also refer some How to guides:
    XI New Mapping Features article,
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/library/xi/xi%203.0%20new%20mapping%20features%20article.evn
    Generic XSLT Mapping and Sample Code,
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/library/xi/xi%20code%20samples/generic%20xslt%20mapping%20and%20sample%20code.pdf
    How to use ABAP-MApping in XI3.0,
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/library/xi/3.0/how%20to%20use%20abap-mapping%20in%20xi%203.0.pdf
    Thanks,
    Vijaya.

  • ABAP Mapping Questions

    Hi,
    I am trying to get my head around ABAP mappings and have a few questions.
    In the below code sample which I find in every example and blog it talks about specific steps -
    *initialize iXML, * create iXML factory object, * create streamfactory object, * create input stream object, * initialize the input xml document, * parse the input xml document
    In these steps the code is always exactly the same so my question is are these just standard steps that are implemented every single time an abap mapping is used and hence only standard lines that never have to be changed or will they be different depending on the mapping.
    I am trying to work out where I will begin my coding.
    So would somebody be so kind as to give me a brief explanation of the above mentioned steps.
    Thank you
    METHOD if_mapping~execute.
    * initialize iXML
      TYPE-POOLS: ixml.
      CLASS cl_ixml DEFINITION LOAD.
    * create iXML factory object
      DATA: ixmlfactory TYPE REF TO if_ixml.
      ixmlfactory = cl_ixml=>create( ).
    * create streamfactory object
      DATA: streamfactory TYPE REF TO
      if_ixml_stream_factory.
      streamfactory = ixmlfactory->create_stream_factory( ).
    * create input stream object
      DATA: istream TYPE REF TO if_ixml_istream.
      istream = streamfactory->create_istream_xstring( source ).
    * initialize the input xml document
      DATA: idocument TYPE REF TO if_ixml_document.
      idocument = ixmlfactory->create_document( ).
    * parse the input xml document
      DATA: iparser TYPE REF TO if_ixml_parser.
      iparser = ixmlfactory->create_parser(
      stream_factory = streamfactory
      istream = istream
      document = idocument ).
      iparser->parse( ).

    Hi,
         The above lines you mentioned deal with initialization of the iXML parser for parsing through the XML payload, so they would remain the same for all mapping where you are parsing the input payload.
    The coding for you specific mapping will begin after this, something like :
    * Implements the DOM generating interface to the parser
      iparser->parse( ).
      emp_node_collection = idocument->get_elements_by_tag_name_ns( name = 'Order' ).
      emp_node_length = emp_node_collection->get_length( ).
      emp_node_iterator = emp_node_collection->create_iterator( ).
    where you start reading the xml node values.
    Hope this helps.
    Regards

  • RFC to SOAP - Mapping Error

    Hi All
    I am working on RFC to SOAP Scenorio.
    The requirement is RFC will make a querry and all the vendor details will be received in the return table structure of the RFC Function module.
    There will be multiple entries in the Return table.
    I am getting the sucess message and the number of records is also matching.
    But the Data is not getting mapped to the right field in the Return table.
    But if i see the SXMB_MONI response message, Data is correctly mapped
    Regards
    Madhan D

    You are getting the right XML from the target and its not getting placed correctly in the return tables.
    The only problem can be with the ABAP code/logic which you wrote for assigning and populating the response values into the tables.
    Regards
    Sunil.

  • One to one mapping question -- can I just map a lookup field for queries?

    I have a table with a state code. I'd like to have a "virtual lookup" on the java class to a region table. I.e., this java class "studies" has a state code. I can map a one-to-one to the descriptor class that has the ref table, but I'd like to have a property in the java class pre-mapped to the "region" field in this lookup so for querying i can just use:
    ReadAllQuery q = new ReadAllQuery();
    q.setReferenceClass(study.class);
    q.setSelectionCriteria(new ExpressionBuilder().get("Region").equal(Region));
    to get all the studies for a particular region.
    am I going about this wrong? or do I have to get the reference table descriptor fromt he one to one map and do something different?

    well,on the way home last nite, I realized I'd had a complete brain fart. I've done this before. I just set up a 1-1 map between descriptors and then built the query like this:
    q.setSelectionCriteria(new ExpressionBuilder().get("refFPO").get("FPO_NO").equal(FPO));
    You can get the pointer to the "refFPO" which is the the descriptor mapped 1-1, then appended the column you wish to get.
    I still went ahead and amended my class to include a read-only, non-toplink mapped attribute "FPO" which just gets the reference variable pointing to "refFPO.getFPO_NO();
    I answered my own question just in case anyone wondered ....

  • File to SOAP scenario question???

    Hi,experts
    let's take source system is A,target system is B.
    I have a File to soap scenario using BPM,the scenario is send file request(from A) to PI,PI will be communicating target system(B) with soap(syn).After that, PI receives the soap response and send the response data to A.
    Now the requirement is, we need to archive the file request msg(before sending to B) to a folder and archive the response msg(response from B) to a folder as well.how could it be achived?
    any help will be much appreciated!
    Thanks

    Hello Rajesh_V2009 ,
    I am trying to implement exactly the same pi scenario, but having some problems :
    File -> file adapter -> ccBPM -> soap receiver adapter -> web service request -> web service response -> ccBPM -> output file adapter.
    The web service that I call works file from wsnavigator. I have created all the design and configuration objects
    needed for the scenario.
    I place a file with following contents:
    <?xml version="1.0" encoding="utf-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Body>
    <pns:GetSetNameWS xmlns:pns="urn:file2soap2fileWSVi">
    <pns:name1>ajeet</pns:name1>
    <pns:name2>phadnis</pns:name2>
    </pns:GetSetNameWS>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    When I look at the process monitor I get this:
    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    - <!-- Receiver Determination
    -->
    - <SAP:Error SOAP:mustUnderstand="" xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
    <SAP:Category>XIServer</SAP:Category>
    <SAP:Code area="RCVR_DETERMINATION">CX_RD_PLSRV</SAP:Code>
    <SAP:P1>Problem while determining receivers using interface mapping: No operation with XML root tag http://schemas.xmlsoap.org/soap/envelope/.Envelope exists.</SAP:P1>
    <SAP:P2 />
    <SAP:P3 />
    <SAP:P4 />
    <SAP:AdditionalText />
    <SAP:Stack>Error when determining the receiver: Problem while determining receivers using interface mapping: No operation with XML root tag http://schemas.xmlsoap.org/soap/envelope/.Envelope exists. Problem while determining receivers using interface mapping: No operation with XML root tag http://schemas.xmlsoap.org/soap/envelope/.Envelope exists. No operation with XML root tag http://schemas.xmlsoap.org/soap/envelope/.Envelope exists.</SAP:Stack>
    <SAP:Retry>M</SAP:Retry>
    </SAP:Error>
    I have no clue about this error. Can you help me with this ?
    If yes I can send you more details, if you liked 
    Hoping to get help from you,
    Cheers,
    Ajeet Phadnis

  • SOAP Attachment question

    Hi!
    I've got a question about SOAP Attachment. It is possible to use "Datahandler" class to attach a file. But is it possible to put the datahandler in a business class ( as an attribute of the class), and the business class is a parameter of the service?
    Thank you for your help!
    Best Regards,
    Nguyen Gilbert

    I tried making the DataHandler object as a attribute of the parameter object and there were some exceptions. I think weblogic does not allow that.

  • 1-1 mapping question

    I am trying to post the question in a different way. My previous post on the related subject can be found at Re: 1-1 mapping
    Two entities, Parent and Child, where a Parent has a Child (privately owned) or zero Child.
    In object model, Parent has an attribute child; Child does not have a parent attribute.
    Two tables, Parent and Child, with constraint where a child record cannot exist without its parent record (i.e. Child table has a foreign key to the Parent table).
    Class Parent and Child are mapped to table Parent and Child respectively.
    How do we define the 1-1 mapping in the Mapping Workbench so that Parent and Child can be inserted into the tables in one unif of work?
    Any comment or help would be greatly appreciated.
    Haiwei

    You can't do this as you described. You must have and map a relationship from child to parent in order to be able to map the 1-1 from parent to child (since your foreign key is in the child table).
    - Don

  • Port mapping question - I need clarification

    I have posted a question about port mapping previously but - although I thought I understood - it is still not working for me. I was hoping there was a kind soul out there who could humor me and explain port mapping with AEBS 802.11n as if there where talking to a 5 year old.
    Thanks for the help and it's ok to laugh.

    {quote:}This address MUST be outside of the range of IP addresses that your 802.11n AirPort Extreme Base Station's (AEBS) DHCP service is providing.{quote}
    This actually is incorrect.
    The statement that the mapped internal address must be static is correct; otherwise the AEBS will not, if the Mac is assigned a different dynamic (DHCP) IP address by the AEBS some time in the future, be able to forward packets to the Mac. However it is very straightforward to have the Mac computer be assigned an address dynamically by the AEBS and to have the AEBS always assign the same IP address to the same Mac computer. Thereby giving the Mac a static address inside the DHCP range.
    In the AirPort utility go to Internet | DHCP | DHCP Reservations. Click "+" then enter the MAC (what Apple calls Ethernet ID if you are using wired or AirPort ID if wireless) hardware address of the Mac computer, give it an IP address, save it. Then that Mac computer will always receive that (static) IP address from the AEBS.
    Why do this? Well by continuing to use DHCP (while having though a static IP address) you keep all the other benefits of DHCP such as automatically having the gateway address, the DNS server addresses given to the Mac. Otherwise you have to enter all this information manually on the computer if you put it outside the DHCP address range. This is very desirable, especially for most home users, as their DNS server entries are provided by their ASP and picked up by the AEBS. If the ASP changes DNS addresses the manually configured Mac machine will not know.
    So in summary - for port forwarding it is NOT necessary for the Mac machine to be outside the DHCP range, in fact _it is desirable to keep it in the DHCP range_ *as long as* the Mac utilises DHCP reservation on the AEBS.
    I have tested this and it works fine.

  • XI mapping question

    Hello,
    I have a situation that I need to run Z-BAPI function before starting mapping in XI. Let me explain scenario with more information.
    1. I need to update a order in the SAP. The order may or may not exists in the SAP.
    2. We have a Z-BAPI function that checks if Order exists in the SAP.
    3. The mapping shall takes place upon sucessfully finding the Order in the SAP. Incase no Order found, mapping should not be done.
    4. The sender sends multiple orders at same time and incase if an order was not in SAP, Mapping should not takes place and move on to next order.
    Now my question is what/how exactly I need to do to avaoid mapping incase an Order has not found and move on to next order in the queue.
    Please let me know.
    Thank you,
    Balaji

    Balaji,
    Just for understanding....
    You are interested in generating outputs only for Order exist  in R/3 system..right?
    I mean do not want to generate XI output in case order do not exist but at the same time it will generate output for remaining orders which exist in the R/3 system..right?
    If so...mean you are not interested whether it runs mapping or not..
    In this case using graphical mapping you can check if order exist in R/3 system( In UDF you can call your ZBAPI to check ) and base on the output of your function module you can decide whether to generate header node or not...
    Let me know if you need more details.
    Nilesh

  • Mapping Question p3: .. etc.. namespace prefixes

    Does anyone know why xi uses namespace prefixes like p3: p2: etc..?  I am trying to map based on an rfc as the target and a message from a wsdl as the source.  I can not test the map because it expects the test file ( from our partner ) to have all these P3:'s in it and it doesn't.  Here is a snippet of what is happening at translation ....
    <p3:Execute2 xmlns:p3="http://www.some/namespace/">
    <p3:transaction-limit type="Amount"><p3:value>99999999999</p3:value></p3:transaction-limit><p3:transaction-limit type="Number"><p3:value> 9999</p3:value></p3:transaction-limit></p3:daily-transaction-limits><p3:single-transaction-limits></p3:single-transaction-limits><p3:monthly-transaction-limits></p3:monthly-transaction-limits></p3:authorization-control><p3:request-type>Activate</p3:request-type>
    Message was edited by: Andrew Alpaugh

    Hi Andrew,
    the question is a little bit unclear to me. When I get you right, you have a WSDL that describes a message you get from a partner. You use this WSDL to define a Message Mapping. The Message Mapping does not work as expected. The fragment you have posted is probably what the Message Mapping seems to expect (according to the test panel). But the message you get from your partner looks different (it does not have all these prefixes).
    I suppose that the schema contained in the WSDL (more precisely in the types-section) states that all elements have to be namespace-qualified (this could e.g. be done by having an elementFormDefault="qualified" in the schema). Thus, if the elements are unqualified in the message you get from your partner it simply means that the partner does not stick to the WSDL.
    If this does not help you, I would have to see the WSDL and an example message that failed to work.
    Note, however that there are different ways to express namespaces. If the document sent by your partner looks as follows:
    <Execute2 xmlns="http://www.some/namespace/">
    <transaction-limit type="Amount">...
    it is logically equivalent to the one you posted, and the Message Mapping will treat them identical.
    Greetings
              Stephan

Maybe you are looking for

  • Will Mountain Lion allow the transfer of photos from iPod to iMac?

    Hi I'm aware that in previous versions of OS X, one can transfer photos actually taken on an iPod touch, but not those previously sent to the ipod by ones iMac. I'm wondering if this inability has been overcome in Mountain Lion. Advice welcomed. Btw,

  • Phone no longer "beeps" with a text message

    Hey all! Love my phone but just today I stopped getting the little "beep" when I recieve a text message and now it just vibrates. The phone is not on silent

  • How to transfer an iPad iPhoto Mobile album to iPhoto or Aperture on my desktopMac???

    I have several photogaphs I downloaded from my camera directly to my iPad 3 and edited using iPhoto Mobile.  I now want to transfer these edited images to my desktop to further edit and refine in Aperture BUT the only images that come up when I conne

  • Macbook Pro 17" Hi-Resolution LED widescreen  question

    I'm thinking about purchasing a Macbook Pro but I was wondering, is it worth spending the extra bucks for graphics and video on the 17" with Hi-Resolution LED widescreen or is the Hi-Resolution LED widescreen meant for HD playback?

  • Battery Serial # for recall

    hi guys I have a 15' Powerbook G4 which requires the battery exchange. The problem is that somehow my battery serial # is not in the range that needs exchange. Numbers in Apple website starts with number 3 or 6, but mine starts with Character "H" Doe