Convenções de código em Java

Porque adotamos convenções de código ?
Adotamos convenções de código para facilitar a leitura e manutenção do código de um software.
Um código mal escrito, mal documentado e uma formatação fora de padrões podem prejudicar muito o entendimento de determinado método, classe, API ou framework.
- 80% dos custos gerais de um software são destinados a manutenção.
- Dificilmente um software será mantido, por toda vida por seu autor.

Convenção de Nomes
Mantenha o tamanho dos nomes grande o bastante para transmitir o que eles representam. Exemplo: primeiroNome, sobrenome, ordemServico, etc.

Nomes de Classes e Interfaces
- Os nomes de classe devem ser substantivos.
- Devem começar com letra minúscula de a-z, _ ou $.
- Nomes compostos devem começar com o primeiro caracter de cada palavra em maiúsculo.
- Use palavras inteiras evitando acrônimos e abreviaturas.
Exemplo:

 class ContaPoupanca {
 }

Nomes de Métodos
- Os nomes de métodos devem ser verbos.
- Devem começar com letra minúscula de a-z, _ ou $.
- Nomes compostos devem começar com o primeiro nome minúsculo, e o primeiro caracter de cada palavra interna em maiúsculo.
Exemplo:

Nomes de Variáveis
- Devem começar com letra minúscula de a-z, _ ou $.
- Nomes compostos devem começar com o primeiro nome minúsculo, e o primeiro caracter de cada palavra interna em maiúsculo.
- Use nomes no plural para representar coleções como arrays, lists, sets e maps.
Exemplo:

int numeroPedido;
String primeiroNome;
Cliente[] clientes;
List<Pedido> pedidos

Nomes de Constantes
- Devem ter todas as letras em maiúsculo
- Nomes compostos devem ser separados por underscore.
Exemplo:

private static final int MAX_CLIENTS; 

Comentários
Inline
cheia
Multiline
cheia
Documentação
cheia

Posted in Java | Leave a comment

JSF 2, Spring, Spring Security 3 and Database

Download Spring Security
Spring Security 3.1.0.RELEASE – http://www.springsource.org/spring-security

Maven Artifacts


<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>

Database

CREATE TABLE  `springsec`.`user` (
`username` varchar(255) NOT NULL,
`active` bit(1) NOT NULL,
`familyName` varchar(255) DEFAULT NULL,
`firstName` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

insert into user (username, password, firstName, familyName, active) VALUES(‘user’, ‘password’,'Administrator’,'Family Name’,true);

CREATE TABLE  `springsec`.`role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

insert into role (id, name) VALUES(1,’ROLE_ADMIN’);

CREATE TABLE  `springsec`.`user_role` (
`user_username` varchar(255) NOT NULL,
`roles_id` bigint(20) NOT NULL,
KEY `FK143BF46A4903B745` (`user_username`),
KEY `FK143BF46A45FF7703` (`roles_id`),
CONSTRAINT `FK143BF46A45FF7703` FOREIGN KEY (`roles_id`) REFERENCES `role` (`id`),
CONSTRAINT `FK143BF46A4903B745` FOREIGN KEY (`user_username`) REFERENCES `user` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO user_role (user_username, roles_id) VALUES(‘user’,1);

User.java
A entidade User implementa a interface UserDetails


import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
@Entity
@Table(name="user")
public class User implements Serializable, UserDetails {
	/**
	 *
	 */
	private static final long serialVersionUID = 1L;
	@Id
	private String username;
	private String password;
	private String firstName;
	private String familyName;
	private boolean active;
	@ManyToMany(fetch=FetchType.EAGER)
	private List<Role> roles;
	@Transient
	public Collection<GrantedAuthority> getAuthorities() {
		List<GrantedAuthority> result = new ArrayList<GrantedAuthority>();
	    for (Role role : roles) {
	      result.add(new GrantedAuthorityImpl(role.getName()));
	    }
	    return result;
	}
	@Override
	public String getPassword() {
		return password;
	}
	@Override
	public String getUsername() {
		return username;
	}
	@Transient
	public boolean isAccountNonExpired() {
		return true;
	}
	@Transient
	public boolean isAccountNonLocked() {
		return true;
	}
	@Transient
	public boolean isCredentialsNonExpired() {
		return true;
	}
	@Transient
	public boolean isEnabled() {
		return active;
	}
	public String getFirstName() {
		return firstName;
	}

	// métodos getters e setters omitidos
	// métodos hashcode e equals omitidos

}

 

 

ManagedBean:


import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import demo.service.AuthenticationService;

@ManagedBean(name="loginMB")
@RequestScoped
public class LoginBean {

@ManagedProperty(value = "#{authenticationService}")
private AuthenticationService authenticationService;

private String userName;
private String password;

public String login() {
boolean success = authenticationService.login(userName, password);

if (!success) {
FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Login ou senha inválidos");
FacesContext.getCurrentInstance().addMessage(null, facesMessage);
return "falhaLogin";
}

return "sucessoLogin";
}

public String logout() {
authenticationService.logout();
return "login";
}

public String getUsuarioLogado(){
return authenticationService.getUsuarioLogado().getUsername();
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public void setAuthenticationService(AuthenticationService authenticationService) {
this.authenticationService = authenticationService;
}

}

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import demo.model.User;

@Component("authenticationService")
public class AuthenticationService {

@Autowired
@Qualifier("authenticationManager")
private AuthenticationManager authenticationManager;

public boolean login(String username, String password) {
try {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
Authentication authenticate = authenticationManager.authenticate(token);
if (authenticate.isAuthenticated()) {
SecurityContextHolder.getContext().setAuthentication(authenticate);
return true;
}
}
catch (AuthenticationException e) {}
return false;
}

public void logout() {
SecurityContextHolder.getContext().setAuthentication(null);
invalidateSession();
}

public User getUsuarioLogado() {
return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}

private void invalidateSession() {
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
session.invalidate();
}

}

A autenticação é feita pela interface UserDetailsService.
Criamos uma implementação de UserDetailsService e sobrescrevemos o método loadUserByUsername()


import javax.annotation.Resource;
import javax.persistence.NoResultException;

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import demo.dao.UserDao;
import demo.model.User;

@Component("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

@Resource
private UserDao userDao;

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDetails userReturn = findByUsername(username);
return userReturn;
}

private User findByUsername(String username) {
try{
User userRecuperado = userDao.pesquisarPorId(username);
if (userRecuperado == null) {
throw new NoResultException();
}
return userRecuperado;

}catch (NoResultException e) {
throw new UsernameNotFoundException("User not found");
}
}
}
<authentication-manager alias="authenticationManager" >
<authentication-provider user-service-ref="userDetailsService">
<password-encoder hash="plaintext" />
</authentication-provider>
</authentication-manager>

And DAO…

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
@Entity
@Table(name=”user”)
public class User implements Serializable, UserDetails {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
private String username;
private String password;
private String firstName;
private String familyName;
private boolean active;
@ManyToMany(fetch=FetchType.EAGER)
private List<Role> roles;
@Transient
public Collection<GrantedAuthority> getAuthorities() {
List<GrantedAuthority> result = new ArrayList<GrantedAuthority>();
for (Role role : roles) {
result.add(new GrantedAuthorityImpl(role.getName()));
}
return result;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Transient
public boolean isAccountNonExpired() {
return true;
}
@Transient
public boolean isAccountNonLocked() {
return true;
}
@Transient
public boolean isCredentialsNonExpired() {
return true;
}
@Transient
public boolean isEnabled() {
return active;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFamilyName() {
return familyName;
}
public void setFamilyName(String familyName) {
this.familyName = familyName;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (active ? 1231 : 1237);
result = prime * result
+ ((familyName == null) ? 0 : familyName.hashCode());
result = prime * result
+ ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result + ((roles == null) ? 0 : roles.hashCode());
result = prime * result
+ ((username == null) ? 0 : username.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (active != other.active)
return false;
if (familyName == null) {
if (other.familyName != null)
return false;
} else if (!familyName.equals(other.familyName))
return false;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (roles == null) {
if (other.roles != null)
return false;
} else if (!roles.equals(other.roles))
return false;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
}

}

Posted in Java, JSF, Spring, Spring Security | 2 Comments

Open Session In Viewer

No web.xml


<listener>
<listener-class>br.com.tissbr.vtwsx.util.SessionFactoryManager</listener-class>
</listener>

Crie uma classe SessionFactoryManager que implementa ServeletContextListener. Essa classe criará sua SessionFactory.


public class SessionFactoryManager implements ServletContextListener {
private static Log log = LogFactory.getLog(SessionFactoryManager.class);

public void contextInitialized(ServletContextEvent sce) {
try {
Configuration cfg = new AnnotationConfiguration();
cfg.configure();
SessionFactory sf = cfg.buildSessionFactory();
HibernateUtil.setSessionFactory(sf);
log.info("SessionFactory inicializada");
} catch (HibernateException hbe) {
log.fatal("Impossivel abrir SessionFactory", hbe);
}
}

public void contextDestroyed(ServletContextEvent sce) {
try {
SessionFactory sf = HibernateUtil.getSessionFactory();
if (!sf.isClosed())
sf.close();
} catch (HibernateException hbe) {
log.error("Impossivel fechar SessionFactory", hbe);
}
}
}

Crie a classe HibernateUtil. Você utilizará ela para obter uma nova Session.


import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

public class HibernateUtil {
private static SessionFactory sessionFactory;

public static SessionFactory getSessionFactory() {
return sessionFactory;
}

public static void setSessionFactory(SessionFactory aSessionFactory) {
sessionFactory = aSessionFactory;
}

public static Session getManagedSession(boolean forceTransaction) {
Session s = sessionFactory.getCurrentSession();
if (forceTransaction && !s.getTransaction().isActive()) {
s.beginTransaction();
}
return s;
}

public static Session getManagedSession() {
return getManagedSession(true);
}

public static Transaction getTransaction() {
return getManagedSession(false).getTransaction();
}

}

Crie uma classe HibernateRequestFilter que implementa a interface Filter


import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Transaction;

public class HibernateRequestFilter implements Filter {
private static Log log = LogFactory.getLog(HibernateRequestFilter.class);

public void init(FilterConfig config) throws ServletException {
log.info("HibernateRequestFilter inicializado");
}

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws ServletException, IOException {
boolean tudoOk = false;
try {
chain.doFilter(req, resp);
tudoOk = true;
} catch (ServletException e) {
log.warn("abortando transacao", e.getRootCause() == null ? e : e
.getRootCause());
throw e;
} catch (IOException e) {
log.warn("abortando transacao", e);
throw e;
} catch (RuntimeException e) {
log.warn("abortando transacao", e);
throw e;
} finally {
Transaction tx = HibernateUtil.getTransaction();
if (tx.isActive()) {
if (tudoOk)
tx.commit();
else
tx.rollback();
}
}
}

public void destroy() {
}
}

No web.xml adicione:


<filter>
<filter-name>hibernateRequestFilter</filter-name>
<filter-class>br.com.tissbr.vtwsx.util.HibernateRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateRequestFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

Exemplo método salvar no DAO:


public ID salvar(T object) throws DAOException {
Session session = null;
Transaction tx = null;
ID id = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
id = (ID) session.save(object);
tx.commit();
} catch (HibernateException hbe) {
if (tx != null) {
tx.rollback();
}
throw new DAOException(hbe);
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return id;
}

O método acima abre uma Session nova e ao realizar o commit a sessão é fechada, ou seja, a Session da View continua aberta.

Opiniões e sugestões são bem vindas.

Posted in Hibernate, Java, JSF | Leave a comment

JSF 2 e Spring Security 3

JSF 2 e Spring: http://www.lejava.com.br/java/jsf/jsf-2-e-spring

Configurando o Filtro do Spring Security

<filter>
 <filter-name>springSecurityFilterChain</filter-name>
 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
 <filter-name>springSecurityFilterChain</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<http auto-config="true" >
 <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
 <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf" />
 <access-denied-handler error-page="/semPermissao.jsf" />
 </http>

 <authentication-manager>
 <authentication-provider>
 <user-service>
 <user name="admin" password="admin" authorities="ROLE_ADMIN" />
 </user-service>
 </authentication-provider>
 </authentication-manager>
Posted in Java, JSF, Spring | Leave a comment

JSF 2 e Spring

ContextLoaderListener

RequestContextListener

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

Integrando o JSF com Spring

<application>
 <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
 </application>

 

Posted in Java, JSF, Spring | 1 Comment