10/30/2008

valangValidator script example

<bean id="registrationValidator" class="org.springmodules.validation.valang.ValangValidator">
<property name="valang">
<value><![CDATA[
{ userName : ? is not blank : 'User Name: required.' }
{ userName : matches('\\w+',?) == true: 'User Name: Only Alpha-Numeric Characters' }
{ userName : matches('\\w+',?) == true: 'User Name: Only Alpha-Numeric Characters' }
{ userName : length(?) > 6 : 'User Name: Not between 6 - 12 characters.' }
{ userName : length(?) < 12 : 'User Name: Not between 6 - 12 characters.' }
{ firstName : ? is not blank : 'First Name: required.' }
{ firstName : matches('\\w+',?) == true: 'First Name: Only Alpha-Numeric Characters' }
{ lastName : ? is not blank : 'Last Name: required.' }
{ lastName : matches('\\w+',?) == true: 'Last Name: Only Alpha-Numeric Characters' }
{ email : ? is not blank : 'E-Mail: required.' }
{ email : email(?) == true: 'E-Mail: Not A valid Address' }
{ password : ? is not blank : 'Password: required.' }
{ password : matches('\\w+',?) == true: 'Password: Only Alpha-Numeric Characters' }
{ password : length(?) > 6 : 'Password: Not between 6 - 12 characters.' }
{ password : length(?) < 12 : 'Password: Not between 6 - 12 characters.' }
{ confirmPassword : ? is not blank : 'Confirm Password: required.' }
{ confirmPassword : matches('\\w+',?) == true: 'Confirm Password: Only Alpha-Numeric Characters' }
{ city : ? is not blank : 'City: required.' }
{ age : matches('\\d+',?) == true: 'Age: Only Numeric Characters' }
{ age : ? is not blank : 'Age: required.' }
]]></value>
</property>
</bean>

9/30/2008

xstream: custom converter

marshal/unmarshal


private String toXML(Application app) throws Exception {
XStream xStream = new XStream(new DomDriver());
xStream.registerConverter(new ApplicationConverter());
xStream.alias("application", Application.class);
return xStream.toXML(app);
}

private Application toApplication(String xml) throws Exception {
XStream xStream = new XStream(new DomDriver());
xStream.registerConverter(new ApplicationConverter());
xStream.alias("application", Application.class);
return (Application) xStream.fromXML(xml);
}

class ApplicationConverter implements Converter {
private static final String FULLDATE_FORMAT = "dd/MM/yyyy HH:mm:ss";

/** Marshall xml into application object */
public void marshal(Object obj,
HierarchicalStreamWriter writer,
MarshallingContext context) {
Application app = (Application) obj;
pushContent(writer, "applicationId", app.getApplicationId());
DateFormat formatter = new SimpleDateFormat(FULLDATE_FORMAT);
pushContent(writer, "createdDate", formatter.format(app.getCreatedDate()));
pushMapContent(writer, app.getFields());
}

/** Push content into xml */
private void pushContent(HierarchicalStreamWriter writer,
String key, Object value) {
writer.startNode(key);
writer.setValue(value.toString());
writer.endNode();
}

/** Push map content into xml */
private void pushMapContent(HierarchicalStreamWriter writer, Map map) {
Iterator iter = map.keySet().iterator();
while(iter.hasNext()) {
String key = (String) iter.next();
Object value = map.get(key);
writer.startNode(key);
if (value instanceof Map) {
pushMapContent(writer, (Map) value);
}
else if (value instanceof String) {
writer.setValue((String) value);
}
writer.endNode();
}
}

/** Unmarshall application into xml */
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Application app = new Application();
DateFormat formatter = new SimpleDateFormat(FULLDATE_FORMAT);

while (reader.hasMoreChildren()) {
reader.moveDown();
try {
if ("applicationId".equals(reader.getNodeName())) {
app.setApplicationId(reader.getValue());
}
else if ("createdDate".equals(reader.getNodeName())) {
app.setCreatedDate(formatter.parse(reader.getValue()));
}
else {
popMapContent(reader, app.getFields());
}
}
catch(ParseException e) {
LOG.debug("Parsing date for "+reader.getNodeName()+" has failed", e);
}
reader.moveUp();
}
return app;
}

/** Pop xml into map content */
private void popMapContent(HierarchicalStreamReader reader,
Map map) {
if (reader.hasMoreChildren()) {
Map childMap = new TreeMap();
map.put(reader.getNodeName(), childMap);
while (reader.hasMoreChildren()) {
reader.moveDown();
popMapContent(reader, childMap);
reader.moveUp();
}
}
else {
map.put(reader.getNodeName(), reader.getValue());
}
}

public boolean canConvert(Class clazz) {
return clazz.equals(Application.class);
}
}

9/16/2008

spring: configure mail

Add mailService in applicationContext.xml

<!-- Mail service -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="your.smtphost.com"/>
<property name="port" value="25"/>
<property name="username" value="yourusername"/>
<property name="password" value="yourpassword"/>
</bean>
<bean id="mailManager" class="com.onlineforms.MailManager">
<property name="mailSender" ref="mailSender"/>
<property name="from" value="Joseph.Seo@macquarie.com"/>
<property name="to" value="Joseph.Seo"/>
<property name="subject" value="Testing"/>
</bean>

Implement MailManager

public class MailManager {

private JavaMailSender mailSender;
private String from;
private String to;
private String subject;

//// getters/setters blah blah

/**
* Send simple email
* @param message
*/
public void send(String message) {
SimpleMailMessage mailMsg = new SimpleMailMessage();
mailMsg.setFrom(getFrom());
mailMsg.setTo(getTo());
mailMsg.setSubject(getSubject());
mailSender.send(mailMsg);
}

}

jboss 4.2.x: Setup virtual directory, Setup static directory, Setup external directory

%JOSS_HOME%/server/XXX/deploy/jboss-web.deployer/server.xml

Add the following line under <Host> tag.

<Context path="/images" appBase=""
docBase="C:/dev/workspace/images"
debug="99" reloadable="true">
</Context>

9/05/2008

hibernate: many-to-many mapping with mapping-table

<set name="items" table="campaignlist" >
<key column="campaign_id"/>
<many-to-many class="Item" column="mediaitem_id"/>
</set>

OR

<bag name="otherOptions" table="JOB_FINISHING_OPTION">
<key column="JOB_ID"/>
<many-to-many class="com.au.fxa.dsc.soms.model.PrintFinishOption" column="POC_ID"/>
</bag>

9/03/2008

struts2, freemarker: load template from memory



1. register in struts.xml


2. Extends FreeMarkerManager
public class FreeMarkerManager extends FreemarkerManager {
protected TemplateLoader getTemplateLoader(ServletContext servletContext) {
FormTemplateLoader templateLoader = new FormTemplateLoader();

return new MultiTemplateLoader(new TemplateLoader[]{
templateLoader,
new WebappTemplateLoader(servletContext),
new StrutsClassTemplateLoader()
});
}
}

3. Implement TemplateLoader
public class FormTemplateLoader implements TemplateLoader {
public Object findTemplateSource(String name) {
// getTemplates() returns map containing template list with template name as key
source = (String) getTemplates().get(name);
lastModified = System.currentTimeMillis();
return source;
}

...
}

struts 2: integrate groovy batch


// Using groovy to find out next page by evaluating rule defined in form schema.
Binding binding = new Binding();
binding.setVariable("page", page);
GroovyShell shell = new GroovyShell(binding);
String result = (String) shell.evaluate(page.getFlowRule());