Friday, September 9, 2016

UTL_FILE and newline character



Two different objections:
1. 1. "The answer using CHR(10) is not correct as CHR(10) is not the platform-specific line terminator(s) on Windows and some other OSs".
2. 2. "The answers that put a newline after "abc" are not valid answers according to your specification."
We'll answer each objection in turn.

CHR(10)
We can certainly understand the response we got, since we felt the same way when it was initially brought to our attention. At that point, however, we took a closer look and discovered some very interesting behavior by Oracle and UTL_FILE regarding the handling of line terminators. 
It is correct that CHR(10) (LineFeed or LF) is not the platform-specific line terminator(s) on Windows (that would be CHR(13) || CHR(10) -- CarriageReturn + LineFeed or CF + LF) but the file is opened in text mode (default) so Oracle translates any LF to the platform-specific line terminator(s) on the platform of the host. So if it runs on Windows, LF is translated to CR + LF, if it runs on Linux, LF stays as LF.

This can be verified on Windows through the following code sample (assuming that the directory TEMP points to c:\temp):
host del c:\temp\quiz.txt
DECLARE
l_file UTL_FILE.file_type;
BEGIN
l_file := UTL_FILE.FOPEN('TEMP', 'quiz.txt', 'W');
UTL_FILE.PUT (l_file, 'First' || chr(10));
UTL_FILE.PUT (l_file, 'Second' || chr(13) || chr(10));
UTL_FILE.PUT (l_file, 'Third' || chr(10) || chr(13));
UTL_FILE.PUT_LINE (l_file, 'Fourth');
UTL_FILE.PUTF (l_file, 'Fifth\n');
UTL_FILE.FCLOSE (l_file);
END;
/
host debug c:\temp\quiz.txt
If you're on Windows Vista or newer, debug is no longer part of your Windows version. ). To get a hex dump of a file under Windows one can use a free utility called HexDump32:

This will demonstrate that the contents of the file is actually (OD = CR, 0A = LF):
00000000 46 69 72 73 74 0D 0A 53-65 63 6F 6E 64 0D 0D 0A First..Second...
00000010 54 68 69 72 64 0D 0A 0D-46 6F 75 72 74 68 0D 0A Third...Fourth..
00000020 46 69 66 74 68 0D 0A - Fifth..
So when a file is opened in text mode, UTL_FILE does this:
1. First: CHR(10) is written as OD OA, CHR(13) + CHR(10).
2. Second: CHR(13) || CHR(10) is written as OD OD OA, CHR(13) + CHR(13) + CHR(10).
3. Third: CHR(10) || CHR(13) is written as OD OA OD, CHR(13) + CHR(10) + CHR(13).
4. Fourth: PUT_LINE correctly puts OD OA, CHR(13) + CHR(10).
5. Fifth: PUTF correctly puts \n as OD OA, CHR(13) + CHR(10).
On Linux, you can similarly verify the behavior (assuming that the directory TEMP points to /tmp):
host rm /tmp/quiz.txt
DECLARE
l_file UTL_FILE.file_type;
BEGIN
l_file := UTL_FILE.FOPEN('TEMP', 'quiz.txt', 'W');
UTL_FILE.PUT (l_file, 'First' || chr(10));
UTL_FILE.PUT (l_file, 'Second' || chr(13) || chr(10));
UTL_FILE.PUT (l_file, 'Third' || chr(10) || chr(13));
UTL_FILE.PUT_LINE (l_file, 'Fourth');
UTL_FILE.PUTF (l_file, 'Fifth\n');
UTL_FILE.FCLOSE (l_file);
END;
/
host hexdump –C /tmp/quiz.txt
Why does Oracle do this? Probably because UTL_FILE is implemented in C and this is how it's done in C's functions fopen and fprintf when a file is opened in text mode. Admittedly, it's not well described in the Oracle documentation.
You can also open files with UTL_FILE in byte mode but in this case you can only use procedures PUT_RAW and GET_RAW. If you use any of the other subprograms UTL_FILE will raise an UTL_FILE.INVALID_OPERATION exception. With byte mode, Oracle doesn't do any translation of newline characters, which is demonstrated in the following (to be run under Windows):
host del c:\temp\quiz.bin
DECLARE
l_file UTL_FILE.file_type;
BEGIN
l_file := UTL_FILE.FOPEN('TEMP', 'quiz.bin', 'wb');
UTL_FILE.PUT_RAW (l_file, utl_raw.cast_to_raw('First' || chr(10)));
UTL_FILE.PUT_RAW (l_file, utl_raw.cast_to_raw('Second' || chr(13) || chr(10)));
UTL_FILE.PUT_RAW (l_file, utl_raw.cast_to_raw('Third' || chr(10) || chr(13)));
UTL_FILE.FCLOSE (l_file);
END;
/
host debug c:\temp\quiz.bin
This demonstrates the following contents:
00000000 46 69 72 73 74 0A 53 65-63 6F 6E 64 0D 0A 54 68 First.Second..Th
00000010 69 72 64 0A 0D - ird..

Newline after "abc"
We argue that the line terminator (= newline) is part of the line (like an End Of File is part of a file so is End Of Line part of a line) so as long as "abc" is put on a separate line (with optional line terminator), coming after 2 empty lines (with line terminator) the code meets the specification.



Wednesday, April 6, 2016

KILLING A WINDOWS SERVICE THAT IS KEEP ON "STOPPING"




Find out the Service Name

To do this, go in to services and double click on the service which has stuck.  Make a note of the “Service Name”.

Find out the PID of the service

Open an elevated command prompt and type in:
sc queryex servicename
(where servicename is the name of the service you obtained from Step 1.)
Make note of the PID

Kill the PID

From the same command prompt type in:
taskkill /f /pid [PID]
Where [PID] is the service number.
If it is successful you should receive the following message:
SUCCESS: The process with PID XXXX has been terminated.



Monday, March 14, 2016

The constructor Service(URL, QName, WebServiceFeature[]) is undefined






You had produced code that needs JAX-WS 2.1. Version 2.0 does not have WebServiceFeature class, and as result also not constructor in Service with such a argument type.


Additional option "-target 2.0" while using wsimport to generate source codes for JAX-WS 2.0 and so on.


Change your JAX-WS in the preferences. It is compatibility issue for Java 6 SE and Java EE


Changing from Java 1.6 to Java 1.7 also solves this issue.

You can manually add webservices-api.jar from JAX-WS 2.2 API





Tuesday, February 3, 2015

conversation history in “Pidgin Messenger” using Ubuntu



All the messenger logs will be stored under .purple directory located in your home directory.

cd ~/.purple/logs/yahoo/
 
this is the location where all your yahoo messenger chat logs will be stored.
You can also view the logs by selecting "Conversation -> View Log" when you have the contact window opened.

To send a message to a offline contact, use "Offline Message Emulation". Open "Tool->Plugins" and make sure you have selected "Offline Message Emulation". This will save the message you sent to a offline contact and the message will be delivered once he is online.

If you are offline and a contact sends you a message that will be delivered to you when you come online.

There are other good plugins for pidgin. To install the extra plugins use the command

 sudo apt-get install pidgin-plugin-pack 
 
 
 
 
 
source:askubuntu.com 

Wednesday, August 20, 2014

Subhash kewat's invitation is awaiting your response

 
 
Subhash kewat would like to connect on LinkedIn. How would you like to respond?
Subhash kewat
Subhash kewat
Senior Software Developer at UST Global
Confirm you know Subhash
You are receiving Reminder emails for pending invitations. Unsubscribe
© 2014, LinkedIn Corporation. 2029 Stierlin Ct. Mountain View, CA 94043, USA

Wednesday, August 13, 2014

I'd like to add you to my professional network on LinkedIn

 
Subhash kewat would like to stay in touch on LinkedIn.
Hi SubhBlog,
I'd like to add you to my professional network on LinkedIn.
- Subhash
Confirm that you know Subhash
Subhash kewat
Subhash kewat
Senior Software Developer at UST Global
Bengaluru Area, India
You are receiving Invitation to Connect emails. Unsubscribe
This email was intended for SubhBlog Dev. Learn why we included this.
© 2014, LinkedIn Corporation. 2029 Stierlin Ct. Mountain View, CA 94043, USA

Tuesday, August 5, 2014

DOM, SAX and StAX



DOM, SAX and StAX



SAX is a uni-directional, read only API and follows push model for reading. Read below to know about push reading. SAX and StAX are relatives compared to DOM as DOM uses a completely different approach for XML processing.
DOM parser is created using the concept of trees. XML document object model will be completely constructed as a tree and stored in memory. Then the XML document can be parsed by traversing the tree. This requires lot of memory and processing power. When working with small documents are fine with this kind of DOM processing but when you have a long document and then we will have performance issues.
StAX follows a streaming model, it can both read and write. Imagine feeding a whole XML document via a tube. At every moment one XML element will be the focus and then we move on to the next element either in forward or backward direction of our choice. This is kind of processing is not something new for us, we have seen ResultSet of JDBC API. Streaming has its advantage when we want to process large documents sequentially. Irrespective of size of the document the performance will be good. When mobile phones and apps are getting popular we also need to think of processing in terms of smaller scale compared to desktops and servers.
The sample XML considered in the examples is:

  Rakesh  Mishra  Bangalore


  John  Davis  Delhi

  Rajesh  Sharma  Pune

And the obejct into which the XML content is to be extracted is defined as below:

class Employee{String id;String firstName;String lastName;String location;@Overridepublic String toString() {  return firstName+" "+lastName+"("+id+")"+location;}}


There are 3 main parsers for which I have given sample code:

  • DOM Parser
  • SAX Parser
  • StAX Parser

Using DOM Parser

DOM parser implementation that comes with the JDK using JDK 7. The DOM Parser loads the complete XML content into a Tree structure. And we iterate through the Node and NodeList to get the content of the XML. The code for XML parsing using DOM parser is given below.

public class DOMParserDemo {public static void main(String[] args) throws Exception {  //Get the DOM Builder Factory  DocumentBuilderFactory factory =      DocumentBuilderFactory.newInstance();  //Get the DOM Builder  DocumentBuilder builder = factory.newDocumentBuilder();  //Load and Parse the XML document  //document contains the complete XML as a Tree.  Document document =    builder.parse(      ClassLoader.getSystemResourceAsStream("xml/employee.xml"));  List empList = new ArrayList<>();  //Iterating through the nodes and extracting the data.  NodeList nodeList = document.getDocumentElement().getChildNodes();  for (int i = 0; i < nodeList.getLength(); i++) {    //We have encountered an tag.    Node node = nodeList.item(i);    if (node instanceof Element) {      Employee emp = new Employee();      emp.id = node.getAttributes().          getNamedItem("id").getNodeValue();      NodeList childNodes = node.getChildNodes();      for (int j = 0; j < childNodes.getLength(); j++) {        Node cNode = childNodes.item(j);        //Identifying the child tag of employee encountered.        if (cNode instanceof Element) {          String content = cNode.getLastChild().              getTextContent().trim();          switch (cNode.getNodeName()) {            case "firstName":              emp.firstName = content;              break;            case "lastName":              emp.lastName = content;              break;            case "location":              emp.location = content;              break;          }        }      }      empList.add(emp);    }  }  //Printing the Employee list populated.  for (Employee emp : empList) {    System.out.println(emp);  }}}class Employee{  String id;  String firstName;  String lastName;  String location;  @Override  public String toString() {    return firstName+" "+lastName+"("+id+")"+location;  }

The output:

Rakesh Mishra(111)Bangalore
John Davis(112) 
Delhi
Rajesh Sharma(113)Pune

Using SAX Parser
SAX Parser is different from the DOM Parser where SAX parser doesn’t load the complete XML into the memory, instead it parses the XML line by line triggering different events as and when it encounters different elements like: opening tag, closing tag, character data, comments and so on. This is the reason why SAX Parser is called an event based parser.
Along with the XML source file, we also register a handler which extends the DefaultHandler class. The DefaultHandler class provides different callbacks out of which we would be interested in:
  • startElement() – triggers this event when the start of the tag is encountered.
  • endElement() – triggers this event when the end of the tag is encountered.
  • characters() – triggers this event when it encounters some text data.
The code for parsing the XML using SAX Parser is given below:

import java.util.ArrayList;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler; public class SAXParserDemo {public static void main(String[] args) throws Exception {  SAXParserFactory parserFactor = SAXParserFactory.newInstance();  SAXParser parser = parserFactor.newSAXParser();  SAXHandler handler = new SAXHandler();  parser.parse(ClassLoader.getSystemResourceAsStream("xml/employee.xml"),               handler);  //Printing the list of employees obtained from XML  for ( Employee emp : handler.empList){    System.out.println(emp);  }}}/** * The Handler for SAX Events. */class SAXHandler extends DefaultHandler { List empList = new ArrayList<>();Employee emp = null;String content = null;@Override//Triggered when the start of tag is found.public void startElement(String uri, String localName,                         String qName, Attributes attributes)                         throws SAXException {  switch(qName){    //Create a new Employee object when the start tag is found    case "employee":      emp = new Employee();      emp.id = attributes.getValue("id");      break;  }}@Overridepublic void endElement(String uri, String localName,                       String qName) throws SAXException { switch(qName){   //Add the employee to list once end tag is found   case "employee":     empList.add(emp);           break;   //For all other end tags the employee has to be updated.   case "firstName":     emp.firstName = content;     break;   case "lastName":     emp.lastName = content;     break;   case "location":     emp.location = content;     break; }}@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {  content = String.copyValueOf(ch, start, length).trim();}} class Employee {   String id;  String firstName;  String lastName;  String location;  @Override  public String toString() {    return firstName + " " + lastName + "(" + id + ")" + location;  }}}

The output:
Rakesh Mishra(111)BangaloreJohn Davis(112)DelhiRajesh Sharma(113)Pune
Using StAX Parser
StAX stands for Streaming API for XML and StAX Parser is different from DOM in the same way SAX Parser is. StAX parser is also in a subtle way different from SAX parser.
  • The SAX Parser pushes the data but StAX parser pulls the required data from the XML.
  • The StAX parser maintains a cursor at the current position in the document allows to extract the content available at the cursor whereas SAX parser issues events as and when certain data is encountered.
XMLInputFactory and XMLStreamReader are the two class which can be used to load an XML file. And as we read through the XML file using XMLStreamReader, events are generated in the form of integer values and these are then compared with the constants inXMLStreamConstants. The below code shows how to parse XML using StAX parser:

import java.util.ArrayList;import java.util.List;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamConstants;import javax.xml.stream.XMLStreamException;import javax.xml.stream.XMLStreamReader; public class StaxParserDemo {public static void main(String[] args) throws XMLStreamException {  List empList = null;  Employee currEmp = null;  String tagContent = null;  XMLInputFactory factory = XMLInputFactory.newInstance();  XMLStreamReader reader =      factory.createXMLStreamReader(      ClassLoader.getSystemResourceAsStream("xml/employee.xml"));  while(reader.hasNext()){    int event = reader.next();    switch(event){      case XMLStreamConstants.START_ELEMENT:        if ("employee".equals(reader.getLocalName())){          currEmp = new Employee();          currEmp.id = reader.getAttributeValue(0);        }        if("employees".equals(reader.getLocalName())){          empList = new ArrayList<>();        }        break;      case XMLStreamConstants.CHARACTERS:        tagContent = reader.getText().trim();        break;      case XMLStreamConstants.END_ELEMENT:        switch(reader.getLocalName()){          case "employee":            empList.add(currEmp);            break;          case "firstName":            currEmp.firstName = tagContent;            break;          case "lastName":            currEmp.lastName = tagContent;            break;          case "location":            currEmp.location = tagContent;            break;        }        break;      case XMLStreamConstants.START_DOCUMENT:        empList = new ArrayList<>();        break;    }  }  //Print the employee list populated from XML  for ( Employee emp : empList){    System.out.println(emp);  }}} class Employee{String id;String firstName;String lastName;String location;@Overridepublic String toString(){  return firstName+" "+lastName+"("+id+") "+location;}}

The output:
Rakesh Mishra(111) BangaloreJohn Davis(112) DelhiRajesh Sharma(113) Pune
With this I have covered parsing the same XML document and performing the same task of populating the list of Employee objects using all the three parsers namely:
  • DOM Parser
  • SAX Parser
  • StAX Parser