/**
 * 
 */
package fr.oltruong.teamag.ejb;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.persistence.Query;

import org.apache.commons.collections.CollectionUtils;

import fr.oltruong.teamag.entity.Parameter;
import fr.oltruong.teamag.entity.ParameterName;

/**
 * @author Olivier Truong
 */
@Singleton
public class ParameterEJB extends AbstractEJB {

    private final Logger logger = Logger.getLogger(getClass().getName());

    private Map<ParameterName, Parameter> parameterMap;

    @PostConstruct
    private void initValue() {
        loadParameters();
    }

    public void saveAndReloadParameters(Parameter smtpHostParameter, Parameter administratorEmailParameter) {
        setSmtpHostParameter(smtpHostParameter);
        setAdministratorEmailParameter(administratorEmailParameter);
        saveParameters();
        loadParameters();
    }

    private void saveParameters() {
        for (Parameter parameter : this.parameterMap.values()) {
            this.getEntityManager().merge(parameter);
        }
    }

    private void loadParameters() {
        Query query = this.getEntityManager().createNamedQuery("findParameters");
        @SuppressWarnings("unchecked")
        List<Parameter> parameterList = query.getResultList();
        if (CollectionUtils.isNotEmpty(parameterList)) {
            this.parameterMap = new HashMap<ParameterName, Parameter>(parameterList.size());
            for (Parameter parameter : parameterList) {
                this.parameterMap.put(parameter.getName(), parameter);
            }
        } else {

            initAndPersistParameterMap();
        }
    }

    private void initAndPersistParameterMap() {

        this.logger.info("Creating parameters Map");

        this.parameterMap = new HashMap<ParameterName, Parameter>(2);
        Parameter smtpHostParameter = new Parameter(ParameterName.SMTP_HOST);
        Parameter administratorEmailParameter = new Parameter(ParameterName.ADMINISTRATOR_EMAIL);

        this.getEntityManager().persist(smtpHostParameter);
        this.getEntityManager().persist(administratorEmailParameter);

        this.parameterMap.put(ParameterName.SMTP_HOST, smtpHostParameter);
        this.parameterMap.put(ParameterName.ADMINISTRATOR_EMAIL, administratorEmailParameter);

    }

    @Lock(LockType.READ)
    public String getSmtpHost() {
        return getSmtpHostParameter().getValue();
    }

    @Lock(LockType.READ)
    public String getAdministratorEmail() {
        return getAdministratorEmailParameter().getValue();
    }

    @Lock(LockType.READ)
    public Parameter getSmtpHostParameter() {
        return this.parameterMap.get(ParameterName.SMTP_HOST);
    }

    @Lock(LockType.READ)
    public Parameter getAdministratorEmailParameter() {
        return this.parameterMap.get(ParameterName.ADMINISTRATOR_EMAIL);
    }

    private void setSmtpHostParameter(Parameter smtpHostParameter) {
        this.parameterMap.put(ParameterName.SMTP_HOST, smtpHostParameter);

    }

    private void setAdministratorEmailParameter(Parameter administratorEmailParameter) {
        this.parameterMap.put(ParameterName.ADMINISTRATOR_EMAIL, administratorEmailParameter);

    }

}

@@ -112,41 +112,8 @@
 Map;
-%0Aimport java.util.logging.Logger;
 %0A%0Aim
@@ -227,16 +227,44 @@
 gleton;%0A
+import javax.inject.Inject;%0A
 import j
@@ -342,16 +342,41 @@
 onUtils;
+%0Aimport org.slf4j.Logger;
 %0A%0Aimport
@@ -552,24 +552,36 @@
 tractEJB %7B%0A%0A
+    @Inject%0A
     private 
@@ -584,14 +584,8 @@
 ate 
-final 
 Logg
@@ -597,49 +597,8 @@
 gger
- = Logger.getLogger(getClass().getName())
 ;%0A%0A 
@@ -1094,21 +1094,16 @@
 meter : 
-this.
 paramete
@@ -1471,37 +1471,32 @@
 ) %7B%0A            
-this.
 parameterMap = n
@@ -1619,37 +1619,32 @@
                 
-this.
 parameterMap.put
@@ -1825,21 +1825,16 @@
         
-this.
 logger.i
@@ -1866,37 +1866,32 @@
 Map%22);%0A%0A        
-this.
 parameterMap = n
@@ -2239,37 +2239,32 @@
 eter);%0A%0A        
-this.
 parameterMap.put
@@ -2309,37 +2309,32 @@
 meter);%0A        
-this.
 parameterMap.put
@@ -2737,37 +2737,32 @@
 %0A        return 
-this.
 parameterMap.get
@@ -2891,21 +2891,16 @@
  return 
-this.
 paramete
@@ -3020,37 +3020,32 @@
 eter) %7B%0A        
-this.
 parameterMap.put
@@ -3195,21 +3195,16 @@
         
-this.
 paramete

Correct EJB logger injection