Friday, April 17, 2009

Screen Graber Deamon

This was a hack to grab the questions from a paid online quiz. Idea here is, this program will run as a deamon in the background and take the screen shot every 10 second and save it into a jpeg file on temp directory.

public void captureFullScreen() { try { Robot robot = new Robot(); Rectangle area = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); File target = new File(saveLocation, imageName + "_" + System.currentTimeMillis() + "." + imageType); saveImageToFile(robot.createScreenCapture(area), target); } catch (AWTException e) { System.err.println("Exception while capturing screen. " + e); } } /** * Saves the specified RenderedImage to the specified File. * * @param renderedImage the image to write to file. * @param target the file to write the image to. */ private void saveImageToFile(RenderedImage renderedImage, File target) { try { ImageIO.write(renderedImage, imageType, target); } catch (IOException e) { System.err.println(e); } }
and now the Deamon
public static void main(String args[]) throws InterruptedException { while(true) { new ScreenGraber().captureFullScreen(); Thread.sleep(10000); // will sleep for 10 seconds } }

Wednesday, April 8, 2009

JPA OneToMany using FetchType.EAGER

Scenario: Want to insert multiple address to basket header with a unique basketId.

BasketHeader.java @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "basketId", nullable = false) public Set getBasketBillTos() { return basketBillTos; }
By specifying @JoinColumn basketId is set as the foreign key column name for the relationship. Otherwise a default name will be given for the foreign key column. If you are mapping to an existing database schema you will typically require setting the @JoinColumn, otherwise the defaults are probably fine. Implementation on action
Set basketBillToSet = new HashSet(); basketBillToSet.add(basketBillTo); basketHeader.setBasketBillTos(basketBillToSet);

Wednesday, April 1, 2009

Struts 2 OGNL variable evaluation

< s: set name="startIndex" value="%{#parameters['start'][0]}"/ > < s: property value="@java.lang.Integer@parseInt(#startIndex)+4"/ >
Here the first statement grab the query string value using parameter object and assign it as a string, the '%{}' syntax is used for this purpose. The second statement convert the string to int and add the two integers.
IMPORTANT: for the parseInt to work you should enable the constant in struts.xml < constant name="struts.ognl.allowStaticMethodAccess" value="true" / >

Monday, March 30, 2009

SVN with Eclipse Ganymede

  1. Install svn server for windows, use the msi package.
  2. Create Repository
svnadmin create "c:\svnrepo"
Navigate to the folder we just created. Within that folder, uncomment the following lines in the /conf/svnserve.conf file:
[general] anon-access = read auth-access = write password-db = passwd
Next, uncomment these lines in the /conf/passwd file:
[users] harry = harryssecret sally = sallyssecret
3. Install subeclipse 1.6.x package for Ganymede. 4. check in the project using these parameters
host svn://localhost use default port repository svnrepo
In Linux if you have created a subversion group, don't forget to change the file group permission, like this.
sudo chown :subversion directory/
Do not forget to commit the project at the end.

Wednesday, December 31, 2008

Auto create tables JPA

< property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"> < property name="hibernate.hbm2ddl.auto" value="create-drop"> < property name="hibernate.show_sql" value="true"> < property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"> < /property>

Tuesday, December 2, 2008

Recusively deleting a folder in MS DOS

for /f %D in ('dir/s/b/ad ^| find/i ".svn" ') do if exist "%D" rd/s/q "%D"
replace %D with %%D for batch job

Thursday, November 13, 2008

Where not to put presistance.xml

Where to put persistence.xml in web app? In all cases, persistence.xml always resides in {root-of-persistence-unit}/META-INF/ directory. For example,

foo.war: WEB-INF/classes/META-INF/persistence.xml //good WEB-INF/classes/com/foo123/jpa/Project.class WEB-INF/web.xml index.jsp You may also package entity classes and persistence.xml inside a library jar, which is packaged inside the war: WEB-INF/lib foo.war: WEB-INF/lib/my-entities.jar WEB-INF/web.xml index.jsp my-entities.jar: META-INF/persistence.xml //good com/foo123/jpa/Project.class For comparison, some invalid configurations are: foo.war: WEB-INF/persistence.xml //invalid WEB-INF/web.xml WEB-INF/classes/com/foo123/jpa/Project. index.jsp ----------------------------------------------- foo.war: META-INF/persistence.xml //invalid WEB-INF/classes/com/foo123/jpa/Project.class WEB-INF/web.xml index.jsp ----------------------------------------------- foo.war: persistence.xml //invalid WEB-INF/classes/com/foo123/jpa/Project.class WEB-INF/web.xml index.jsp ----------------------------------------------- foo.war: META-INF/persistence.xml //invalid com/foo123/jpa/Project.class WEB-INF/web.xml index.jsp
In all these invalid configurations, EntityManager lookup will fail with javax.naming.NameNotFoundException, or @PersistenceContext injection will be silently skipped and the em variable is always null, and hence NullPointerException when referenced.