URLConnection vs FORM

Hi ! I have a problem(...)
I am posting creditcardnumbers to a secure site using a form. Works fine, but when I'm trying to create the same URL using URLConnection it looks like the receiver can't handle the request.
This is the form :
<form action="https://MySecureServer:9443/cgi/script?" name="OrderForm">
<INPUT TYPE="hidden" name="Context" VALUE="IYIDjFqCA4g8TVNHKzYrU2ln+">
Cardnumber: <input name=va size=19 maxlength=19>
Month: <input name=vm size= 2 maxlength= 2>
Year: <input name=vy size= 2 maxlength= 2>
CVV2: <input name=vc size= 4 maxlength= 4> <br><br>
<input type="submit" name="Buy" value="Accept order">
</form>
It generates this URL :
https://MySecureServer:9443/cgi/script?BBSePay_transaction=IYIDjFqCA4g8TVNHKzYrU2ln%2B&va=4925000000000004&vm=04&vy=04&vc=&Buy=Accept+order
Which works fine !!!
Im trying this :
URL url = new URL("https://MySecureServer:9443/cgi/script?BBSePay_transaction=" + URLEncoder.encode(context) + "&va=" + URLEncoder.encode(cardNumber) + "&vm=" + URLEncoder.encode(cardMonth) + "&vy=" + URLEncoder.encode(cardYear) + "&vc=" + URLEncoder.encode(cardCv2));          
URLConnection con = url.openConnection();
con.setDoOutput(true);
BufferedReader in = new BufferedReader( new InputStreamReader( con.getInputStream()) );
String newContext = in.readLine();
This is not working :-(
Anyone know what the problem might be ??
With regards, Thor-Arne Iversen
     

Um, no... If you call URLEncoder.encode() on the whole URL string, it'll encode the ? and & and other things as well, thus making the URL invalid. URLEncoder only encodes, it does no URL parsing of it's own, it doesn't care about the URL part itself. You'd just end up with this:
https%3A%2F%2FMySecureServer%3A9443%2Fcgi%2Fscript%3FBBSePay_transaction%3D...
Anyway, it's not working because you are forgetting a line...
URLConnection con = url.openConnection(); // only gives the URLConn object
con.setDoOutput(true); // not sure this is needed, but whatever
con.connect(); // *** Gotta connect or it won't call the server
BufferedReader in = new BufferedReader( new InputStreamReader( con.getInputStream()) );
String newContext = in.readLine();

Similar Messages

  • How to send Parameters FORM to PHP WEB Page with method POST (secure)?

    Hello everyone,
    i hope someone can help me to find a solution to this problem!
    i have to send "+precious+" parameters from an oracle form to php page, like username and password, with a secure method... i tried with WEB.SHOW_DOCUMENT procedure but it uses GET Method and when the web page open up you can read those parameters in the url...no good!
    some suggestion?
    Thank a lot in advance... FMicio

    The other way you have is to make a PJC java bean ...
    which uses HTTPClient library..
    for example:
    PostMethod post = new PostMethod("http://jakarata.apache.org/");
            NameValuePair[] data = {
              new NameValuePair("user", "joe"),
              new NameValuePair("password", "bloggs")
            post.setRequestBody(data);
            // execute method and handle any error responses.
            InputStream in = post.getResponseBodyAsStream();
            // handle response.I have done a multipart form data post to upload files to my db over httpClient.. and other things...
    Or with java.net.* api-s
    try {
        // Construct data
        String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
        data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");
        // Send data
        URL url = new URL("http://hostname:80/cgi");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data);
        wr.flush();
        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
            // Process line...
        wr.close();
        rd.close();
    } catch (Exception e) {
    }Or you can call your web page (post data) from your database
    http://awads.net/wp/2005/11/30/http-post-from-inside-oracle/
    Edited by: Peterv6i on Mar 30, 2012 3:49 PM
    Edited by: Peterv6i on Mar 30, 2012 3:55 PM

  • Can some one give me clear answer how to set timeouts on URLConnection ?

    I am amazed why Sun did not specify a simple method like setReadTimeout
    on URLConnection or provide a way to get refernce to the underlying socket objet. By default the timeout is infinite!
    I am using JDK 1.4 and these appraoches:
    -Dsun.net.client.defaultConnectTimeout=<value in milliseconds>
    -Dsun.net.client.defaultReadTimeout=<value in milliseconds>
    also don't work.
    I do not have access to Socket object. Please help.
    I am using URLConnection in my client application on HTTPS and doing heavy load form POST processing. I tried
    Sockets as well but they don't work. URLConnection works perfectly fine except for the timeouts nightmare.

    OK this might sound crazy but you may have been onto it right from the start. I was having the exact same (frustrating) problem with the URLConnection waiting forever on a dead server and no way to terminate it. I tried something like what you said in your first post:
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");
    and it worked. I played around with the number and it it was apparent to the naked eye that it was working (if you can believe that...).
    Of course, I'm using JDK 1.4.1_01 by now, so this might be different now.
    ttfn.

  • How to update a report  from a form on the same page when form item changes

    I have a portal form from a table and a portal SQL report with a bind variable on a page. I want the report to get updated with details based upon what was selected from a form item. The form item is a selection from a dynamic LOV. Whenever the form item gets changed, the report should get updated to reflect the change. Can this be done using a javascript ONCHANGE event?
    Oracle Portal Version is 10.1.2.2.0.

    Your applet can open an URLConnection and read directly a document from your webserver.
    public String readText() {
      java.net.HttpURLConnection conn = (java.net.HttpURLConnection)myURL.openConnection(); ...
    }So using JavaScript on your page, you might call readText() to fill that textarea.
    The interesting link you gave, handled the JavaScript/Applet interaction. Test that with just return "Hello";.
    The real programming is more interesting.

  • How to submit a html form using java

    hi friends,
    i have a html form with some input fields, when ever a user submit the form the user information is stored in the database. is it possible to pass the user information in the url(url rewriting) and submit it by a java program so that the data will be stored in the database, as like as, user submit it manually.
    for eg:
    /*sample.html*/
    <form action="store.jsp" method="post">
    User Data:<input type="text" name="userdata">
    <input type="submit">
    </form>
    in my java is it possible to store the record as below:
    URL url=new URL("http://localhost:7001/webapp/store.jsp?userdata=AutomaticDatasave");
    URLConnection con=url.openConnection();
    int i=0;
    while((i=con.getInputStream().read())!=-1)
    System.out.print(i);/*it has to print the data that store.jsp is returned like information stored or error storing data(what ever)*/
    }Edited by: rajaram on Oct 27, 2007 1:01 AM

    hi Drclap,
    Thanks for your reply, which is helpful to me....
    tried what you said, what i did is modified the code like below
    con.setDoOutput(true);
    BufferedWriter br=new BufferedWriter(new InputStreamWriter(con.getOutputStream()));
    String str="userdata=AutomateDataSave\n";
    br.write(str,0,str.length());
    br.flush()But
    Iam Getting Internal Server Error
    Exception in thread "main" java.io.IOException: Server returned HTTP response code: 500 for URL
    Edited by: rajaram on Oct 27, 2007 1:24 AM

  • Forms Service verification program problem

    I have a java verification program that is run from a HPUX server cron job to check
    the status of my 9.0.2.12.2 Oracle 9iAS Forms Services running on a
    Windows 2000 server. The program determines if the Forms Services
    restarted after a cold, off-hours backup by retrieving and reading
    base.htm.
    I have 3 windows servers with "identical" configurations of 9iAS Forms
    Services. The java verification program works when running against the dev and
    test Forms servers but not against the production Forms server. It
    did work against the production Forms server until I upgraded to
    9.0.2.12.2 a few months ago. The only way to reproduce the problem
    against the test Forms server is to rename base.htm so the program
    can't find it. default.env,forms90.conf,formsweb.cfg all appear to be
    identical. Paths and other environmental variables are identical on
    the windows Forms servers. The java program fails or succeeds
    consistently on 3 different HPUX servers both in cron and from the
    command line.
    The error message is: java.io.IOException: Server returned HTTP
    response code: 500 for URL:
    http://productionserver:7778/forms90/f90servlet
    Java is 1.3.1 on all environments.
    import java.io.*;
    import java.net.*;
    public class auRLTest
    public auRLTest()
    try {
    System.out.println("Starting...");
    URL url = new URL("http://productionserver:7778/forms90/f90servlet");
    System.out.println("Opening URL connection ("+url+")");
    URLConnection uc = url.openConnection ();
    System.out.println("Connecting to URL");
    uc.connect();
    System.out.println("Opening input stream.");
    BufferedReader in = new BufferedReader(
    new InputStreamReader( uc.getInputStream() ) );
    System.out.println("Reading file...");
    System.out.println("==========================================================================");
    String inputLine = in.readLine();
    while (inputLine != null)
    System.out.println(inputLine);
    inputLine = in.readLine();
    System.out.println("==========================================================================");
    System.out.println("Closing file.");
    in.close();
    System.out.println("Production Form Server is UP");
    catch( java.net.ConnectException connectException ) {
    System.out.println("***PRODUCTION FORM SERVER IS DOWN***.");
    catch( Exception exception ) {
    System.out.println(exception);
    public static void main(String[] args)
    auRLTest uRLTest = new auRLTest();
    Accessing "http://productionserver:7778/forms90/f90servlet" from IE works fine.
    Any clues or ideas are appreciated.
    Thanks

    I went through the same thing. Look at Appendix II "Case Study" at http://rootshell.be/~yong321/freeware/ckweb.html. Basically, the forms servlet needs some more HTTP headers you didn't pass.
    Yong Huang

  • Error log in Adobe Interactive Form

    Hello SDN members,
    I have a problem on Adobe Form rendering. When I used a form in SFP, i would like to print and i have this dump trace in pdf error file log :
    What can be the problem ? (I configured service http in visual administrator in port 8003...)
    Best regards,
    A.HENRY
    Here the log error :
    Caused by: java.io.FileNotFoundException: IO exception while constructing a URLConnection for destination: dest:FP_ICF_DATA_XXX//sap/bc/fp/form/layout/FP_EXAMPLE_01.XDP?fp-language=EN
    at com.adobe.ads.util.FileUtils.getURLStream(FileUtils.java:481)
    at com.adobe.ads.util.FileUtils.getPDFDataFromURL(FileUtils.java:572)
    at com.adobe.ads.util.FileUtils.getPDFDataFromInput(FileUtils.java:200)
    ... 34 more
    Caused by: java.io.IOException: HTTP error: Unauthorized while constructing a URLConnection for destination: dest:FP_ICF_DATA_XXX//sap/bc/fp/form/layout/FP_EXAMPLE_01.XDP?fp-language=EN
    at com.adobe.ads.util.FileUtils.getURLStream(FileUtils.java:472)
    ... 36 more

    The problem is solved. It's coming from ADS_AGENT and ADS_USER profile not properly configured in AS ABAP.
    Best regards,
    A.Henry

  • Is there a workaround for inserting form tags?

    Long time ago some developers found some bugs in the SWING class. The bug seems to appear when an HTML page pasted in the browser. Then the <form>-tags are disappeared while they can be found before pasting the HTML into the browser.
    This is my code so far:
    int pos = 0;
    int i = 0;
    body = getBodyContent();
    JspWriter out = body.getEnclosingWriter();
    HTMLKit = new HTMLEditorKit();
    try {
    out.println(body.getString());
    body.clearBody();
    String theQuery = "http://documentum1.europe.intranet/Docu2store:/list.htm?objectID=" + folderid + "&framed=yes|0&docstart=" + docstart;
    try {
    URL aURL = new URL( theQuery );
    URLConnection conn = aURL.openConnection();
    JEditorPane HTMLPane = new JEditorPane();
    HTMLPane.setContentType("text/html");
    HTMLPane.setPage(aURL);
    HTMLPane.read( new InputStreamReader( conn.getInputStream() ), "Docu2store" );
    //HTMLPane.read( new Reader (conn.getInputStream() ), "Docu2Store" );
    HTMLDoc = (HTMLDocument) HTMLPane.getDocument();
    //HTMLDoc.setBase(new URL ("http://documentum1.europe.intranet/"));
    // Reading the form
    HTMLDocument.Iterator form = HTMLDoc.getIterator(HTML.Tag.FORM);
    //form.next();
    Enumeration formEnum = form.getAttributes().getAttributeNames();
    out.println (form.getAttributes().getAttributeNames());
    out.println (form.getAttributes().getAttribute(formEnum.nextElement()).toString());
    //form.next();
    //out.println (form.getAttributes().getAttribute(formEnum.nextElement()).toString());
    // Reading the links and replace them
    HTMLDocument.Iterator theLinks = HTMLDoc.getIterator(HTML.Tag.A);
    theLinks.next();
    while (theLinks.isValid()) {
    Enumeration theAttsEnum = theLinks.getAttributes().getAttributeNames();
    String theValue = theLinks.getAttributes().getAttribute(theAttsEnum.nextElement()).toString();
    if (theValue.indexOf("sorting", 0) > 0) {
    i++;
    int pageNum = giveItemUrl("docstart", theValue) + 1;
    int startPosLink = theLinks.getStartOffset();
    int endPosLink = theLinks.getEndOffset();
    int linkLength = endPosLink - startPosLink;
    try {
    HTMLDoc.remove(startPosLink, linkLength);
    String fid = giveItemUrlString("objectID", theValue);
    String docstart = giveItemUrlString("docstart", theValue);
    String sorting = giveItemUrlString("sortingfield", theValue);
    HTMLKit.insertHTML(HTMLDoc, endPosLink - 1, "<a href='main.jsp?fid=" + fid + "&docstart="+docstart+"'>" + Integer.toString(pageNum) + "</a>", 0, 0, HTML.Tag.A);
    } catch (BadLocationException ble) {
    ble.printStackTrace();
    out.println( i + "fout" );
    theLinks.next();
    HTMLPane.write(out);

    Insert HTML via InsertHTML() doesn't work! After writing the HTMLDocument, Java inserts extra <html> tags!

  • Manually submit a form without using javascript?

    i'm trying to automate registration of a site by using java (no gui). However there is no direct submit button or form.submit() present in its registration url. Checked the javascript codes and it opens a window, and checks if the window opener is present .
    if (window.opener && !window.opener.closed)
    window.opener.document.theForm.submit();
    window.close();               
    }Is there a solution for this problem?

    I'm trying to access an http url (not mine).
    (1) By setting post variables , I can retrieve the html of the url as string. Here's the code.
         static String getHtml(String url_nm, HashMap variables)
              String html = "";
              String data = "";
              boolean firstRun = true;
              if (variables != null)
                   Set keys = variables.keySet();
                   Iterator iterator = keys.iterator();
                   while (iterator.hasNext())
                        if (firstRun)
                             firstRun = false;
                        else
                             data += "&";
                        String name = iterator.next().toString();
                        try
                             data += URLEncoder.encode(name, "UTF-8") + "=" +
                                  URLEncoder.encode(variables.get(name).toString(), "UTF-8");
                        catch (Exception e1)
              try {
                 URL url = new URL(url_nm);
                 URLConnection conn = url.openConnection();
                 conn.setDoOutput(true);
                 OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                 wr.write(data);
                 wr.flush();
                 BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                 String line;
                 while ((line = rd.readLine()) != null) {
                      html += line;
                 wr.close();
                 rd.close();
             } catch (Exception e) {
                  e.printStackTrace();
              return html;
    [/code
    (2) The problem is even if i set the post variables, i cannot submit the form since the form can only be submitted if i was actually browsing it in a web browser. The html displays a window where the actual submit  form is set (as you can see in my later post) .                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • URLConnection send data to server

    I am using the following code to upload a large binary data to a http
    server.
    URL u = new URL(urlString);
    URLConnection c = u.openConnection();
    c.setDoOutput(true);
    c.setDoInput(true);
    c.setUseCaches(false);
    // set some request headers
    c.setRequestProperty(
    "Connection",
    "Keep-Alive");
    // get codebase of the this (the applet) to use for referer
    c.setRequestProperty(
    "HTTP_REFERER",
    codebase);
    c.setRequestProperty(
    "Content-Type",
    "multipart/form-data; boundary=" + boundary);
    DataOutputStream dstream = new
    DataOutputStream(c.getOutputStream());
    for (int i = 0; i < 1000; i++){
    byte[] data = new byte[1000];
    data = ....
    dstream.write(dataq,0,1000);
    dstream.writeBytes("\r\n--" + boundary + "--\r\n");
    dstream.flush();
    dstream.close();
    I found that the data was never sent. If I put the following line after
    the code above, however, the data got sent. Why?
    c.getInputStream();

    Thank you for your post.
    I have another question. If the data is not update until I call c.getInputString(), how can I monitor the progress of the upload and display the progress with a JProgressBar?
    Thanks,

  • How can my java application fill out an online form

    Hi,
    I am trying to create a Java application that will connect to a URL, fill out the form and submit it.
    How would I go about doing this?
    Thanks in advance,
    Chanie

    I'm doing something exceedingly similar, but I'm not sure how to get it to work, to be honest. Basically, I'm trying to download information from a site that requires a username and password. The html of the site is as follows, as well as my code. Any help would be appreciated!
    <form method="post" action="/cards/FALLON19790309A.php">
    <p>Username:   <input type="text" name="username" size="16" maxlength="16" value=></p>
    <p>Password:   <input type="password" name="password" size="16" maxlength="16"></p>
    <input type="hidden" name="action" value="muffinklezmer">
    <input type="hidden" name="nocache" value="1046986423">
    <input type="submit" value="Log in"></form>
    My code right now looks like this:
    URL playerCard = new URL("http://www.webpage.com");
    URLConnection pcConnection= playerCard.openConnection();     
    pcConnection.setRequestProperty("username","ABCDE");
    pcConnection.setRequestProperty("password","12345");
    BufferedReader in = new BufferedReader(
    new InputStreamReader(
    pcConnection.getInputStream()));
    pcConnection.connect();
    String inputLine = in.readLine();
    while (inputLine != null)
    System.out.println(inputLine);
    inputLine = in.readLine();
    }

  • Can i write from a URLConnection ?

    Can i write from a URLConnection ?
    I can read but can i write on a txt file ?

    You can upload, just as you would upload from an HTML page with a form and a Submit button. That's what you can do.

  • How can i get an Applet transfer data to a servlet like a Form does?

    it is clear that URL class provides way to connect to remote web resource. and furthermore i am trying to make an applet perform like a Form in html to send user data to a servlet. i may adhere a long name-value string to url sent by applet but this is not a good way to hide information like hidden variables. Is there any class in J2SE package that i can wrap those Form data and send them in the way Form does...?
    cheers!

    Double posted
    http://forum.java.sun.com/thread.jspa?threadID=578770&messageID=2913924#2913924
    In your other post:
    but i just don't want to build a string with serlet name followed by many NV pairs tthis is a GET request:
    myURL?name=value&name=value
    To use a POST
    http://javaalmanac.com/egs/java.net/Post.html
    This still requires you to make a VP string that you write to an outputstream of the
    URLConnection. There is no other way to do this unless in an applet.

  • How can I check the return status of a request using URLConnection?

    Hi,
    I am using the classes URL and URLConnection to connect to a remote server and make a POST request. The code extract is:
    URL u = new URL("http://.....");
    URLConnection con = u.openConnection();
    con.setDoInput(true);
    con.setDoOutput(true);
    con.setUseCaches(false);
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    DataOutputStream out = new DataOutputStream(con.getOutputStream());
    out.writeBytes(........);
    out.flush();
    out.close();
    Next, I would like to check the return status of my request. I need to see if the server returned status 200 (OK) or an error (e.g. 404). Is there a way to check this?
    If you are aware of another way I can achieve this whole thing I would be grateful if you could let me know.
    Thanks very much for your help!

    URLConnection doesn't have a getResponseCode
    method...
    But I found a link
    http://bugs.sun.com/bugdatabase/view_bug.do;:WuuT?bug_
    id=4191207
    that helped me found out that there is another class
    called HttpURLConnection:
    ((HttpURLConnection)conn).getResponseCode( )You should read the API:
    http://java.sun.com/j2se/1.5.0/docs/api/java/net/URL.html#openConnection()
    "If for the URL's protocol (such as HTTP or JAR), there exists a public, specialized URLConnection subclass belonging to one of the following packages or one of their subpackages: java.lang, java.io, java.util, java.net, the connection returned will be of that subclass. For example, for HTTP an HttpURLConnection will be returned,..."

  • Attach Forms With Comm Port in Oracle Forms

    I am trying to make connection of Oracle forms Builder with my device using comm port but i dnt know the complete procedure to attach the comm with oracle forms also i have no idea to convert asquii data to normal form.Please any one help me to attach comm port with my oracle forms and also convert asqui code which is showing on hyper terminal into normal data.Also I am using oracle forms 6i

    Make a java component (PJC) and use a rxtx library (http://rxtx.qbang.org/wiki/index.php/Examples) ...
    I have made a PJC to use a RS232 port from oracle forms for Hypercom POS terminal..
    Here is my code (in short i will post a component on PJC site (here I can't post a complete code because of 30000 char limit ;) )..
    If you look in method "public void init(IHandler handler) " I make a download of rxtxSerial.dll from my forms server and then I call System.loadLibrary("rxtxSerial");"
    In other way you must put the dll in windows/system32 path.. This dll is native library for rs232 communication.
    If you look at the method "public void doTransaction" you can see the initialization of comm port...
    With inputStream and OutputStream you read and write datas to/from your rs232 port..
    p.s: the code is not complete but you can see how I made the rs232 communication (also the code is not final ;) )
    ====================================================
    public class PosTerminalPjc extends VBean {
         private static final long serialVersionUID = -8814623494538014849L;
         Properties res = new Properties();
         SerialPort serialPort;
         OutputStream os;
         InputStream is;
         CommPortIdentifier portId;
         Enumeration portList;
         IHandler mHandler;
      Random randomGenerator = new Random();
            char STX = 2;
         char ETX = 3;
         char EOT = 4;
         char ACK = 6;
         char NAK = 15;
         char FS = 28;
         private static final ID COMPORT         = ID.registerProperty("COMPORT"); // serial port (COM1,COM2,COM3,...)
         private static final ID AMOUNT          = ID.registerProperty("AMOUNT"); // amount of the transaction (12)
         private static final ID TRANSACTIONTYPE = ID.registerProperty("TRANSACTIONTYPE"); // SALE, REFUND
      private static final ID EXECUTE         = ID.registerProperty("EXECUTE"); // invoke doTransaction();
      //Output parameters to form
      private static final ID TRANSACTIONPROCESSED  = ID.registerProperty("TRANSACTIONPROCESSED");
      private static final ID TRANSACTIONFLAG       = ID.registerProperty("TRANSACTIONFLAG");
      private static final ID TRANSACTIONNUMBER     = ID.registerProperty("TRANSACTIONNUMBER");
      private static final ID BATCHNUMBER           = ID.registerProperty("BATCHNUMBER");
      private static final ID TRANSACTIONDATE       = ID.registerProperty("TRANSACTIONDATE");
      private static final ID TRANSACTIONTIME       = ID.registerProperty("TRANSACTIONTIME");
      private static final ID TRANSACTIONAMOUNT     = ID.registerProperty("TRANSACTIONAMOUNT");
      private static final ID CARDDATASOURCE        = ID.registerProperty("CARDDATASOURCE");
      private static final ID NUMBERCUSTOMERCARD    = ID.registerProperty("NUMBERCUSTOMERCARD");
      private static final ID EXPIRATIONDATE        = ID.registerProperty("EXPIRATIONDATE");
      private static final ID TERMINALID            = ID.registerProperty("TERMINALID");
      private static final ID MERCHANTID            = ID.registerProperty("MERCHANTID");
      private static final ID COMPANYNAME           = ID.registerProperty("COMPANYNAME");
      private static final ID SEQUENTIALNUMBER      = ID.registerProperty("SEQUENTIALNUMBER");
      private static final ID ERRORDESC             = ID.registerProperty("ERRORDESC");
         //Events
      private static final ID EVT_OK  = ID.registerProperty("EVT_OK"); //custom event if all ok
      private static final ID EVT_ERR = ID.registerProperty("EVT_ERR"); //custom event if error occured
      // state machine variables
         long l_timeout;
         long l_wait_for = 5000; // pos terminal wait for command (5 seconds)
         long l_wait_for_transaction = 62000 * 2; // pos terminal timeout
         long l_second = 1000; // one second
         byte b_retry = 0;
         String dataValue = "";
      byte[] readBuffer = new byte[2000]; //2000 bytes buffer to read rs232 stream
         String comPort = ""; // local variable to store com port name
                                       // (COM1,COM2,...)
         String transactionType = "SALE"; // type of transaction to be executed (SALE
                                                      // or REFUND) default SALE
         String amount = "0"; // default amount value is set to 0
         //output paramerers
      String transactionProcessed = "";
      String transactionFlag = "";
      String transactionNumber = "";
      String batchNumber = "";
      String transactionDate = "";
      String transactionTime = "";
      String transactionAmount = "";
      String cardDataSource = "";
      String numberCustomerCard = "";
      String expirationDate = "";
      String terminalId = "";
      String merchandId = "";
      String companyName = "";
      String sequentialNumber ="";
      String errorDescription;
        public PosTerminalPjc() {
              super();
              System.out.println("============================");
              System.out.println("== State machine POS v1.0 ==");
              System.out.println("== Peter Valencic (c)     ==");
              System.out.println("== 03.04.2012             ==");
              System.out.println("============================");
        System.out.println("java.library.path: "+System.getProperty("java.library.path"));
              try {
                   res.load(this.getClass().getResourceAsStream("/res/language.properties")); // load language file
              } catch (Exception ex) {
                   System.err.println("Err loading language.properties file: "
                             + ex.toString());
      public void init(IHandler handler)
        super.init(handler);
        this.mHandler = handler;
        System.out.println("init handler ok");
        System.out.println("code base: "+handler.getCodeBase());
        //load dll from codeBase URL
        try
          String mylibName = "rxtxSerial.dll";
          String URLpath = "http://dekani:7777/forms/java/";
          System.out.println("URL: "+ URLpath + mylibName);
          URL libUrl = new URL(URLpath+mylibName);
          System.out.println("libUrlgetFile: " + libUrl.getFile());
          File file = new File(mylibName);
          System.out.println(file);
          if (!file.exists())
          file.createNewFile();
          URLConnection urlc = libUrl.openConnection();
          InputStream in = urlc.getInputStream();
          FileOutputStream out = new FileOutputStream(file);
          byte[] buffer = new byte[1048];
          int read;
          while ((read = in.read(buffer)) != -1){
             out.write(buffer, 0, read); // write
            out.close();
            in.close();
            System.loadLibrary("rxtxSerial");
        catch(Exception exc)
          System.err.println("Exception SystemLoadLibrary: " + exc.toString());
          this.showError(res.getProperty("s_dlg_err_title"),res.getProperty("s_lib"));
      private void doTransaction() throws Exception {
        String sequentialNumber = ""+getRandomInteger(1000,9000,randomGenerator);
              String phase = null; // initial null value for state machine phase
              long l_ack_timeout = 0; //initial value for acknowledge timeout
              // com port check
              if (getComPort().trim().equalsIgnoreCase("")) {
                   this.showError(res.getProperty("s_dlg_err_title"),
                             res.getProperty("s_com_invalid"));
              if (this.mHandler != null)
                                CustomEvent ce = new CustomEvent(this.mHandler, EVT_ERR);
                                this.setErrorDescription(res.getProperty("s_com_invalid"));
                                dispatchCustomEvent(ce);
                   return;
              // transaction type chek
              System.out.println(this.getTransactionType());
              if (!getTransactionType().equalsIgnoreCase("REFUND")
                        & !getTransactionType().equalsIgnoreCase("SALE")
            & !getTransactionType().equalsIgnoreCase("TICKET")
            & !getTransactionType().equalsIgnoreCase("VOID")
                   this.showError(res.getProperty("s_dlg_err_title"),res.getProperty("s_tran_invalid_type"));
          if (this.mHandler != null)
                                CustomEvent ce = new CustomEvent(this.mHandler, EVT_ERR);
                                this.setErrorDescription(res.getProperty("s_tran_invalid_type"));
                                dispatchCustomEvent(ce);
                   return;
              portList = portId.getPortIdentifiers();
              while (portList.hasMoreElements()) {
                   portId = (CommPortIdentifier) portList.nextElement();
          System.out.println(portId.getName());
                   if (portId.getName().equalsIgnoreCase(this.getComPort())) {
                        System.out.println("Port is used : "
                                  + portId.isCurrentlyOwned());
                        serialPort = (SerialPort) portId.open("ComDriver", 2000);
                        serialPort.setSerialPortParams(9600, SerialPort.DATABITS_7,
                                  SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN);
                        serialPort.notifyOnDataAvailable(true);
                        serialPort.notifyOnOutputEmpty(true);
                        os = serialPort.getOutputStream();
                        is = serialPort.getInputStream();
                        break;
              if (portId == null) {
              this.showError(res.getProperty("s_dlg_err_title"),res.getProperty("s_com_not_found"));
          if (this.mHandler != null)
                                CustomEvent ce = new CustomEvent(this.mHandler, EVT_ERR);
                                this.setErrorDescription(res.getProperty("s_com_not_found"));
                                dispatchCustomEvent(ce);
                   return;
        else if (portId.getName().equalsIgnoreCase(this.getComPort()) == false)
                  this.showError(res.getProperty("s_dlg_err_title"),res.getProperty("s_com_not_found"));
          if (this.mHandler != null)
                                CustomEvent ce = new CustomEvent(this.mHandler, EVT_ERR);
                                this.setErrorDescription(res.getProperty("s_com_not_found"));
                                dispatchCustomEvent(ce);
          return;
              // state machine infinite loop
              while (true)
                   // SEND DATA TO POS TERMINAL
                   if (phase == null)
                        System.out.println("start phase");
                        byte[] req = null;
                        //verify transaction type to be SALE or REFUND
                        //if REFUND then transaction number must be specified
                        if (getTransactionType().equalsIgnoreCase("SALE")) {
                             System.out.println("--> SALE send message to the pos terminal");
                             System.out.println("--> amount: " + amount);
                             req = protocolStream("000000"+sequentialNumber+"01100" + FS + amount + FS
                                       + FS + "+0" + FS + "978" + FS + FS + FS + FS + FS
                                       + FS + FS + ETX);
                        else if (getTransactionType().equalsIgnoreCase("REFUND")) {
                             System.out.println("--> REFUND send message to the pos terminal");
                             System.out.println("--> amount: " + amount);
                             System.out.println("--> transaction number: " + getTransactionNumber());
                             req = protocolStream("000000123405100" + getTransactionNumber() + FS + amount
                                       + FS + FS + "+0" + FS + "978" + FS + FS + FS + FS
                                       + FS + FS + FS + ETX);
            else if (getTransactionType().equalsIgnoreCase("VOID")) {
                             System.out.println("--> VOID transaction");
                             System.out.println("--> amount: " + amount);
                             System.out.println("--> transaction number: " + getTransactionNumber());
                             req = protocolStream("000000123410100" + getTransactionNumber() + FS      + FS + FS + "+0" + FS + "978" + FS + FS + FS + FS
                                       + FS + FS + FS + ETX);
            else if (getTransactionType().equalsIgnoreCase("TICKET")) {
                             System.out.println("--> TICKET duplicate");
                               req = protocolStream("000000123413100" + getTransactionNumber() + FS      + FS + FS + "+0" + FS + "978" + FS + FS + FS + FS
                                       + FS + FS + FS + ETX);
            else {
                             //nothing ;)
                        os.write(req);
                        os.flush();
                        l_ack_timeout = System.currentTimeMillis() + 1500;
                        //wait for half second
                        Thread.sleep(500);
                        l_timeout = System.currentTimeMillis() + l_wait_for; //add some time for timeout
                        phase = "TO_POS_ACK";
                        System.out.println("phase: " + phase);
                   }//phase null
                   //CHECK IF THE TIMEOUT OCCURED
                if (phase.equalsIgnoreCase("TO_POS_ACK") & (l_timeout < System.currentTimeMillis()) & (b_retry < 4))
                    b_retry += 1;
                    System.out.println("TIMEOUT: " + b_retry);
                    l_timeout = System.currentTimeMillis() + l_wait_for;
                    if (b_retry >= 4) {
                        System.out.println("Timeout occured");
                        closePort();
                        this.showError(res.getProperty("s_dlg_err_title"),res.getProperty("s_timeout"));
                        break;
              //CHECK FOR THE ACKNOWLEDGE (FIRST RESPONSE FROM POS TERMINAL)
                if (phase.equalsIgnoreCase("TO_POS_ACK") &
                        (l_ack_timeout < System.currentTimeMillis())) {
                    try {
                        int numBytes = 0;
                        dataValue = "";
                        while ((numBytes = is.read(readBuffer)) > 0) {
                            dataValue += new String(readBuffer, 0, numBytes, "ASCII");
                        if (dataValue.getBytes().length > 0) {
                            System.out.println("->first byte: " +
                                dataValue.getBytes()[0]);
                            System.out.println("total length: " +
                                dataValue.getBytes().length);
                            //check for ack byte
                            if (dataValue.getBytes()[0] == 6) {
                                System.out.println(
                                    "<--ACKNOWLEDGE received from pos terminal");
                                phase = "WAIT_FOR_TRANSACTION";
                                l_timeout = System.currentTimeMillis() + l_wait_for_transaction;
                                System.out.println("-> wait for transaction response");
                    } catch (IOException ev) {
              //WAIT FOR TIMEOUT ON MESSAGE (watch dog timer)
                if (phase.equalsIgnoreCase("WAIT_FOR_TRANSACTION") &
                        (l_timeout < System.currentTimeMillis())) {
                    System.out.println(
                        "Error receiving response from pos terminal!!!");
                    closePort();
                    this.showError(res.getProperty("s_dlg_err_title"),
                                 res.getProperty("s_response_error"));
                  if (this.mHandler != null)
                    CustomEvent ce = new CustomEvent(this.mHandler, EVT_ERR);
                    this.setErrorDescription(res.getProperty("s_response_error"));
                    dispatchCustomEvent(ce);
                    break;
              //WAIT FOR SOME DATA TO COME FROM POS TERMINAL OVER RS232
                if (phase.equalsIgnoreCase("WAIT_FOR_TRANSACTION")) {
                    try {
                        int numBytes = 0;
                        dataValue = "";
                        Thread.sleep(500);
                        while ((numBytes = is.read(readBuffer)) > 0) {
                            dataValue += new String(readBuffer, 0, numBytes, "ASCII");
                        if (dataValue.getBytes().length > 0) {
                            System.out.println("->first byte: " +
                                dataValue.getBytes()[0] + "|" +
                                dataValue.getBytes()[1]);
                            System.out.println("->ascii: " + dataValue);
                            System.out.println("total length: " +
                                dataValue.getBytes().length);
                            if (dataValue.indexOf("PREKINIL UPORABNIK") != -1) {
                                System.out.println(
                                    "Uporabnik je prekinil povezavo!");
                                  closePort();
                                //transaction cancelled by user s_user_cancel
                                this.showError(res.getProperty("s_dlg_err_title"),
                                             res.getProperty("s_user_cancel"));
                              if (this.mHandler != null)
                                CustomEvent ce = new CustomEvent(this.mHandler, EVT_ERR);
                                this.setErrorDescription(res.getProperty("s_user_cancel"));
                                dispatchCustomEvent(ce);
                                break;
                            if (dataValue.indexOf("NAPACEN VNOS") != -1) {
                                System.out.println("Napačen vnos");
                                closePort();
                                //invalid user entry
                                this.showError(res.getProperty("s_dlg_err_title"),
                                             res.getProperty("s_user_invalid_entry"));
                               if (this.mHandler != null)
                                CustomEvent ce = new CustomEvent(this.mHandler, EVT_ERR);
                                this.setErrorDescription(res.getProperty("s_user_invalid_entry"));
                                dispatchCustomEvent(ce);
                                break;
                            if (dataValue.indexOf("PROSIM POCAKAJ") != -1) {
                                System.out.println("<-- PROSIM POCAKAJ");
                                continue;
                            //preberemo podatke iz stringe terminala
                            if (dataValue.indexOf("SPREJETO") != -1) {
                                closePort();
                                System.out.println("<-- TRANSAKCIJA SPREJETA");
                                System.out.println(dataValue);
                                StringTokenizer st = new StringTokenizer(dataValue, "\034" );
                                String dv = st.nextToken();
                                sequentialNumber = dv.substring(6,10);
                                transactionProcessed = dv.substring(1, 3);
                                transactionFlag = dv.substring(13,15);
                                transactionNumber = dv.substring(15,21);
                                batchNumber = dv.substring(21,25);
                                transactionDate = dv.substring(25,31);
                                transactionTime = dv.substring(31,37);
                                transactionAmount = st.nextToken();
                                st.nextToken(); //Amount exponent
                                st.nextToken(); //Amount currency
                                cardDataSource = st.nextToken();
                                numberCustomerCard = st.nextToken();
                                expirationDate = st.nextToken();
                                st.nextToken(); // authorization code
                                terminalId = st.nextToken();
                                merchandId = st.nextToken();
                                companyName = st.nextToken();
                                System.out.println("================");
                                System.out.println(transactionProcessed);
                                System.out.println(transactionFlag);
                                System.out.println(transactionNumber);
                                System.out.println(batchNumber);
                                System.out.println(transactionDate);
                                System.out.println(transactionTime);
                                System.out.println(transactionAmount);
                                System.out.println(cardDataSource);
                                System.out.println(numberCustomerCard);
                                System.out.println(expirationDate);
                                System.out.println(terminalId);
                                System.out.println(merchandId);
                                System.out.println(companyName);
                                if (this.mHandler != null)
                                  System.out.println("dispatch custom event");
                                  CustomEvent ce = new CustomEvent(this.mHandler, EVT_OK);
                                  dispatchCustomEvent(ce);
                                return;
                    } catch (IOException ev) {
                      System.err.println("Exception sm: " + ev.toString());
                System.out.print('*');
                Thread.sleep(200);
              }//end state machine loop
          * protocolStream prepare the stream to be send over RS232 to POS terminal
          * with LRC cheksum control
          * @param data
          * @return byte[]
         private byte[] protocolStream(String data) {
              char STX = (char) 0x02;
              String tmp = "" + STX + STX + data + "" + getLRC(data);
              System.out.println("PStream: " + tmp);
              for (int i = 0; i < tmp.getBytes().length; i++) {
                   System.out.print(tmp.getBytes() + ":");
              return tmp.getBytes();
    * close port and stream
    private void closePort()
    try {
    serialPort.close();
    is.close();
    os.close();
    } catch (Exception ee) {
         * Longitudinal Redundancy Check (LRC)
         * @param packet
         * @return String
         private String getLRC(String packet) {
              char[] splitPacket = packet.toCharArray();
              char lrc = 0x00;
              for (int x = 0; x < splitPacket.length; x++) {
                   lrc = (char) (lrc ^ splitPacket[x]);
              return "" + (char) lrc;
         private String paddingString(String s, int n, char c, boolean paddingLeft) {
              if (s == null) {
                   return s;
              int add = n - s.length(); // may overflow int size... should not be a
              if (add <= 0) {
                   return s;
              StringBuffer str = new StringBuffer(s);
              char[] ch = new char[add];
              Arrays.fill(ch, c);
              if (paddingLeft) {
                   str.insert(0, ch);
              } else {
                   str.append(ch);
              return str.toString();
    public boolean setProperty(ID id, Object value)
    if (id.toString().equalsIgnoreCase("COMPORT")) {
    setComPort((String)value);
    System.out.println("RS232 com port: " + getComPort());
    return false;
    if (id.toString().equalsIgnoreCase("AMOUNT")) {
    this.setAmount((String)value);
    System.out.println("Amount value: " + getAmount());
    return false;
    if (id.toString().equalsIgnoreCase("TRANSACTIONTYPE")) {
    this.setTransactionType((String)value);
    System.out.println("Transaction Type value: " + this.getTransactionType());
    return false;
    if (id.toString().equalsIgnoreCase("EXECUTE")) {
    System.out.println("Invoke pos terminal");
    try
    doTransaction();
    catch(Exception ex)
    System.err.println("Execute Exception>> " + ex.toString());
    this.showError(res.getProperty("s_dlg_err_title"),res.getProperty("s_gen_exception"));
    return false;
    return false;
         * Display error message inside oracle form
         * @param title
         * @param exceptionString
         private void showError(String title, String exceptionString) {
              JOptionPane.showMessageDialog(this, exceptionString, title, 0);
    Edited by: peterv6i.blogspot.com on May 8, 2012 10:18 AM
    Edited by: peterv6i.blogspot.com on May 8, 2012 10:20 AM
    Edited by: peterv6i.blogspot.com on May 8, 2012 10:21 AM

Maybe you are looking for

  • Error while running the diagnositc system setup wizard

    Hello All, When I am running the diagnstics setup wizard,I am getting the following warning for SSO.SMD is the SID for my solution manager system and it is ABAP+JAVA system: SSO Setup : both Java and Abap stacks are using a ticket certificate with id

  • Scripts-window is not printing repetedly

    Hi all am working on scripts.(Goods receipt note). I have four line items in main window from  mseg table. I have to display text related to that line items which is stored in mseg-sgtxt in seperate widow.(eg: remarks) But am getting the last line it

  • How to use select max and min query..

    hi gurus, we have got a custom report for develoment. the report has to fetch the max and min salarys department wise.... how to pick up max & min sal ansal from table pa0008.

  • Transport Issue - no conversion of source system name

    Hi Experts, I'm desparetly trying to import an transport request containing a transformation into my PRD System . At stage of method execution it fails with RC=8. Error MSG: The DataSource MY_DS  (MY_DEV_SYS) does not exist in object version A in PRO

  • Problem using custom tag library in portlet's jsp

    Hi, I created a custom portlet (a JSR 168 portlet) and I'm using a tag library that I previously developed. Normally it works fine, but sometimes I get a ClassCastException. Once I redeploy the portlet everything works again. This is Oracle Portal 10