0

Basically I am trying to do a search of the users on my social network project using autocomplete of primefaces. The problem that I am facing is that whenever a new user signs up, the autocomplete is sometimes showing the new user in the suggestion and sometimes its not showing. Normally during first time a user signs up the autocomplete showing the user's name in the suggestion but the second when another user signs up ,his name is not showing in the suggestion. I think userDB is not getting updated. But whenever I redeploy the project everything is working fine. The name of the user is showing in the autocomplete.

1)xhtml

<div class="det">
                <h:form style="float:right;font-size:small;">&nbsp;&nbsp;&nbsp;
      <h:outputText value="Search your friends here."
                        style="font-size:small;color:#CCCCCC;" />
                    <p:autoComplete id="auto" value="#{searchBean.selectedUser}"
                        completeMethod="#{searchBean.completeUser}" var="p"
                        itemLabel="#{p.userName}" itemValue="#{p}"
                        converter="userConverter" forceSelection="true"
                        style="width:300px;">
                        <p:column>
                            <img src="../images/profilePicture/thumb/#{p.image}"
                                style="height: 40px; width: 40px;" />
                        </p:column>
                        <p:column>  
                    #{p.firstName} #{p.lastName}   
            </p:column>
                    </p:autoComplete> 
         &nbsp;<h:commandButton image="../Image/magnify.png"
                        action="#{searchBean.navigate}" style="height:20px;float:right;" />
                    <br />
                </h:form>
            </div>

2) User Converter

   package com.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import com.entity.User;

public class UserConverter implements Converter {

    public static   List<User> userDB;
    static EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird");
    static EntityManager em =emf.createEntityManager();

    static {  
        userDB = new ArrayList<User>();  
        Query query = em.createQuery("SELECT u FROM User u", User.class);
        userDB =query.getResultList();

    }


    public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {  
        if (submittedValue.trim().equals("")) {  
            return null;  
        } else {  
            try {  

                for (User p : userDB) {  
                    if (p.getUserName().equalsIgnoreCase(submittedValue)) {  
                        return p;  
                    }  
                }  

            } catch(Exception exception) {  
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid user"));  
            }  
        }  

        return null;  
    }  

    public String getAsString(FacesContext facesContext, UIComponent component, Object value) {  
        if (value == null || value.equals("")) {  
            return "";  
        } else {  
            return String.valueOf(((User) value).getUserName());  
        }  
    }  

}

3) Search Bean

package com.bean;
import com.bean.UserConverter;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.http.HttpSession;

import com.entity.User;

public class SearchBean {
    private EntityManager em;
    private User selectedUser;
    private List<User> users;

    public SearchBean(){
        users = UserConverter.userDB;
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird");
         em =emf.createEntityManager();
    }

    public User getSelectedUser() {
        return selectedUser;
    }

    public void setSelectedUser(User selectedUser) {
        this.selectedUser = selectedUser;
    }

    public List<User> completeUser(String query){
        List<User> suggestions = new ArrayList<User>();

        for(User u : users){
            if(u.getUserName().startsWith(query))
                suggestions.add(u);
        }

        return suggestions;
    }
    public String navigate(){
        User friend=em.find(User.class,selectedUser.getEmail());
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
        session.setAttribute("frienddet",friend);
        return "searchsuccess";
    }

}

4) Registration Bean

package com.bean;


import java.util.logging.Logger;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;


import org.primefaces.event.FlowEvent;


import com.entity.User;

public class RegistrationBean {

    User user ;
    private EntityManager em;
     private boolean skip;  
     private static Logger logger = Logger.getLogger(RegistrationBean.class.getName()); 
    public RegistrationBean(){
        user=new User();
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird");
         em =emf.createEntityManager();
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
     public boolean isSkip() {  
            return skip;  
        }  

        public void setSkip(boolean skip) {  
            this.skip = skip;  
        } 
    public String Save(){
        System.out.println("registration save called");
        em.getTransaction().begin();
        em.persist(user);
        em.getTransaction().commit();
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
        session.setAttribute("userdet",this.user);
        return "success";


    }
     public String onFlowProcess(FlowEvent event) {  
            logger.info("Current wizard step:" + event.getOldStep());  
            logger.info("Next step:" + event.getNewStep());  

            if(skip) {  
                skip = false;   //reset in case user goes back  
                return "confirm";  
            }  
            else {  
                return event.getNewStep();  
            }  
        }

}

5) Registration xhtml

<p:growl id="growl" sticky="true" showDetail="true" />

                <p:wizard widgetVar="wiz"
                    flowListener="#{registrationBean.onFlowProcess}"
                    style="text-size:small;">

                    <p:tab id="personal" title="Personal">

                        <p:panel header="Personal Details">



                            <h:panelGrid columns="3" columnClasses="label, value"
                                styleClass="grid">
                                <h:outputText value="Username*" />
                                <p:inputText id="usrname" required="true" label="Username"
                                    value="#{registrationBean.user.userName}"
                                    requiredMessage="Username required" />
                                <p:message for="usrname"></p:message>

                                <h:outputText value="Firstname: *" />
                                <p:inputText id="frstname" required="true" label="Firstname"
                                    value="#{registrationBean.user.firstName}"
                                    requiredMessage="Firstname required" />
                                <p:message for="frstname"></p:message>

                                <h:outputText value="Lastname: *" />
                                <p:inputText id="lstname" required="true" label="Lastname"
                                    value="#{registrationBean.user.lastName}"
                                    requiredMessage="Lastname required" />
                                <p:message for="lstname"></p:message>

                                <h:outputText value="Password: *" />
                                <p:password id="pwd1" value="#{registrationBean.user.password}"
                                    feedback="true" match="pwd2" label="Password" required="true"
                                    requiredMessage="Password required" />
                                <p:message for="pwd1"></p:message>

                                <h:outputText value="Confirm Password: *" />
                                <p:password id="pwd2" value="#{registrationBean.user.password}"
                                    feedback="true" label="Confirm Password" required="true" />
                                <p:message for="pwd2"></p:message>

                                <h:outputText value="Date of Birth:" />
                                <p:calendar value="#{registrationBean.user.birthDate}"
                                    pattern="dd/MM/yyyy" mode="popup" showOn="button"
                                    navigator="true"></p:calendar>
                                <p:message for="frstname"></p:message>

                                <h:outputText value="Gender: " />
                                <p:inputText label="Gender"
                                    value="#{registrationBean.user.gender}" />
                                <p:message for="frstname"></p:message>

                                <h:outputText value="Relationship Status: " />
                                <p:inputText label="Relationship Status"
                                    value="#{registrationBean.user.relationship}" />
                                <p:message for="frstname"></p:message>



                                <h:outputText value="Skip to last: " />
                                <h:selectBooleanCheckbox value="#{registrationBean.skip}" />
                            </h:panelGrid>
                        </p:panel>
                    </p:tab>

                    <p:tab id="address" title="Address">
                        <p:panel header="Adress Details">

                            <h:messages errorClass="error" />

                            <h:panelGrid columns="2" columnClasses="label, value">
                                <h:outputText value="Street: " />
                                <p:inputText value="#{registrationBean.user.street}" />

                                <h:outputText value="City: " />
                                <p:inputText label="City" value="#{registrationBean.user.city}" />

                                <h:outputText value="Pincode: " />
                                <p:inputText value="#{registrationBean.user.pincode}" />

                                <h:outputText value="State: " />
                                <p:inputText label="State"
                                    value="#{registrationBean.user.state}" />

                                <h:outputText value="Country: " />
                                <p:inputText label="Country"
                                    value="#{registrationBean.user.country}" />

                                <h:outputText value="Skip to last: " />
                                <h:selectBooleanCheckbox value="#{registrationBean.skip}" />
                            </h:panelGrid>
                        </p:panel>
                    </p:tab>

                    <p:tab id="contact" title="Contact">
                        <p:panel header="Contact Information">

                            <h:messages errorClass="error" />

                            <h:panelGrid columns="2" columnClasses="label, value">
                                <h:outputText value="Email: *" />
                                <p:inputText label="Email"
                                    value="#{registrationBean.user.email}" />

                                <h:outputText value="Contact Number: " />
                                <p:inputText value="#{registrationBean.user.contactNo}" />

                            </h:panelGrid>
                        </p:panel>
                    </p:tab>
                    <p:tab id="education" title="Education">
                        <p:panel header="Education Information">

                            <h:messages errorClass="error" />

                            <h:panelGrid columns="2" columnClasses="label, value">
                                <h:outputText value="Secondary School: " />
                                <p:inputText label="Secondary School"
                                    value="#{registrationBean.user.secondarySchool}" />

                                <h:outputText value="High School: " />
                                <p:inputText label="High School"
                                    value="#{registrationBean.user.highSchool}" />
                                <h:outputText value="College: " />
                                <p:inputText label="College"
                                    value="#{registrationBean.user.college}" />
                                <h:outputText value="University: " />
                                <p:inputText label="University"
                                    value="#{registrationBean.user.university}" />
                                <h:outputText value="Degree: " />
                                <p:inputText label="Degree"
                                    value="#{registrationBean.user.degree}" />

                            </h:panelGrid>
                        </p:panel>
                    </p:tab>
                    <p:tab id="other" title="Other">
                        <p:panel header="Other Information">

                            <h:messages errorClass="error" />

                            <h:panelGrid columns="2" columnClasses="label, value">
                                <h:outputText value="Quote: *" />
                                <p:inputText value="#{registrationBean.user.quote}" />

                                <h:outputText value="About Me: " />
                                <p:inputText value="#{registrationBean.user.aboutMe}" />
                                <h:outputText value="Interest: " />
                                <p:inputText value="#{registrationBean.user.interest}" />

                            </h:panelGrid>
                        </p:panel>
                    </p:tab>
                    <p:tab id="confirm" title="Confirmation">
                        <p:panel header="Confirmation">

                            <h:panelGrid id="confirmation" columns="6">

                                <h:outputText value="Username: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.userName}" />
                                <h:outputText value="Firstname: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.firstName}" />
                                <h:outputText value="Lastname: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.lastName}" />
                                <h:outputText value="Password: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.password}" />
                                <h:outputText value="Date of Birth: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.birthDate}" />
                                <h:outputText value="Gender: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.gender}" />
                                <h:outputText value="Relationship: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.relationship}" />
                                <h:outputText value="EmailID: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.email}" />
                                <h:outputText value="Contact No.: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.contactNo}" />
                                <h:outputText value="Street: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.street}" />
                                <h:outputText value="City: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.city}" />
                                <h:outputText value="Pincode: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.pincode}" />
                                <h:outputText value="State: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.state}" />
                                <h:outputText value="Country: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.country}" />
                                <h:outputText value="Secondary School: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.secondarySchool}" />
                                <h:outputText value="High School: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.highSchool}" />
                                <h:outputText value="College: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.college}" />
                                <h:outputText value="University: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.university}" />
                                <h:outputText value="Degree: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.degree}" />
                                <h:outputText value="Quote: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.quote}" />
                                <h:outputText value="About Me: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.aboutMe}" />
                                <h:outputText value="Interest: " />
                                <h:outputText styleClass="outputLabel"
                                    value="#{registrationBean.user.interest}" />
                                <h:outputText />
                                <h:outputText />
                            </h:panelGrid>

                            <p:commandButton value="Submit" update="growl"
                                action="#{registrationBean.Save}" />

                        </p:panel>
                    </p:tab>

                </p:wizard>
Wizard Sultan
  • 830
  • 7
  • 22
  • 45

1 Answers1

1

This

static {  
        userDB = new ArrayList<User>();  
        Query query = em.createQuery("SELECT u FROM User u", User.class);
        userDB =query.getResultList();

    }

initializes your list of users. This happens once when UserConverter class is first loaded (When is the static block of a class executed?). You refer to this list when generating suggestions for autocomplete.

When you add new user this list is never regenerated. This is why you are not seeing newly added users.

A band-aid approach would be to move that code into class method and call it every time you add a new user or need to generate suggestions list:

public class UserConverter implements Converter {

public static void regenerateUserDB {  
    Query query = em.createQuery("SELECT u FROM User u", User.class);
    userDB = query.getResultList();
}

}

public class SearchBean {

public List<User> completeUser(String query){
    List<User> suggestions = new ArrayList<User>();
    UserConverter.regenerateUserDB();
    for(User u : UserConverter.userDB){
        if(u.getUserName().startsWith(query))
            suggestions.add(u);
    }

    return suggestions;
}
}

A proper way to fix this would be to use a dependency injection framework and so you dont have to build new EMF in every class you use - this wastes resources and can lead to problems. See http://en.wikipedia.org/wiki/Dependency_injection#Java.

Community
  • 1
  • 1
rootkit
  • 2,165
  • 2
  • 29
  • 43
  • Actually I am new to this JSF stuff, it would be nice if you would give me an example to how I can move the block of code to a class method and call it everytime I add new users. ' – Wizard Sultan Feb 27 '13 at 21:38
  • I provided some code suggestions. Your problem has nothing to do with JSF at this stage - its all Java/JPA – rootkit Feb 27 '13 at 21:45
  • I added the following codes to save method of the RegistrationBean : `Query query = em.createQuery("SELECT u FROM User u", User.class); UserConverter.userDB =query.getResultList();` So userDB is getting updated everytime a new user is added, problem is solved – Wizard Sultan Feb 27 '13 at 21:54