Editar informações do usuário logado - herança, Spring Security,

Oi, estou desenvolvendo um sistema Java web usando Hibernate, Maven, MySQL, Spring framework, Spring Security, JSF, Primefaces, Html e Css. Tenho uma classe Usuario e por herança dela uma classe Empresa. O usuário empresa faz o seu cadastro e o login no sistema, isso está ok, mas quero desenvolver uma tela onde ele possa editar os seus dados e salvar.

O que eu conseguir até agora:
Consigo pegar o login do usuário logado;
Tenho um método que faz a busca por login no banco e me traz um objeto empresa.

O que eu não sei fazer:
Pegar o login do usuário logado e jogar dentro do meu método de busca por login;
Trazer as informações na tela de edição.

Acabei criando um Bean chamado UsuarioCtrl e outro é o EmpresaCtrl que é o meu principal, mas nem se se precisa. Meio perdido estou eu, =(

Segue o meu código:

CLASSE USUARIO
package br.com.protoforma.entidade;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Usuario implements Serializable {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique=true)
private Integer idUsuario;

@Column(nullable=false, unique=true, length=40) 
private String login;

@Column(nullable=false, length=40)
private String senha;

@Column(nullable=false)
private Boolean ativo;

@Column(nullable=false)
private String tipo;

//Construtor
public Usuario (){
	
}

…Getters e setters, hashCode…

CLASSE EMPRESA
package br.com.protoforma.entidade;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Empresa extends Usuario implements Serializable {

@Column(length=18, nullable=false, unique=true)
private String cnpj;

@Column(length=30)
private String ie;

@Column(nullable=false)
private String razaoSocial;
@Column(nullable=false)
private String nomeFantasia;
private String endereco;
private String bairro;
@Column(length=9)
private String cep;
@Column(length=30)
private String numeroCasa;
@Column(length=50)
private String complemento;

@Column(nullable=false, length=30)
private String telefone;
@Column(length=30)
private String celular;
@Column(nullable=false, length=130)
private String email;

private String nomeContatoEmpresa;
@Column(columnDefinition="text(2100)", length=2100)
private String missaoEmpresa;
@Column(columnDefinition="text(2100)", length=2100)
private String visaoEmpresa;
@Column(columnDefinition="text(2100)", length=2100)
private String descricaoEmpresa;

@ManyToOne(optional=false)
@JoinColumn
private CondPagamento condPagamento;

@ManyToOne(optional=false)
@JoinColumn
private Cidade cidade;

@ManyToOne(optional=false)
@JoinColumn
private Estado estado;

@ManyToOne(optional=false)
@JoinColumn
private RamoAtividade ramoAtividade;


@ManyToOne(optional=false)
@JoinColumn
private Setor setor;

@Temporal(value=TemporalType.TIMESTAMP)
private Date dataCadastroEmpresa= new java.sql.Date(System.currentTimeMillis());
		
@OneToMany(mappedBy="empresa")
private List<Projeto> projetoEmp;

//Construtor da classe
public Empresa (){
	
}

…Getters e setters, hashCode…

CLASSE EMPRESADAO
package br.com.protoforma.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.protoforma.controller.MensagemUtil;
import br.com.protoforma.entidade.Empresa;

@Repository
public class EmpresaDAO {

@PersistenceContext
EntityManager em;

public EmpresaDAO(EntityManager em) {
	this.em = em;
}

public EmpresaDAO() {

}


public Usuario buscarLogin(String login) {
	try {
		Query q = em.createQuery("Select usu from Usuario usu where usu.login=:loginParam"); 
		q.setParameter("loginParam", login); 
		q.setMaxResults(1); 
		return (Usuario) q.getSingleResult();
	} catch (NoResultException e) {
		return null;
	}
}

@Transactional
public Empresa buscarLoginEmpresa(String login) {
	try {
		Query q = em.createQuery("Select usu from Usuario usu where usu.login=:loginParam"); 
		q.setParameter("loginParam", login); 
		q.setMaxResults(1); 
		return (Empresa) q.getSingleResult();
	} catch (NoResultException e) {
		return null;
	}
}

@Transactional
public Empresa buscarLoginEmp(String login) {
	try {
		Query q = em.createQuery("Select emp from Empresa emp where emp.login=:loginParam"); 
		q.setParameter("loginParam", login); 
		q.setMaxResults(1); 
		return (Empresa) q.getSingleResult();
	} catch (NoResultException e) {
		return null;
	}
}

@Transactional
public Empresa buscarLoginUsuEmp(String login) {
	try {
		Query q = em.createQuery("Select usu, emp from Usuario usu, Empresa emp where usu.idUsuario = emp.idUsuario and usu.login=:loginParam"); 
		q.setParameter("loginParam", login); 
		q.setMaxResults(1); 
		return (Empresa) q.getSingleResult();
	} catch (NoResultException e) {
		return null;
	}
}	

}

EMPRESA SERVICE
package br.com.protoforma.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.protoforma.controller.MensagemUtil;
import br.com.protoforma.dao.DAOException;
import br.com.protoforma.dao.EmpresaDAO;
import br.com.protoforma.entidade.Empresa;
import br.com.protoforma.mail.EmailJava;

@Service
public class EmpresaService {

@Autowired
EmpresaDAO empresaDAO;


@Transactional
public Empresa buscarPorCnpjEmp1(String cnpj){
	Empresa empCNPJ = new Empresa();
	empCNPJ = empresaDAO.buscarCNPJ(cnpj);
	return empCNPJ;	
}

@Transactional
public Empresa buscarLogin(String login)throws ServiceException {
	Empresa emp = new Empresa();
	emp = empresaDAO.buscarLoginEmp(login);
	return emp;
}

}

CLASSE EMPRESACONTROLLER
package br.com.protoforma.controller;

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

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.web.jsf.FacesContextUtils;

import br.com.protoforma.dao.CidadeDAO;
import br.com.protoforma.dao.EstadoDAO;
import br.com.protoforma.entidade.Cidade;
import br.com.protoforma.entidade.Empresa;
import br.com.protoforma.entidade.Estado;
import br.com.protoforma.entidade.Usuario;
import br.com.protoforma.service.EmpresaService;
import br.com.protoforma.service.ServiceException;

@SessionScoped
@Controller(value=“empresaCtrl”)
public class EmpresaController implements Serializable {

@PersistenceContext
EntityManager em;

private Usuario usuario;
private Estado estado;
private Cidade cidade;

@Autowired
private EmpresaService empresaService;
@Autowired
private CidadeDAO cidadeDAO;
@Autowired
private EstadoDAO estadoDAO;

private UsuarioController usuController = new UsuarioController();
private Empresa empresa = new Empresa();
private List<Empresa> empresaList;
private List<Estado> estados;
private List<Cidade> cidades;
private String cnpj;
private String login;

public EmpresaController(){
	empresa = new Empresa();
	SecurityContext context = SecurityContextHolder.getContext();
	if(context instanceof SecurityContext){
		Authentication authentication = context.getAuthentication();
		if(authentication instanceof Authentication){
			empresa.setLogin(((User) authentication.getPrincipal()).getUsername());
		}
	}
}



public void editar1(Empresa empresa){
	this.empresa = empresa;
}

public String editar2(Empresa empresa){
	this.usuController.usuempedit(empresa);
	return "dadosempresa.xhtml";
}

public void editar(){
	FacesContext context = FacesContext.getCurrentInstance();
	ExternalContext external = context.getExternalContext();
	String login = external.getRemoteUser();
	
	String caso1 =(String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
	System.out.println(caso1);
	
	System.out.println(login);
	//Empresa emp = empresaService.buscarLogin(login);
	//System.out.println(emp);
	//this.empresa = emp;
}

public void test(){

// SecurityContext context = SecurityContextHolder.getContext();
// if (context instanceof SecurityContext){
// Authentication authentication = context.getAuthentication();
// if (authentication instanceof Authentication){
// usuario.setLogin(((User)authentication.getPrincipal()).getUsername());

        //	usuario.setNome(((User)authentication.getPrincipal()).getUsername());
	
      Object usuarioLogado = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
      String username;
      if (usuarioLogado  instanceof UserDetails ) {
        username= ( (UserDetails)usuarioLogado).getUsername();
       } else {
        username = usuarioLogado.toString();
        }
      System.out.println(username);
      //String login = username.toString();
    //  Empresa emp = empresaService.buscarLogin(username);
	//	System.out.println(emp.toString());
}

CLASSE USUARIOCONTROLLER
package br.com.protoforma.controller;

import br.com.protoforma.entidade.Empresa;
import br.com.protoforma.entidade.Usuario;
import br.com.protoforma.service.EmpresaService;
import br.com.protoforma.service.UsuarioService;
import br.com.protoforma.util.FacesContextUtil;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;

@SessionScoped
@Controller(value=“usuarioCtrl”)
public class UsuarioController implements Serializable {

@Autowired
private UsuarioService usuarioService;

private Empresa empresa = new Empresa();
private Usuario usuario;
private String login;

public UsuarioController() {
    usuario = new Usuario();
    SecurityContext context = SecurityContextHolder.getContext();
    if (context instanceof SecurityContext){
        Authentication authentication = context.getAuthentication();
        if (authentication instanceof Authentication){
        	usuario.setLogin(((User)authentication.getPrincipal()).getUsername());    
        }
    }
}

@Transactional
public Usuario usuempresa(){
	Usuario usulogado = new Usuario();
	String login = getLoginUsuarioLogado();
	System.out.println(login);
	System.out.println("Retorna Usu 4:");
	Session session = FacesContextUtil.getRequestSession();
	Query query = session.createSQLQuery("Select * from usuario where login=:loginParam");
	query.setParameter("loginParam", login);
	query.setMaxResults(1);
	usulogado = (Usuario) query.uniqueResult();
	System.out.println(usulogado);
	return usulogado;
}

public String usuemplog(){
	
	String loginemp = getLoginUsuarioLogado();
	System.out.println(loginemp);
	System.out.println("Retorna Usu 5:");
	Empresa empLogin = new Empresa();
	System.out.println(loginemp);
	empLogin = usuarioService.buscarLoginEmp(loginemp);
	String msg = empLogin.getCnpj();
	System.out.println(msg);
	return empLogin.getEmail();
}


public void usuarioporlogin(){
	
	Usuario usuLogin = new Usuario();
	System.out.println(login);
	usuLogin = usuarioService.buscarLogin(login);
	String msg = usuLogin.getSenha();
	System.out.println(msg);
	
}

//Esse metodo quando uso o usuarioCtrl eu digito o login e ele me traz o CNPJ, está funcionando
public void usuparaemp(){
	
	Empresa empLogin = new Empresa();
	System.out.println(login);
	empLogin = usuarioService.buscarLoginEmp(login);
	String msg = empLogin.getCnpj();
	System.out.println(msg);
	
}
public Empresa usuempedit(Empresa empresa){
	
	Empresa empLogin = new Empresa();
	System.out.println(empresa.getLogin());
	empLogin = usuarioService.buscarLoginEmp(empresa.getLogin());
	String msg = empLogin.getCnpj();
	System.out.println(msg);
	return empLogin;
}

public Empresa editaremp(){
	
	Empresa empLogin = new Empresa();
	System.out.println(login);
	empLogin = usuarioService.buscarLoginEmp(login);
	String msg = empLogin.getCnpj();
	System.out.println(msg);
	return empLogin;
	
}

public void editaremp1(){
	this.empresa = editaremp();
}

public void editar(){
	Empresa empLogin = new Empresa();
	System.out.println(login);
	empLogin = usuarioService.buscarLoginEmp(login);
	String msg = empLogin.getCnpj();
	System.out.println(msg);
	this.usuario = empLogin;
}

PAGINA XHTML
?xml version=“1.0” encoding =“UTF-8”?>

Meus Dados - Empresa - Protoforma
<div id="direitamenu" class="9u 12u(mobile)">		
							
										<div class="12u 12u(mobile)">
										<header class="major">
										<h:outputText value="Seja Bem Vindo #{usuarioController.usuario.login}" />
											<h2>Informações de Sua Empresa</h2>
										</header>
										</div>
										<div class="row">
											<div class="1u">
											</div>
											<div class="10u 12u(mobile)">
										<h:form id="formEmp" prependId="false">
											<p:messages id="msgs" autoUpdate="true"/>
											
												<div class="divform" align="center" >
											<p:panelGrid columns="2" id="gridemp">
												
											 <h:outputLabel class="outputLabelform" value="CNPJ:" for="cnpj"/>				
										     <p:inputMask id="cnpj" class="campoform" value="#{empresaCtrl.empresa.cnpj}" mask="99.999.999/9999-99">
										     <stella:validateCNPJ/>
										     </p:inputMask>
										      
										     <h:outputLabel class="outputLabelform" value="Inscrição Estadual:" for="ie"/>
											 <p:inputText id="ie" value="#{empresaCtrl.empresa.ie}" class="inscricao"></p:inputText>
											 
											 <p:outputLabel class="outputLabelform" value="Razão Social:" for="razaoSocial"/>
											 <p:inputText id="razaoSocial" class="campoform" value="#{empresaCtrl.empresa.razaoSocial}" 
											 requiredMessage="Por favor, escreva o nome da Razão Social da empresa"></p:inputText>
											 
											 <p:outputLabel class="outputLabelform"  value="Nome Fantasia:" for="nomeFantasia"/>
											 <p:inputText id="nomeFantasia" class="campoform" value="#{empresaCtrl.empresa.nomeFantasia}"></p:inputText>
											 
											 <h:outputLabel class="outputLabelform" value="Ramo de Atividade (Cod. CNAE):" for="ramoAtividade"/>
											 <p:selectOneMenu id="ramoAtividade" class="camposel" value="#{empresaCtrl.empresa.ramoAtividade}" converter="#{ramoAtividadeConverter}"
											 		filter="true" filterMactchMode="contains">
													<f:selectItem itemValue="" itemLabel="Selecione" noSelectionOption="true"></f:selectItem>
													<f:selectItems value="#{ramoAtividadeCtrl.ramoAtividadeList}" var="ramo" itemLabel="#{ramo.descricaoRamoAti}"></f:selectItems>
											</p:selectOneMenu>
											 
											 <p:outputLabel class="outputLabelform" value="Setor:" for="setor"/>
											 <p:selectOneMenu id="setor" class="camposel" value="#{empresaCtrl.empresa.setor}" converter="#{setorConverter}">
															<f:selectItem itemValue="" itemLabel="Selecione" noSelectionOption="true"></f:selectItem>
															<f:selectItems value="#{setorCtrl.setorList}" var="set"	itemLabel="#{set.descricaoSetor}"></f:selectItems>
											</p:selectOneMenu>
										
											 <p:outputLabel class="outputLabelform" value="Estado:" for="estado"/>
											 <p:selectOneMenu id="estado" class="camposel" value="#{empresaCtrl.empresa.estado}" converter="#{estadoConverter}"
											 						requiredMessage="Por favor, selecione o estado" 
											 						filter="true" filterMactchMode="contains">
															<f:selectItem itemValue="" itemLabel="Selecione o estado" noSelectionOption="true"/>
															<f:selectItems value="#{empresaCtrl.estados}" var="e" itemValue="#{e}" itemLabel="#{e.nomeEstado}"/>
															<p:ajax update="cidade" listener="#{empresaCtrl.carregarCidades()}"/>
														</p:selectOneMenu>				
											
											 <p:outputLabel class="outputLabelform" value="Cidade:" for="cidade"/>
											 <p:selectOneMenu id="cidade" class="camposel" value="#{empresaCtrl.empresa.cidade}" converter="#{cidadeConverter}"
											 						filter="true" filterMactchMode="contains" >
															<f:selectItem itemValue="" itemLabel="Selecione a cidade" noSelectionOption="true"/>
															<f:selectItems value="#{empresaCtrl.cidades}" var="c" itemLabel="#{c.nomeCidade}" itemValue="#{c}"/>
														</p:selectOneMenu>
														
											 <p:outputLabel class="outputLabelform" value="Bairro:" for="bairro"/>			
											 <p:inputText id="bairro" class="campoform" value="#{empresaCtrl.empresa.bairro}"></p:inputText> 
											 
											 <p:outputLabel class="outputLabelform" value="Logradouro:" for="endereco"/>
											 <p:inputText id="endereco" class="campoform" value="#{empresaCtrl.empresa.endereco}"
											 placeholder="Rua, Avenida, Rodovia"/>
											 
											 <p:outputLabel class="outputLabelform" value="Número:" for="numero"/>	 
											 <p:inputText id="numero" class="campoform" value="#{empresaCtrl.empresa.numeroCasa}" />
											 
											 <p:outputLabel class="outputLabelform" value="Complemento:" for="complemento"/>
											 <p:inputText id="complemento" class="campoform" value="#{empresaCtrl.empresa.complemento}"></p:inputText>	
											 
											 <p:outputLabel class="outputLabelform" value="CEP:" for="cep"/>					
											 <p:inputMask id="cep" class="campoform" value="#{empresaCtrl.empresa.cep}" mask="99999-999">
											 </p:inputMask>
											 
											 <p:outputLabel class="outputLabelform" value="Telefone:" for="telefone"/>			
											 <p:inputMask id="telefone" class="campoform" value="#{empresaCtrl.empresa.telefone}"  mask="(9?9)9999-99999" />
										        
										     <p:outputLabel class="outputLabelform" value="Celular:" for="celular"/>   
											 <p:inputMask id="celular" class="campoform" value="#{empresaCtrl.empresa.celular}" mask="(9?9)9999-99999"/>
											 
											 <p:outputLabel class="outputLabelform" value="e-mail:" for="email"/>
											 <p:inputText id="email" class="campoform" value="#{empresaCtrl.empresa.email}" label="email">
											 	<f:validator validatorId="custom.emailValidator"/>
											 </p:inputText>
											 
											 
											 <p:outputLabel class="outputLabelform" value="Login (mínimo de 8 dígitos):" for="login"/>
											 <p:inputText id="login" class="campoform" value="#{empresaCtrl.empresa.login}" >
											 <f:validateLength minimum="8"/> 
											 </p:inputText>
											 
											 <p:outputLabel class="outputLabelform" value="Senha:" for="passowordfeedback"/>
											 <p:password id="passowordfeedback" class="campoform" value="#{empresaCtrl.empresa.senha}" feedback="true"
										                    promptLabel="Digite a senha" weakLabel="Moderada"
										                    goodLabel="Boa" strongLabel="Excelente" />
											 
											 <p:outputLabel class="outputLabelform" value="Nome para Contato:" for="nomeContato"/>
											 <p:inputText id="nomeContato" class="campoform" value="#{empresaCtrl.empresa.nomeContatoEmpresa}"
											 placeholder="Responsável por este cadastro"/>
											 
											 <h:outputLabel class="outputLabelform" value="Missão da empresa:" for="missao"/>
										     <p:inputTextarea id="missao" class="campotext"  value="#{empresaCtrl.empresa.missaoEmpresa}" rows="6"
										     placeholder="Pode ser preenchido após o cadastro."/>
										          
										     <h:outputLabel class="outputLabelform" value="Visão da empresa:" for="visao"/>
											 <p:inputTextarea id="visao" class="campotext" value="#{empresaCtrl.empresa.visaoEmpresa}" rows="6" 
											 placeholder="Pode ser preenchido após o cadastro."/>
											 
											 <h:outputLabel class="outputLabelform" value="Descrição da empresa:" for="descri"/>
											 <p:inputTextarea id="descri" class="campotext" value="#{empresaCtrl.empresa.descricaoEmpresa}" rows="6"
											 placeholder="Pode ser preenchido após o cadastro."/>									
										     
														
										
												</p:panelGrid>	
												<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
												<p:commandButton value="Editar"	actionListener="#{usuarioCtrl.editar}" update="@form" validateClient="true"/>
													</div>
										</h:form>
										
										<h2>Teste de Método</h2>
										
			<h:form>
				<h:inputText class="inputlogin" value="#{usuarioCtrl.login}" />														     											     
				<div id="botoeslogin">
				<br />														
				<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>															
				<div id="botaologin"><h:commandButton id="botlogin" action="#{usuarioCtrl.editaremp1()}" value="Editar" > 
				</h:commandButton> 
				</div>
				</div>
			</h:form>
										
										</div>
										<div class="1u">
										
										</div>
										</div>
			
										
									

							</div>
						</div>

Empresa extends Usuario.
A empresa é um usuário ?

Isso mesmo. A empresa é um usuário.

Não seria Empresa tem um Funcionario ?

Oi Igomes, a classe usuario tem outros tipos de usuario e a empresa é apenas um deles.