Novo Livro: AngularJS para desenvolvedores Java

capalivroangularjs-final

olá Pessoal,

Ando bem desaparecido do blog, o trabalho tem me consumido bastante tempo, dedicação e foco  desde  de julho do ano passado. Tenho trabalhado 2-3 projetos paralelamente das 07-24(e tem uma esticada ate 1 da manha). Uma das vantagens que posso adiantar que venho compilando bastante aprendizado, experiências e quero em breve começar a compartilhar aqui  com vocês. Tem desde do lado técnico até não técnico voltado para negócio, empreendorismo etc.  Hoje venho anunciar mais um novo trabalho que é meu livro de AngularJS que comecei a escrever em 2014, mas demorou tanto por minha causa com o problema de tempo e dedicação que gosto qdo estou em um projeto, não adianta  fazer algo “meia boca” e com esse tempo o AngularJS evoluiu bastante e tive que   remover e adicionar algumas coisas no livro, até pq na época que comecei o AngularJS, era algo do tipo high school, tive a sorte que estava em um projeto que ia para  produção  e aprendi bastante e  ao mesmo tempo sentir tanta dificuldade nos primeiros passos, principalmente como desenvolvedor Java e  foi assim que nasceu.

Um pouco sobre o livro 

O livro foi realmente escrito para programadores Java, mas digo aqueles que conhecem de verdade o mundo JEE, e não está começando. Falo isso claramente  nas primeiras paginas do livro, pois eu já fui frustado com tantos livros que comprei e no final não era o que eu imaginava e o autor não deixou claro quem poderia comprar. Então se vc é  iniciante em Java, conhece pouco ou quase nada. Nem  compra o livro agora, pois vou considerar no livro que você já sabe os frameworks basicos de uma app JEE.

O foco

Me dediquei em focar no livro em algo que não encontrei na época nos livros que ia lendo que era: “Como fazer esse negócio de angularjs funciona   com java para app jee e ter isso como default tirando o JSF do meio de campo?”  Sim, era exatamente assim que me perguntava, dai percebi que  não ia se fácil, pois havia muitos livros de AngularJS, mas essa integração lidando com os dois mundos e construindo as coisas mesmo que seja simples, não tinha. E tive que seguir sozinho, aprendendo o AngularJS isolando e ir montando o quebra cabeça.  Trouxe essa experiencia  armaga mais divertida para o livro. Se que desenvolver aplicações web/jee usando angularjs, sem se importar  nesse momento com a perfumaria e sim com a essencia, o livro vai guiando para isso. O importante é fazer as coisas direito, não importa o que seja.

Lançamento

Ainda não tem uma data especifica, mas até Março já teremos o livro disponivel em ebook e nas livrarias como Saraiva, fnac etc.

Desconto Especial  e Sorteio

Sim. Claro que vai rolar desconto para os leitores do  blog. Coloque seu nome na lista e enviarei um cupom exclusivo por email, assim que tiver tudo ok.

Conclusão 

Quero agradecer a cada um de vocês, de verdade sem conversinha. Realmente vocês leitores que acompanham o blog, me manda email com feedback, comentam nos posts, todo esse ciclo mantém a chama viva e me faz pensar qual o próximo em como ajudar alguém em algum lugar com algo que já passei e que um simples post pode resolver muita coisa. Sei que agora gerei uma dívida de ter sumido dos posts semanais, porém tenho a meta para esse ano regularizar e deixar positivo o meu saldo com vocês. Qualquer dúvida sobre o livro só mandar.

Atualização

Opa!! Acabou de ser lançado pessoal e tem versão E-book.

http://goo.gl/pE6udV

abraço, e até a próxima.

Ignorando acentuação no Hibernate Search

hibernate

opa Pessoal,

Esses dias precisei fazer uma implementação com o Hibernate Search e passei aperto, pois precisava que acentuação fosse ignorado durante a pesquisa, iai ?

lets go…
Problema

É rapaz, parece que é trivial, mas nem tanto como é no Criteria. Olhando a documentação e fazendo uma pesquisa no velho Google acahei a solução, para que o Hibernate Search ignore acentuação durante as pesquisas.
Solução

O resultado é bem simples, apenas precisamos definir as seguintes anotações na classe de pesquisa veja:

@AnalyzerDef(name = "customAnalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class)
})
public class Professor{

}

E já ignora maiusculo/minusculo também.

Vou ficando por aqui e espero que tenham gostado do post de hoje.

abraços, see ya!!

Acessando atributos de outras classes no Hibernate search

hibernate

Olá Pessoal,

O post de hoje é bem simples, recentemente passei por um problema em como acessar os atributos de outra classe atraves do hibernate search.

Let go..
Problema

Você tem a classe Carro e essa classe tem um objeto Motor e vc precisa acessar o atributo versao que está na classe Motor. Como fazer isso com hibernate search? Parece que é simples né? Nem tanto gastei algumas horas até saber como fazer.
Solução

Vamos lá, você vai precisar na classe Carro fazer isso:

@Indexed
class Carro{

@IndexedEmbedded
private Motor motor;

}

E na classe Motor isso:

@Indexed
class Motor{

@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO) 
@ContainedIn
private String versao;
}

Agora na sua busca ficará assim:

QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Professor.class).get();

Query query = queryBuilder.keyword().onFields( "motor.nome")
.matching(descricao).createQuery();

FullTextQuery hibQuery = fullTextSession.createFullTextQuery(query, Carro.class, Motor.class);

Observe que o pulo do gato “motor.nome”.

Resolvido.

abraço, see ya!!!

Série AngularJS:Enviando Notificação por E-mail AngularJS + JavaMail + Gmail

angularjslogo

olá Pessoal,

O post de hoje vamos ver como enviar uma notificação por email, usando JavaMail com AngularJS e tendo o gmail como servidor de email. Aplicação é bem simples e vou usar um dos archetypes maven + angularjs que criei, assim vai poupar bastante tempo de configuração do projeto e podemos focar no que mais interessa para o post.

lets go…

Requisitos:

  • archetype-webapps-java-angularjs-yeoman;
  • JavaMail;
  • Ter uma conta Gmail;

Starting…

Para começar instale o archetype a seguir:

https://github.com/camilolopes/archetype-webapps-java-angularjs-yeoman

O archetype acima, já vem com o Spring, Restful via Jersey, Twitter Bootstrap, AngularJS 1.0, Yeoman etc. Se não tiver o archetype instalado, siga os passos no GitHub do projeto.

O Projeto
O projeto de exemplo,vai simular uma recuperação de senha onde o usuário informa o email cadastro e em seguida receberá um e-mail com as instruções para recuperação de senha. Para envio

Development

Vamos começar a meter mão na massa.Vou ser bem objetivo e considerar que você já conhece AngularJS + Java.

Passo 1

Criando o projeto

emailnotificationmavenarchetype

Escolha o archetype e preencha os campos com o nome do seu projeto.

Passo 2

Apague todos os packages em src/main/java deixando assim:

 

emailnotificationpackages

E apague os packages em src/test/java

Passo 3

No arquivo pom.xml adicione a seguinte dependencia:

<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.5</version>
</dependency>

E remova a tag

 

<build></build>

 

Passo 4
Abra o arquivo applicationContext.xml e apague todo o código relacionado a banco de dados, deixando o conteúdo assim:

...
<context:component-scan base-package="*" />
<tx:annotation-driven />

</beans>

Passo 5

No arquivo web.xml vamos informar o local onde ficará as classes dos serviços restful, no meu caso será:

<!-- package controller update of your -->
<param-value>br.com.its.web.controller</param-value>

 

Observe que o caminho para API Restful será /rest/*. Você pode chamar como quiser /api/*.

Passo 6

Vamos desenvolver uma classe que terá o serviço de enviar o e-mail e as configurações do gmail, chamei de EmailNotificationService, veja a seguir (classe e os métodos são auto-explicativos):

@Service
public class EmailNotificationService {
public void sendEmail(User user) throws Exception{
Properties props = new Properties();
configEmail(props);
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//aqui os dados da sua conta do gmail
String login = "seuUsuario"; //não precisa colocar @gmail.com
String password = "suaSenha";
return new PasswordAuthentication(login,password);
}
});

try {

email(user, session);

} catch (MessagingException e) {
throw new Exception(e);
}
}
/**
*/
private void email(User user, Session session) throws MessagingException,
AddressException {
Message message = new MimeMessage(session);
String fromEmail = "email";//aqui o email que vai enviar as informações exemplo: noreply@suaempresa.com
String subject = "Testing Send Email ITS";
String bodyEmail = "olá," + "\n\n It is working \\o//";
String toEmail = user.getEmail(); //o email de destino que vem da tela;
message.setFrom(new InternetAddress(fromEmail));
message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(toEmail));
message.setSubject(subject);
message.setText(bodyEmail);
Transport.send(message);
}
//configurações do Gmail
private void configEmail(Properties props) {
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
}
}

 

Passo 7

Criaremos um objeto para representar os dados na tela User.java

public class User {
private String email;

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

}

 

Passo 8

Agora vamos fazer o Controller e serviço restful:

@Controller
@Path("/email")
public class EmailNotificationController {
@Autowired
private EmailNotificationService emailNotificationService;

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response send(User email){
Response response = Response.ok().build();
try {
emailNotificationService.sendEmail(email);
} catch (Exception e) {
e.printStackTrace();
response = Response.status(Status.BAD_REQUEST).build();
}
return response ;
}

public EmailNotificationService getEmailNotificationService() {
return emailNotificationService;
}

public void setEmailNotificationService(
EmailNotificationService emailNotificationService) {
this.emailNotificationService = emailNotificationService;
}

}

Agora que temos o back-end pronto, vamos começar com o front-end. Primeiro passo, após a criação do projeto é instalar o bower para baixar as libs necessárias para isso via console vá até a raiz do projeto e depois até a pasta src/main/webapp e digite:

bower install

Aguarde a instalação terminar.

Como estamos usando o Yeoman + AngularJS ele já vem com uma estrutura minima funcionando, então vamos reaproveitar.

main.js

Vamos deixar o arquivo assim:

angular.module('webappApp')
.controller('MainCtrl',['$scope','EmailService', function ($scope,EmailService) {

$scope.emailService = new EmailService();
$scope.emailService.email = '';
console.log($scope.emailService);
$scope.send = function(){
$scope.emailService.$save(function(){
$scope.emailService = new EmailService();
});
};

}]);

 

Criando EmailService.js

vamos gerar o arquivo para camada de serviço, para digite:

yo angular:factory EmailService.js

E altere o arquivo emailservice.js deixando assim:

'use strict';

angular.module('webappApp')
.factory('EmailService', function($resource) {
return $resource('../rest/email',{ },
{
}
);
});

Alterando o arquivo app/index.html
Vamos arrumar o nome do arquivo EmailService.js para forma correta deixando assim, na linha 72:

<script src="scripts/services/emailservice.js"></script>

Criando o views/home.html

Agora precisamos criar a tela que faz a recuperação de senha:

<h4>Email Notification with AngularJS + JavaMail with Gmail</h4>
<form name="emailform">
<label>E-mail:</label>
<div>
<input type="email" required ng-model="emailService.email">
</div>

<div>
<button type="submit" class="btn btn-success" ng-click="send()" ng-disabled="emailform.$invalid">Reset Password</button>
</div>

</form>

 

Alterando a rota

Em app.js altere a rota deixando assim:

$routeProvider
.when('/', {
templateUrl: 'views/home.html',
controller: 'MainCtrl'
})

 Testando

Vamos testar aplicação.Primeiro passo é compilar toda aplicação:

mvn clean install

Agora vamos subir:

mvn tomcat:run

emailnotificationrun

Agora vou informar um e-mail e em seguida verificar se receber o e-mail:

emailnotificationrundata

O email acabou de chegar:

emailnotificationreceived

emailnotificationbodysent

O projeto example está disponível no meu Github

https://github.com/camilolopes/emailNotification-angularjs

Simples não? A aplicação é bem simples, e claro que se fosse um código final tem muita coisa para melhorar. Uma delas é não ter as informações de envio do e-mail (from) hard-code. A autenticação também não deveria está hard-code :D.

Vou ficando por aqui…

See ya!!