Wednesday, April 25, 2012

Java Regex Pattern and "^M"

A simple pattern:
 Pattern title = Pattern.compile("^Alert\\s*Digest.*", Pattern.CASE_INSENSITIVE);
When I tried to match this string. It failed:
Alert Digest No 6 of 2012^M 
 Yes, you can see that "^M" in the string. This is a "line terminator" which "." will not match by default.

So the solution is:
 Pattern title = Pattern.compile("^Alert\\s*Digest.*", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
 This is the description from API document:

DOTALL

public static final int DOTALL
Enables dotall mode. In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators.

 

Invalid property 'packagesToScan' of bean class [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]

This is a maven webapp project with m2eclipse integrated into eclipse. In this project there are some hibernate dependencies used in spring-hibernate API. This is the related snippets:

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.seanlinxs.inventory.domain" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>




After changing the hibernate dependencies with m2e pom.xml GUI editor in eclipse many times, i.e. changing versions or something else like vendors. I found that junit runs well but tomcat deployment fail with this:

org.springframework.beans.NotWritablePropertyException: Invalid property 'packagesToScan' of bean class [org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]: Bean property 'packagesToScan' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?



This is not a real issue with  AnnotationSessionFactoryBean, It is actually a jar conflict!
 E.g. In m2e pom.xml GUI editor when you see "ONE" hibernate-core, it might be "MANY" versions in the target WAR. You "remove" one dependency, then "save" the pom.xml, then add a different one, then "save" again. What you get in target WAR is two versions! You didn't really remove it though you might think you did. Run mvn clean will "REALLY" clean(empty) the target library directory and when you run mvn tomcat:deploy again everything should be WYSIWYG as expected.

 



Monday, January 30, 2012

maven-tomcat-plugin tomcat-users.xml

Here you can define tomcat-users.xml as in a real tomcat container (archetypeArtifactId: maven-archetype-webapp):


src/main/tomcatconf/tomcat-users.xml


Tomcat Maven Plugin search for a directory "src/main/tomcatconf" and if it exists it is copied to the configuration of embedded instance. 

Thursday, January 19, 2012

non-administrator user on windows 7 use emacs

Today I am trying to enable manager app of Tomcat 7 on Windows 7. According to tomcat document I need to add <user> to tomcat-users.xml to grant access. I use Emacs, edit tomcat-users.xml, then save, but whatever I set the username/password/roles, I cannot login due to 401 error.

After several hours attempting I suddenly realized that I am editing wrong file! After search and compare several version of this file. I found that this is what I am editing and saving:

C:\Users\Sean\AppData\Local\VirtualStore\Program Files\Apache Software Foundation\Tomcat 7.0\conf\tomcat-users.xml

Instead of the right place:

C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\tomcat-users.xml

What happened even if I open the file in emacs using the right path? This is from Microsoft answers:

To protect against some types of malware, Windows 7 doesn't allow users to store data in C:\Windows , C:\Program Files , or their subfolders.

To allow existing programs that access those locations to run, it automatically (and transparently) translates such access to the VirtualSore folder:

C:\Windows\... --> C:\Users\"Name"\AppData\Local\VirtualStore\Windows\...
C:\Program Files\... --> C:\Users\"Name"\AppData\Local\VirtualStore\Program Files\...

That’s it, restart emacs with administrator fix it.

Monday, January 9, 2012

<error-page> catch-all feature in servlet 3.0

 

Starting with Servlets 3.0, <error-code> and <exception-type> elements are optional. An <error-page> without any <exception-type> and <error-code> will be considered as the webapp's default error page, and will act as a "catch-all" for any error codes or exception types. It will be an error if a web.xml contains more than one such default error page.
There is a example here. We want to catch ArithmeticException and display /arithmeticError.jsp instead of default /errorPage.jsp, in servlet 3.0, this is the DD:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="
http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <servlet>
        <servlet-name>JSTLSample</servlet-name>
        <servlet-class>web.JSTLServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>JSTLSample</servlet-name>
        <url-pattern>/JSTLSample.do</url-pattern>
    </servlet-mapping>
    <error-page>
        <location>/errorPage.jsp</location>
    </error-page>

    <error-page>
        <exception-type>java.lang.ArithmeticException</exception-type>
        <location>/arithmeticError.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/notFoundError.jsp</location>
    </error-page>
</web-app>

In previous version, DD is like this:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="
http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <servlet>
        <servlet-name>JSTLSample</servlet-name>
        <servlet-class>web.JSTLServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>JSTLSample</servlet-name>
        <url-pattern>/JSTLSample.do</url-pattern>
    </servlet-mapping>
    <error-page>
       <exception-type>java.lang.Throwable</exception-type>
       <location>/errorPage.jsp</location>
    </error-page>

    <error-page>
        <exception-type>java.lang.ArithmeticException</exception-type>
        <location>/arithmeticError.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/notFoundError.jsp</location>
    </error-page>
</web-app>