Parse an XML document using SAX parser

Simple API for XML(SAX) is an event driven parser which reads XML step by step. SAX Parser is faster and uses less memory than DOM parser.

Event handling methods used:
startElement() – Receive notification of the start of an element.
endElement() – Receive notification of the end of an element.
characters() – Receive notification of character data inside an element.

XML document to be parsed
movie_list.xml

<movies>
    <movie>
        <name>The Terminal</name>
        <image>http://.../the_terminal.jpg</image>
        <description>terminal foo foo foo</description>
    </movie>
    <movie>
        <name>Shutter Island</name>
        <image>http://.../shutter_island.png</image>
        <description>shutter foo foo foo </description>
    </movie>
    <movie>
        <name>Old Boy</name>
        <image>http://.../old_boy.gif</image>
        <description>old foo foo foo </description>
    </movie>
</movies>

Create Model object
Movie.java

public class Movie {

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getImgURL() {
		return imgURL;
	}

	public void setImgURL(String imgURL) {
		this.imgURL = imgURL;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	private String name;
	private String imgURL;
	private String description;

	@Override
	public String toString() {
		return this.name + " " + this.imgURL + " " + this.description;
	}

}

Extend DefaultHandler and override above mentioned event handling methods.
MovieHandler.java

public class MovieHandler extends DefaultHandler {
    List<Movie> movieList = new ArrayList<Movie>();
    Movie movie = null;
    String data = null;
 
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
               // When start tag of 'movie' element found, create an object and add it to the list
        switch (qName) {
        case "movie":
 
            movie = new Movie();
            movieList.add(movie);
            break;
 
        }
    }
 
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
 
        switch (qName) {
        case "name":
            movie.setName(data);
            break;
        case "description":
            movie.setDescription(data);
            break;
        case "image":
            movie.setImgURL(data);
            break;
 
        }
    }
 
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        data = String.copyValueOf(ch, start, length).trim();
 
    }
 
}

Set up the parser and get it started
MovieSaxParser.java

	
public class MovieSaxParser {
 
    static final Logger LOG = Logger.getLogger(MovieSaxParser.class);
    String static fileLocation = "/home/prnv/movie_list.xml";
 
    public static void main(String[] args) {
        try {
            SAXParserFactory saxFactory = SAXParserFactory.newInstance();
            SAXParser parser = saxFactory.newSAXParser();
            MovieHandler handler = new MovieHandler();
            parser.parse(fileLocation, handler);
            for (Movie movie : handler.movieList) {
                System.out.println(movie);
            }
        } catch (ParserConfigurationException | SAXException | IOException e) {
            LOG.error("Exception ", e);
 
        }
 
    }
}
Advertisements

Backup files in EC2 Instance to Amazon S3

EC2 Instance : Ubuntu Server 12.04 LTS
Tool : s3cmd

Install s3cmd:

sudo apt-get install s3cmd

Configure s3cmd for managing data on S3:
Get the access key, secret key from your AWS account prior to this step.

s3cmd --configure

Listing buckets:

s3cmd ls

Create a bucket:

s3cmd mb s3://bucket_name

Upload files to S3:

s3cmd put -r ~/backup_directory/ s3://bucket_name/

Synchronize files:

s3cmd sync -r ~/backup_directory/ s3://bucket_name/

Download files from a bucket:

s3cmd get -r s3://bucket_name/ ~/my_s3_downloads/

Delete files in a bucket:

s3cmd del -r s3://bucket_name/

Remove a bucket:

s3cmd rb -f s3://bucket_name

Write a shell script to synchronize files in the EC2 Instance:
backup_sync_ec2_s3.sh

#!/bin/bash
s3cmd sync -r ~/backup_directory/ s3://bucket_name/

Edit crontab file:

crontab -e

Schedule script:
Add cronjob to trigger automated backup everyday at 23:59 hrs

59 23 * * * sh ~/backup_sync_ec2_s3.sh