= CDI Produces Disposes
:index-group: CDI
:jbake-type: page
:jbake-status: published

Esté exemplo demostra como as anotações @Produces e @Disposes trabalham. Um LogFactory cria uma instância do LogHandler
dependendo de um atributo "type". Para o propósito deste exemplo, o type é hard-coded para especificar um valor.
Uma implementação Logger deve conter uma lista de LogHandlers.

 Teremos três implementações da interface LogHandler: 

* Uma DatabaseHandler
* Uma FileHandler
* Uma ConsoleHandler

O DatabaseHandler aparentemente gravaria os logs em um banco de dados. 

O FileHandler gravaria os logs em um arquivo.

O ConsoleHandler apenas imprimiria os logs para um console (saída padrão). 

Esté exemplo é apenas uma ilustração de como os conceitos dentro do CDI funcionam e não destina-se a fornecer uma implementação/design de um framework de log.


== ConsoleHandler

[source,java]
----
package org.superbiz.cdi.produces.disposes;

public class ConsoleHandler implements LogHandler {

    private String name;

    public ConsoleHandler(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void writeLog(String s) {
        System.out.printf("##### Handler: %s, Writing to the console!\n", getName());
    }
}
----

== DatabaseHandler

[source,java]
----
package org.superbiz.cdi.produces.disposes;

public class DatabaseHandler implements LogHandler {

    private String name;

    public DatabaseHandler(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void writeLog(String s) {
        System.out.printf("##### Handler: %s, Writing to the database!\n", getName());
        // Use conexão para gravar log no banco de dados
    }
}
----

== FileHandler

[source,java]
----
package org.superbiz.cdi.produces.disposes;

public class FileHandler implements LogHandler {

    private String name;

    public FileHandler(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void writeLog(String s) {
        System.out.printf("##### Handler: %s, Writing to the file!\n", getName());
        // Escreva para o arquivo de log
    }
}
----

== LogFactory

[source,java]
----
package org.superbiz.cdi.produces.disposes;

import jakarta.enterprise.inject.Disposes;
import jakarta.enterprise.inject.Produces;

public class LogFactory {

    private int type = 2;

    @Produces
    public LogHandler getLogHandler() {
        switch (type) {
            case 1:
                return new FileHandler("@Produces created FileHandler!");
            case 2:
                return new DatabaseHandler("@Produces created DatabaseHandler!");
            case 3:
            default:
                return new ConsoleHandler("@Produces created ConsoleHandler!");
        }
    }

    public void closeLogHandler(@Disposes LogHandler handler) {
        switch (type) {
            case 1:
                System.out.println("Closing File handler!");
                break;
            case 2:
                System.out.println("Closing DB handler!");
                break;
            case 3:
            default:
                System.out.println("Closing Console handler!");
        }
    }
}
----

== Logger

[source,java]
----
package org.superbiz.cdi.produces.disposes;

public interface Logger {

    public void log(String s);

    public LogHandler getHandler();
}
----

== LoggerImpl

[source,java]
----
package org.superbiz.cdi.produces.disposes;

import jakarta.inject.Inject;
import jakarta.inject.Named;

@Named("logger")
public class LoggerImpl implements Logger {

    @Inject
    private LogHandler handler;

    @Override
    public void log(String s) {
        getHandler().writeLog(s);
    }

    public LogHandler getHandler() {
        return handler;
    }
}
----

== LogHandler

[source,java]
----
package org.superbiz.cdi.produces.disposes;

public interface LogHandler {

    public String getName();

    public void writeLog(String s);
}
----

== beans.xml

[source,xml]
----
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                            http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

</beans>
----

== LoggerTest

[source,java]
----
package org.superbiz.cdi.produces.disposes;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import jakarta.ejb.embeddable.EJBContainer;
import jakarta.inject.Inject;
import javax.naming.Context;

import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class LoggerTest {

    @Inject
    Logger logger;

    private Context ctxt;

    @Before
    public void setUp() {
        try {
            ctxt = EJBContainer.createEJBContainer().getContext();
            ctxt.bind("inject", this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @After
    public void cleanUp() {
        try {
            ctxt.unbind("inject");
            ctxt.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testLogHandler() {
        assertNotNull(logger);
        assertFalse("Handler should not be a ConsoleHandler", logger.getHandler() instanceof ConsoleHandler);
        assertFalse("Handler should not be a FileHandler", logger.getHandler() instanceof FileHandler);
        assertTrue("Handler should be a DatabaseHandler", logger.getHandler() instanceof DatabaseHandler);
        logger.log("##### Testing write\n");
        logger = null;
    }

}
----

= Executando

[source,console]
----
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.superbiz.cdi.produces.disposes.LoggerTest
Apache OpenEJB 4.0.0-beta-1    build: 20111002-04:06
http://tomee.apache.org/
INFO - openejb.home = /Users/dblevins/examples/cdi-produces-disposes
INFO - openejb.base = /Users/dblevins/examples/cdi-produces-disposes
INFO - Using 'jakarta.ejb.embeddable.EJBContainer=true'
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Found EjbModule in classpath: /Users/dblevins/examples/cdi-produces-disposes/target/classes
INFO - Beginning load: /Users/dblevins/examples/cdi-produces-disposes/target/classes
INFO - Configuring enterprise application: /Users/dblevins/examples/cdi-produces-disposes
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean cdi-produces-disposes.Comp: Container(type=MANAGED, id=Default Managed Container)
INFO - Enterprise application "/Users/dblevins/examples/cdi-produces-disposes" loaded.
INFO - Assembling app: /Users/dblevins/examples/cdi-produces-disposes
INFO - Jndi(name="java:global/cdi-produces-disposes/cdi-produces-disposes.Comp!org.apache.openejb.BeanContext$Comp")
INFO - Jndi(name="java:global/cdi-produces-disposes/cdi-produces-disposes.Comp")
INFO - Jndi(name="java:global/EjbModule10202458/org.superbiz.cdi.produces.disposes.LoggerTest!org.superbiz.cdi.produces.disposes.LoggerTest")
INFO - Jndi(name="java:global/EjbModule10202458/org.superbiz.cdi.produces.disposes.LoggerTest")
INFO - Created Ejb(deployment-id=cdi-produces-disposes.Comp, ejb-name=cdi-produces-disposes.Comp, container=Default Managed Container)
INFO - Created Ejb(deployment-id=org.superbiz.cdi.produces.disposes.LoggerTest, ejb-name=org.superbiz.cdi.produces.disposes.LoggerTest, container=Default Managed Container)
INFO - Started Ejb(deployment-id=cdi-produces-disposes.Comp, ejb-name=cdi-produces-disposes.Comp, container=Default Managed Container)
INFO - Started Ejb(deployment-id=org.superbiz.cdi.produces.disposes.LoggerTest, ejb-name=org.superbiz.cdi.produces.disposes.LoggerTest, container=Default Managed Container)
INFO - Deployed Application(path=/Users/dblevins/examples/cdi-produces-disposes)
##### Handler: @Produces created DatabaseHandler!, Writing to the database!
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.02 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
----
