13 October 2011

Listing long running conversations in CDI based web application

I am not sure if CDI provides APIs to list all long running conversations. So I came up with the below class.

Note: Time-out and eviction of conversations by the container when not in use for a long time to save resoruces is NOT considered in the code below.


import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class SRackWorkSpace implements Serializable{
   
    private List<String> cids=new ArrayList<String>();
   
    public void addConversation(String cid){
        cids.add(cid);
    }
   
    public void removeConversation(String cid){
        cids.remove(cid);
    }
   
    public boolean isConversationActive(String cid){
        return cids.contains(cid);
    }
   
   
}
Inject conversation and the above session scoped bean and invoke

 -  addConversation method when you begin a conversation like

                 conversation.begin("deliverexam");
                 sRackWorkSpace.addConversation("deliverexam");



- removeConversation when we end a conversation like

   sRackWorkSpace.removeConversation(conversation.getId());
            conversation.end();.




You can check of a long running conversation for a desired use case is already active like


 if (sRackWorkSpace.isConversationActive("deliverexam")) {
           return "/YOUR_PATH_TO_XHTML_VIEW?cid=deliverexam&faces-redirect=true";
}





11 October 2011

Validating email field programmatically - Hibernate Validator

First the Email.java class

public class Email {

    @org.hibernate.validator.constraints.Email(message = "Email is not valid")
    private String email;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
 Let us say you have to validate a Collection of email values,

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
 //More code here
Email emailClass = new Email();
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
      
        for (String e : emails) {
            emailClass.setEmail(e.trim());
            Set<ConstraintViolation<Email>> constraintViolations =validator.validate(emailClass);
            if (!constraintViolations.isEmpty()) {
               //Email is not valid. Perform the logic
            }
        }

I use Hibernate Validator implementation. Since I use Maven for build, the dependency is as below.
  <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
  </dependency>




Injection of EntityManager or CDI Bean in FacesConverter

Seam3 Persistence Module along with Faces Module  helps in enabling CDI injection in FacesConverter belonging to JSF. Example below.

@FacesConverter(value = "questionTagConverter", forClass = QuestionTag.class)
public class QuestionTagConverter implements Converter{
   
   @Inject
   EntityManager entityManager;
  
    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        return entityManager.find(QuestionTag.class, Integer.parseInt(string));
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        return ((QuestionTag)o).getId().toString();
    }
   
}

The Java class which produces the EntityManager is as below.

import javax.enterprise.context.ConversationScoped;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import org.jboss.seam.solder.core.ExtensionManaged;

public class EntityMgrProducer {

    @ExtensionManaged
    @Produces
    @PersistenceUnit(name = "PU_NAMEHERE")
    @ConversationScoped
    EntityManagerFactory entityManager;
}

The related jars should be added to your web application. If you use Maven use the dependencies below.

      <dependency>
            <groupId>org.jboss.seam.faces</groupId>
            <artifactId>seam-faces</artifactId>
            <version>3.0.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.seam.persistence</groupId>
            <artifactId>seam-persistence</artifactId>
            <version>3.0.0.Final</version>
        </dependency>

Example Usage - xhtml file

<h:panelGrid columns="2">
                     <p:selectOneMenu value="#{searchMultipleChoiceQuestionAction.questionDataModel.selTag}" converter="questionTagConverter">
                    <f:selectItems value="#{searchMultipleChoiceQuestionAction.tags}" var="qt" itemLabel="#{qt.qtag}" itemValue="#{qt}"/>
                </p:selectOneMenu>
                    <p:commandButton update="searchresult" action="#{searchMultipleChoiceQuestionAction.search()}" value="Search"/>
 </h:panelGrid>