Simple demonstration of Ext.extend

I have used javascript before in many project but never looked at javascript from object oriented programming prospective. As I started learning extjs, i am finding some interesting OO fundamentals in javascript. Here is a simple demonstration of extjs’s extend feature.


// declares class 'a'
var a = function(){
// constructor
console.log('in a class constructor');
};

// defines memebers in class ‘a’
a.prototype = {
foo: function() {
console.log(‘in a class m1()’);
},
bar: function() {
console.log(‘in a class m2()’);
}
};

// declares class ‘b’
var b = function() {
console.log(‘in b class constructor’);
b.superclass.constructor.call(this);
};

// extends class ‘a’
Ext.extend(b, a, {
// overrides method ‘bar’
bar : function() {
console.log(‘in b class m2()’);
}
});

// on document ready..

Ext.onReady(function(){
// declares aVar of type ‘a’
var aVar = new a();

// calls methods using aVar
aVar.foo();
aVar.bar();

// declares bVar of type ‘b’
var bVar = new b();

// calls methods using bVar
bVar.foo();
bVar.bar();

});

Output in forebug console when page loads –

in a class constructor
in a class m1()
in a class m2()
in b class constructor
in a class constructor
in a class m1()
in b class m2()

ZK validator to check user id uniqueness on registration

I wrote a very simple validator to verify the uniqueness of user entered id by checking against database. It also validates if the user id is more than 5 characters long.

import org.apache.commons.lang.StringUtils;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zul.Constraint;
import User;
import UserService;
/**
* ZK validator for user id uniqueness.
*
* @author Anil
*/
public class UserIdUniquenessValidator implements Constraint {
/** user service to pull user info from DB */
private UserService userService;
public void validate(Component comp, Object value) throws WrongValueException {
if (value == null || StringUtils.isEmpty((String) value)) {
throw new WrongValueException(comp, “Please enter User ID”);
}
if (((String)value).trim().length() < 4) {
throw new WrongValueException(comp, “User Id must be at least 5 characters”);
}
User user = userService.load((String) value);
if (user != null) {
throw new WrongValueException(comp, “User ID already exists”);
}
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
I declared this validator as spring bean in spring context file:
<bean id=”userIdUniquenessValidator” class=”com.gavs.skill.ui.validator.UserIdUniquenessValidator”>
<property name=”userService” ref=”userService”/>
</bean>
ZUL file:
<bean id=”userIdUniquenessValidator” class=”UserIdUniquenessValidator”>
<property name=”userService” ref=”userService”/>
</bean>
<?variable-resolver class=”org.zkoss.zkplus.spring.DelegatingVariableResolver”?>
<grid>
<columns>
<column label=””></column>
<column label=””></column>
</columns>
<rows>
<row>
<label value=”First Name” width=”150px” />
<textbox  id=”indFirstName” width=”150px” constraint=”no empty”  value=”@{user.firstName}” />
</row>
<row>
<label value=”Last Name” width=”150px” />
<textbox id=”indLastName” width=”150px” constraint=”no empty” value=”@{user.lastName}”/>
</row>
<row>
<label value=”Email” width=”150px” />
<textbox id=”indEmail” width=”150px” constraint=”/.+@.+\.[a-z]+/: Please enter an e-mail address” value=”@{user.emailId}”/>
</row>
<row>
<label value=”User Id” width=”150px” />
<textbox id=”indUserId” width=”150px” constraint=”${userIdUniquenessValidator}” value=”@{user.userId}”/>
</row>
<row>
<label value=”Password” width=”150px” />
<textbox id=”password” type=”password”  width=”150px” constraint=”no empty” value=”@{user.password}”/>
</row>
</rows>
</grid>
.….
Thats all. On blur of user id field, validator validates the user entered info  and display the error message if user id already exist in database.
Posted in ZK. Tags: , . 1 Comment »

Custom resolver to explose logged in user info for ZK (Spring Security)

To expose spring security’s authentication info with object name “authentication” in ZK CE, the following simple resolver is useful.

import org.springframework.security.context.SecurityContextHolder;
import org.zkoss.xel.VariableResolver;
/**
* Resolver to make “authentication” object available for zk EL.
*
* @author Anil
*
*/
public class SecurityResolver implements VariableResolver {
public Object resolveVariable(String name) {
if (“authentication”.equals(name)) {
return SecurityContextHolder.getContext().getAuthentication();
}
return null;
}
}

This is resolver will be used as below:

<?variable-resolver class=”com.gavs.zk.common.SecurityResolver”?>

<toolbar id=”toolbar” style=”margin-top: -15px;”>

<toolbarbutton image=”/images/icons/small/home.ico” label=”Home”   if=”${authentication.principal == ‘roleAnonymous’}” style=”font-size: 11px; font-weight: bold;”>

<attribute name=”onClick”>

<![CDATA[Executions.sendRedirect(“/index.zul”); ]]>

</attribute>

</toolbarbutton>

</toolbar>

Here  “Home” link gets displayed only if user has not yet logged into system.

Back with new blog

Back with new blog. 🙂

Spring Security custom tag in ZK community edition

I upgraded my app to ZK 5.x community edition from 3.x and realized that spring security tags support not provided by community edition. I have created a custom tag to enforce restrictions based on roles in zul page.  I thought of sharing it here:

1) Create a class with static function to verify the role from spring’s  SecurityContextHolder.

public class SpringSecurityUserAccessSupport {
private static final Logger LOG = LoggerFactory.getLogger(SpringSecurityUserAccessSupport.class);
/**
* Verifies whether logged in user is in passed in role.
*
* @param role
* @return
*/
public static boolean isUserInRole(String roleStr) {
String[] roles = StringUtils.split(roleStr, “,”);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
GrantedAuthority[] authorities = auth.getAuthorities();
Role role;
for (int i = 0; i < roles.length; i++) {
role = new Role(StringUtils.trimToEmpty(roles[i]));
if (ArrayUtils.contains(authorities, role)) {
return true;
}
}
return false;
}
}

2) create  a new .tld file and config.xml file under metainfo\tld directory

custom.tld:

<taglib>

<uri>http://www.domain.com/custom</uri&gt;

<function>

<name>isUserInRole</name>

<function-class>SpringSecurityUserAccessSupport</function-class>

<function-signature>boolean isUserInRole(java.lang.String)</function-signature>

</function>

</taglib>

config.xml:

<?xml version=”1.0″ encoding=”UTF-8″?>

<config>

<taglib>

<taglib-uri>http://www.domain.com/custom</taglib-uri&gt;

<taglib-location>metainfo/tld/custom.tld</taglib-location>

</taglib>

</config>

3) Use the tag inside .zul file

<?taglib uri=”http://www.domain.com/custom&#8221; prefix=”sec”?>

<hbox width=”100%” align=”center”>

<toolbar id=”toolbar” style=”margin-top: -15px;”>

<toolbarbutton image=”/images/icons/small/home.ico” label=”Add User” if=”${sec:isUserInRole(‘ROLE_INDIVIDUAL_USER’) }” style=”font-size: 11px; font-weight: bold;”>

<attribute name=”onClick”>

<![CDATA[Executions.sendRedirect(“/index.zul”); ]]>

</attribute>

</toolbarbutton>

</toolbar>

</hbox>

Here I am displaying “Add User” option on toolbar only when logged in user has role “ROLE_INDIVIDUAL_USER“.


Issue with maven and cobertura integration

I found an interesting problem while integrating cobertura with maven to generate the test coverage report for my new code.

I have done following modificaitons in pom.xml file:
a) Added plug-in for cobertura

<build>

<plugins>

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

b) Reporting

<reporting>
<plugins>

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
</plugin>
</plugins>
</reporting>

When I ran mvn cobertura:cobertura, I got the following error:

[INFO] Nothing to compile – all classes are up to date [INFO] [cobertura:instrument] [ERROR] java.lang.UnsupportedClassVersionError: net/sourceforge/cobertura/instru ment/Main (Unsupported major.minor version 49.0) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source)

By looking at this I came to a conclusion that this incompatible class version issue.
When i ran mvn –version command, it gave me following info. Evrything looks fine as expected.

Maven version: 2.0.9
Java version: 1.5.0_15 OS name: “windows xp” version: “5.1” arch: “x86” Family: “windows”

I should not see above exception as I am using right version of JDK (1.5.0_15). I checked JAVA_HOME and even JRE_HOME env variable and they pointed to right location.

When I executed java –version command, I see following results

java version “1.4.2_11” Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_11-b06) Java HotSpot(TM) Client VM (build 1.4.2_11-b06, mixed mode)

Hmmmm…

I still didn’t believe that’s the root cause of problem. I gave it a
try by uninstalling JRE 1.4.2 and installed JRE 1.5 and everything started working fine.

I believe(though I am not a maven guru) that MAVEN is not making use of environment variable (here JAVA_HOME) to execute the plug in. I have spent almost 3 hours of my time and i thought this might be helpful for people like me.

On Struts 2

I was just browsing through to find out new developments in Struts 2 and found the following are is nice articles on Struts 2.

http://www.infoq.com/articles/converting-struts-2-part1
http://www.infoq.com/articles/migrating-struts-2-part2

Summary of points:
– Dispatcher has been changed from servlet to filter
– Action class is not singleton. So no thread-safety issues for Action class
– Action class can be a simple POJO with a signature public String methodName()
– No tight coupling to container in Action class code.
– Injected dependencies with DI/IoC
– Concept of Interceptors
– Simplified Unit testing of action classes