Generating the DDL(Create and DROP) Statements of JPA Entities in EclipseLink
This blog is about generating the DDL Statements (CREATE and DROP DDL) for the entities managed by the JPA. The JPA implementation used here is EclipseLink.
I have used the following Person class to be managed as Entity.
package com.entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
int id;
String fName;
String lName;
int age;
//the setter, getter, methods for each of the attributes, toString,
//hashCode, equals and default constructor are not shown here.
}
The persistence.xml file is as follows.
<?xml version="1.0" encoding="UTF-8"?> <persistence:persistence version="1.0" xmlns:persistence="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence ../../persistence_1_0.xsd "> <persistence:persistence-unit name="simplePersistenceUnit"> <persistence:provider>org.eclipse.persistence.jpa.PersistenceProvider</persistence:provider> <persistence:class>com.entities.Person</persistence:class> <persistence:properties> <persistence:property name="eclipselink.jdbc.driver" value="com.mysql.jdbc.Driver"/> <persistence:property name="eclipselink.jdbc.url" value="jdbc:mysql://localhost:3306/default"/> <persistence:property name="eclipselink.jdbc.user" value="root"/> <persistence:property name="eclipselink.jdbc.password" value="developer"/> </persistence:properties> </persistence:persistence-unit> </persistence:persistence>
The persistence.xml contains information about the database.
The DDL generation information is provided to the persistence manager via a java.util.Map object.
package com.test;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.junit.Before;
import org.junit.Test;
public class TestExampleJPA {
EntityManager em;
@Test
public void testDDLGeneration() {
Map<String, String> persistProperties = new HashMap<String, String>();
persistProperties.put(PersistenceUnitProperties.DDL_GENERATION, "create-tables");
persistProperties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, "sql-script");
persistProperties.put(PersistenceUnitProperties.APP_LOCATION, "C:\MyFolder\temp");
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "simplePersistenceUnit", persistProperties);
em = emf.createEntityManager();
}
}
I have specified the database information in the persistence.xml file and DDL generation information into a Map object and providing it at runtime when creating the EntityManagerFactory object. Both the information can be provided fully either as part of persistence.xml or Map object. I have combined both approaches for providing configuration information to JPA.
On executing the above test case the following sql files which contains the DDL for CREATE and DROP are created in C:\MyFolder\temp folder.

References:
http://wiki.eclipse.org/EclipseLink/Examples/JPA/OutsideContainer
http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)
remsh and ftp – Automate copying files between machines
Consider a scenario where you need to get files from multiple remote machine to your machine and do a task like comparing or auditing, etc, the way it is done is is to do a remote login to a machine and do a ftp for copying a file from the remote machine to your machine
rlogin <remote-machine-name> -l <user> ftp <my-machine-name> .... ...
and then doing the actual task. It is highly repetitive task to login to different machines and ftping the files. Also, as far as i know automating to do a remote login and ftping the file is impossible using shell script. Please let me know if there is a way to do it via scripts.
I have found a better way to do it using remsh command and using automated ftp script.
Consider the following scenario. There are two unix boxes. One, machine001 and another machine002. For machine machine001, you have direct access using m001username and m001password and to machine002 you do a remote login from machine001 using the user id m002username.
Suppose, you need to get a file file001 from machine002 to machine001.
We do it in following way.
machine001>rlogin machine002 -l m002username blah blah messages machine002>ftp machine001 >username m001username >password ************ >put file001 dir001/file001 >bye machine002>exit machine001>ls dir001 file001
Doing the same using ftp and remsh is explained below. The automated ftp script is as follows. It accepts target machine name, username, password, the source file and destination file. This is a simple shell script whose functionality can be greatly extended.
automateFtp.sh
#!/bin/ksh
numOfArgs=$#
if [[ $numOfArgs = "5" ]]
then
machineName=$1
username=$2
password=$3
sourcefile=$4
destFile=$5
#Start the ftp process to sent the file
ftp -n -v ${machineName} <<-ENDTAG
user ${username} ${password}
put ${sourcefile} ${destFile}
quit
ENDTAG
#End of ftp
else
echo "Insufficient number of arguments"
fi
Just copy this file to the machine whose file needs be copied over to your machine and invoke the remote script using the remsh command.
In the above scenario, the command would be
remsh machine002 -l m002username automateFtp.sh machine001 m001username m001password file001 dir001/file001
i.e., generally
remsh <from_machine> -l <from_machine_login_name> automateFtp.sh <to_machine> <to_machine_username> <to_machine_password> <from_machine_file_name><to_machine_file_name>
Since the shell script is a simple one, it can be modified to try out in various scenarios.
This helps in automation to great extent. Just copy automateFtp.sh to each of the machines and invoke them from your machine. Now the task is just reduced to invoking a command. This can also be automated.
Since you pass the username and password at execution time, they are safe from prying eyes.
Unix Script + Java = Solve tasks easily.
The example given below shows the way the unix scripts and other programs (in this case, it is java program) can be combined to tackle simple problems.
The example script calls a java program to check the status of a URL. The Shell script gets the list of all URLs that needs to be checked via a file urlList and checks the status of each of the URL via the java program com.util.GetHttpResponse and then if the response is not equal to 200, sends a mail.
The java program to check the status of the URL can be replaced by any program that provides the same functionality. This program shows how unix shell scripts can be combined effortlessly to solve tasks.
There are a numerous way to get the status code of a HTTP URL. The post shows using Java. This simple tool can be used to check the status of a list of URLs and if down send information to the concerned person. This script can be invoked through cron to regularly check the state of URLs. This can be extended to check the state of other protocols also.
The unix shell script.
#!/bin/ksh
# Visit http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html for
# more information in HTTP Status Response Code
# Response of 200 specifies successful Request
for eachUrl in `cat urlList`
do
responseStatusCode=`java com.util.GetHttpResponse $eachUrl`
echo "URL: $eachUrl RESPONSE CODE: $responseStatusCode"
if [[ $responseStatusCode != "200" ]]
then
mailx -s "The URL $eachUrl did not return successful
request status. The HTTP response status is
$responseStatusCode. Please Check."
someone@somewhere.com
fi
done
The java Class com.util.GetHttpResponse.
package com.util;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class GetHttpResponse {
public static void main(String[] args) {
new GetHttpResponse().getWebPage(args[0]);
}
public void getWebPage(String pageUrl) {
if (pageUrl == null) {
throw new IllegalArgumentException("pageUrl cannot be null");
}
try {
URL webPageUrl = new URL(pageUrl);
HttpURLConnection conn = (HttpURLConnection) webPageUrl.openConnection();
conn.setRequestMethod("GET");
System.out.println(conn.getResponseCode());
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
For Complete details on HTTP Status response code, visit
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

![Reblog this post [with Zemanta]](http://img.zemanta.com/reblog_e.png?x-id=b4430830-8678-489f-953e-fa3abc4c44eb)
![Reblog this post [with Zemanta]](http://img.zemanta.com/reblog_e.png?x-id=1deb367a-8adb-43bf-a5d0-1e5fb531667a)

