82
Lidando com Java Obsoleto: Do Struts 1.0 ao CDI Java na Crista da Onda

Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

  • Upload
    hatuyen

  • View
    222

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Lidando com Java Obsoleto: Do Struts 1.0

ao CDIJava na Crista da Onda

Page 2: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Lidando com Java Obsoleto: Do Struts 1.0

ao VRaptor com CDIJava na Crista da Onda

Page 4: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Lidando com Java Obsoleto

Struts & CDI

Page 5: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI
Page 6: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

AMBIENTE

Page 7: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

A long time ago in a galaxy far,

far away...

AMBIENTE

Page 8: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI
Page 9: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

ManutenabilidadeComprometida

❏ baixa coesão❏ alto acoplamento❏ código legado

Page 10: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

JDBC> 600 conexõespor requisição

ManutenabilidadeComprometida

❏ baixa coesão❏ alto acoplamento❏ código legado

Page 11: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI
Page 12: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Como melhorar?

AMBIENTE

Page 13: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Reescrever ?

Page 14: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Reescrever ?

➢ ~ 700.000 linhas de código

(>200.000 de Java)

Page 15: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Reescrever ?

➢ ~ 700.000 linhas de código

(>200.000 de Java)

➢ O que fazer com as regras de negocio? reescrever?

Page 16: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Reescrever ?

➢ ~ 700.000 linhas de código

(>200.000 de Java)

➢ O que fazer com as regras de negocio? reescrever?

➢ Quanto tempo vai custar?

O beneficio vale a pena?

Page 17: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Como evoluir de maneira saudável?

Page 18: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Como evoluir de maneira saudável?

Baixo acoplamento

Alta Coesão

Testes!

Page 19: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

CDI

Page 20: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class ProdutoDao {

public void salvar(Produto produto) { entityManager.persist(produto);

}

}

Page 21: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class ProdutoDao {

private EntityManager entityManager;

public ProdutoDao(EntityManager em) { this.entityManager = em; }

public void salvar(Produto produto) { entityManager.persist(produto);

}

}

Page 22: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class ProdutoDao {

private EntityManager entityManager;

// recebe a dependência pronta

public ProdutoDao(EntityManager em) { this.entityManager = em; }

// usa a dependência

public void salvar(Produto produto) { entityManager.persist(produto);

}

}

Page 23: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

injeção de dependências!

Page 24: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

inversão de controle

injeção de dependências!

Page 25: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

separação de responsabilidades

inversão de controle

injeção de dependências!

Page 26: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

CDI

Page 27: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class ProdutoDao {

private EntityManager entityManager;

public ProdutoDao(EntityManager em) { this.entityManager = em; }

public void salvar(Produto produto) { entityManager.persist(produto);

}

}

Page 28: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class ProdutoDao {

private EntityManager entityManager;

@Inject

public ProdutoDao(EntityManager em) { this.entityManager = em; }

public void salvar(Produto produto) { entityManager.persist(produto);

}

}

Page 29: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class ProdutoDao {

@Inject

private EntityManager entityManager;

public void salvar(Produto produto) { entityManager.persist(produto);

}

}

Page 30: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@Inject

injeção de dependências!

Page 31: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Injeção de dependências por si só já é uma baita diminuição de acoplamento

Page 32: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Injeção de dependências por si só já é uma baita diminuição de acoplamento

Mas, se pensar bem, ainda estamos bem acoplados com a dependência que recebemos

Page 33: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

E se existirem JSPs que são acessados diretamente e

abrem conexão com o banco?

conexões

Page 34: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Quando criar a conexão?

conexões

Page 35: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Podemos usar um filtro?

conexões

Page 36: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Lazy?

conexões

Page 37: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public static ConnectionContainer putContainerInRequest(HttpServletRequest request) {

ConnectionContainer container = new ConnectionContainer();

request.setAttribute(ConnectionFactory. OPEN_IN_VIEW_CONNECTION_CONTAINER, container); return container;

}

Page 38: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public static Connection getConnectionFromRequest(HttpServletRequest request) { ConnectionContainer con = (ConnectionContainer)request.getAttribute( OPEN_IN_VIEW_CONNECTION_CONTAINER);

return con.getConnection();

}

Page 39: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class ConnectionContainer { private Connection connection;

public Connection getConnection() { if (connection == null) { try { connection = ConnectionFactory.createNewConnection(); } catch (SQLException e) { logError("Error blah", e); } } return connection;

}

}

Page 40: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public Connection getCon(HttpServletRequest request) throws SQLException { return getConnectionFromRequest(request);

}

Page 41: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@RequestScoped public Connection getCon(HttpServletRequest request) throws SQLException { return getConnectionFromRequest(request);

}

Page 42: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Podemos usar com injeção?

conexões

Page 43: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@Produces@RequestScoped public Connection getCon(HttpServletRequest request) throws SQLException { return getConnectionFromRequest(request);

}

Page 44: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Utilizando esse mesmo conceito no

EntityManaget

Page 45: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class JPAUtil {

@Produces @ApplicationScoped

public EntityManagerFactory criaFactory() { return Persistence.createEntityManagerFactory("jpa");

}

@Produces @RequestScoped

public EntityManager criaEM(EntityManagerFactory factory){

return factory.createEntityManager(); }

}

Page 46: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@produces

métodos produtores!

Page 47: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

login

Page 48: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

<filter>

<init-param>

<param-name>restrictedUrl</param-name>

<param-value>

/sellerOrder.do, /buyerOrder.do,

/clientCategory.do, /clientCreate.do,

/clientEdit.do, /clientSearch.do,

/productCreate.do, ...

</param-value>

</init-param>

Page 49: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

<init-param>

<param-name>restrictedCommands</param-name>

<param-value>

showUserPasswordForm, showOrderHistoryForm,

showUserFeedbackEditForm, showUserShopForm,

showUserBannerForm, showUserPictureForm,

showUserContactInfoForm, ...

</param-value>

</init-param>

</filter>

Page 50: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Dificuldade de manutenção

Page 51: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface BlockUnloggedUsers { }

Page 52: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface BlockUnloggedUsers { }

@BlockUnloggedUsers public class ProductSearchAction { /* ... */ }

Page 53: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface BlockUnloggedUsers { }

@BlockUnloggedUsers public class ProductSearchAction { /* ... */ }

Bem Melhor!

Page 54: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Como testar ?

Page 55: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public class BlockedActionsTest { private Class<?>[] blackListed = new Class<?>[]{ BuyerOrderAction.class, ClientCreateAction.class, ... };

@Test public void shouldVerifyBlackListedActions(){ for (Class<?> blockedAction : blackListed){

assertNotNull( blockedAction.getAnnotation( BlockUnloggedUsers.class)); ...

Page 56: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

...

Method[] actionMethods = blockedAction.getMethods();

for (Method method : actionMethods) {

assertNull( method.getAnnotation( UnloggedUsers.class)); } }

Page 57: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@InterceptorBinding

interceptadores!

Page 58: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

login

Page 59: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

login

Page 60: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public void loginIntoSession(LoginAuthentication loginAuthentication, HttpServletRequest request, HttpServletResponse response) {

UserInfo loginUser = login.login(loginAuthentication);

SessionUtils.putIntoSession(request,loginUser); SessionUtils.setLoggedUser(request, loginUser);

// + Código para merge dos carrinhos // + Código de traqueamento // = Código Monstro!}

Page 61: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

public void loginIntoSession(LoginAuthentication loginAuthentication, HttpServletRequest request, HttpServletResponse response) {

UserInfo loginUser = login.login(loginAuthentication);

SessionUtils.putIntoSession(request,loginUser); SessionUtils.setLoggedUser(request, loginUser);

sessionLoginEvent.fire( new SessionLogin( loginUser, request, response)); }

Page 62: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@Inject private Event<SessionLogin> sessionLoginEvent;

public void algumMetodoInteressado( @Observers SessionLogin sessionLogin) {

// ... }

Page 63: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

@Observers

eventos!

Page 64: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Isso não é tudo!

Page 65: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

decoratorsstereotypesinjection pointscustom scopes conversation scope extensions

Page 66: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

???

Page 67: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Qual framework adotar?

Como escolher?

Page 68: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

JSFPlay!

SpringVRaptor

???

Page 69: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI
Page 70: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Quão fácil é trocar um framework?

❏ Desenvolvedores não envolvidos no processo?

Page 71: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Quão fácil é trocar um framework?

❏ Desenvolvedores não envolvidos no processo?

❏ Entregas de produto?

Page 72: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Quão fácil é trocar um framework?

❏ Desenvolvedores não envolvidos no processo?

❏ Entregas de produto?

❏ Ferias coletivas?

Page 73: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Neste caso trocar

é blocante!

Page 74: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Se já é difícil lidar com um só, imagine dois!

Page 75: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Se já é difícil lidar com um só, imagine dois!

Page 76: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI
Page 77: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

if (analyser.isRouteToVRaptor((HttpServletRequest) req)) { super.doFilter(req, res, chain);

} else { Elo7MutableRequest mutableRequest = new Elo7MutableRequest((HttpServletRequest) req);

Elo7MutableResponse mutableResponse = new Elo7MutableResponse((HttpServletResponse) res);

StrutsRequestStarted request = new StrutsRequestStarted(chain, mutableRequest, mutableResponse); strutsRequestStartedEvent.fire(request); chain.doFilter(req, res);

}

Page 78: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI
Page 79: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Você deveria usar CDI em todos os seus projetos Java!

Page 80: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Considere usar VRaptor em seus projetos

Page 81: Lidando com Java Obsoleto: Do Struts 1.0 ao CDI

Obrigado!

David Robert@while42