Category Archives: Java

Lambdas Oracle MOOC

Java 8 Lambda

Section 1

– Need changes to Java to simplify parallel coding.
– Lambda expressions simplify how to pass behavior as a parameter.

-Show the differences through Java basic code, inner classes and lambdas.

Non-functional (imperative) programming style versus functional.

Problem: external iteration.
After: more functional with inner classes;
And then: lambda approach, more concise, less code (error-prone), client logic is stateless, thread-safe.

The lambda expression provides the implementation of the abstract method. The type is the abstract method.

@FunctionalInterface -> Functional Interface = an interface with one abstract method; default doesn’t count. The equals also doesn’t count in therms of abstract method.

Variable assignment: Callable c = () -> process();

Method parameter: mew Thread(() -> process()).start();

Lambda expressions can be used anywhere the type is a functional interface.

– A functional interface has only one abstract method.

The lambda expression provides the implementation of the single abstract method of the functional interface.

java.util.function Package

Consumer<T>

Operation that takes a single value and return no result: String s -> System.out.println(s) .

Example: String s -> System.out.println(s);

BiConsumer<T,U>

Takes two values and returns no result.

Example: (k,v) -> System.out.println(“key: ” + k + “, value: ” + v);

Supplier

The opposite of a Consumer. Doesn’t take any parameter and returns a value.

Example: ( ) -> createLogMessage();

Function<T,R>

Takes one argument, do something and returns a result.

Example: Student s -> s.getName();

BiFunction<T,U,R>

Takes two arguments and returns a result.

Example: (String name, Student s) -> new Teacher(name, student);

UnaryOperator<T>

Kind function: single argument and result of the same type.

  • T apply(T a)

Example: String s -> s.toLowerCase();

BinaryOperartor<T>

Specialised form of BiFunction: two arguments and a result, all of the same type.

  • T apply(T a, T b)

Example: (String x, String y) -> { if (x.length() > y.length()) return x; return y; }

Predicate

A boolean valued function of one argument:

Example: Student s -> s.graduationYear() == 2011

BiPredicate

Takes two arguments

Example: (Student s, int minGrade) -> s.grade <= minGrade

Method and constructor references

FileFilter x = (File f) -> f.canRead();

FileFilter x = File::canRead;

External variables

Final or effective final.

Link to the on line free Oracle course.

10 Rules for Writing Safety Critical Code

In the current issue of Java Magazine the from editor column talks about the size of classes. The benefits of class with lines of code (LOCs) less than 60. But also some challenges that comes with.

What I found curious was a reference to 10 rules for writing safety critical code, that’s language agnostic. So it can be applied on actual Java projects without constraints. Other curious thing is that these rules are used by NASA, as describes the article.

The link for the rules is here.

The rule of limiting classes (functions at the original) to 60 lines of code is challenger and the article explain it very well.

Other important rules is the 10th: compile with all warnings enabled, and use one or more source code analyzers. Very actual.

So I thought that it was interesting and could open deeper discussions.

Infinitest

 

Mais uma ferramenta para otimizar o desenvolvimento e evitar a identificação tardia de bugs.

O Infinitest faz isso da seguinte forma: ao salvar uma alteração em um código na IDE ele dispara os testes, avalia e marca os que não passaram. Assim garante a verificação de erros on time.

No meu caso instalei-o no Eclipse (Mars.2 Release (4.5.2)), bem rápido e tranquilo pelo Marketplace.

Ainda pode ser configurado para excluir pacotes, classes ou padrões específicos criando um arquivo na raiz do projeto chamado infinitest.filters.

A documentação do projeto está aqui em https://infinitest.github.io/.

E a fonte deste post está no blog da Caelumn, aqui.

Até!

Apache Cassandra on Ubuntu

Cassandra logo

 

So I decided to test the NoSql Cassandra database. But to install was a non-trivial proccess on Ubuntu 16 release.

After some googling I found this link inside the Download area of the oficial Cassandra site. And then it works!

It was necessary to change the first key number for the one that is showing on the error after the apt-get update. I skipped the add of the other two keys and it works.

Now I can test the Cassandra with Spring Boot, via this link on Dzone.

Hope this can help…

Microservices boundaries

Fronteira entre serviços

Sob a nova perspectiva de softwares como microservices surge um desafio em identificar as fronteiras entre estes que compõem a aplicação.

Duas abordagens podem ser consideradas, ambas baseadas no princípio da Single Responsible Principle (Princípio da Responsabilidade Única):

A primeira estabelece que os microservices devem ser identificados por meio do verbo de execução de sua responsabilidade. Por exemplo, em uma aplicação de Gerência de Estoques, como a twarehouse em tetraTI, ao analisarmos as ações de entrada de produtos, o cadastro e análise daqueles com baixa em estoque, teríamos assim 3 candidatos a microservices: Entrada de Produtos Service, Cadastro de Produtos Service e Analisador de Baixa Service.

A outra abordagem é a de definir fronteiras por meio da identificação das entidades ou recursos oferecidos pelo sistema. Dessa forma e utilizando o exemplo acima teríamos serviços como Movimentação Service, responsável por todas as operações de movimentação. Ou Analisador de Estoque Service, que forneceria informações em tempo real sobre o estoque.

É muito sutil a escolha ou identificação de serviços por meio de suas fronteiras, que juntos definem a aplicação em si. Para enfrentar este desafio deste novo conceito de SaaS e usufruir de suas vantagens será necessário bom senso e experiência por parte do arquiteto.

Fonte: Devmedia e Building Microservices Book.

Conteúdo estático no Wildfly em produção

upload-cloud

Neste Post demonstrarei como utilizar de forma eficiente imagens como conteúdo estático em uma aplicação Java Web com JSF que rode em um ambiente Linux e num servidor WildFly 8.x.

A ideia é utilizar imagens no cadastro de produtos, fazendo seu upload e exibindo-as em diversas partes.

upload_1

As ferramentas necessárias são o PuTTy para criação do diretório no servidor e um editor xml para configuração do Handler no arquivo de configuração do WildFly. No meu caso utilizei o próprio Eclise IDE. Claro que assumindo que já exista uma aplicação com as devidas configurações e rodando. Disponibilizarei a classe que utilizo para tratar o upload da imagem também.

Criando a estrutura de diretório: a aplicação está hospedada num servidor integrator.com.br, portanto definia a seguinte estrutura:

upload_2

Para criação dos diretório é necessário pelo PuTTy criar os diretórios a partir da pasta home, assim: /home/<<usuário>>/var/static/images/pecas.

Configurando o handler no WildFly: agora que as pastas estão criadas é necessário mapear esta estrutura no servidor de aplicação para que possamos acessá-lo. Para isso configuramos o arquivo de configuração, standalone.xml, da seguinte forma:

upload_3

O handler mapeará o caminho definido em /imagens/meu-espaco. Para acessar o conteúdo do diretório basta acessar a url http://<<endereço_do_servidor>>/imagens/meu-espaco.  A opção directory-listing permite que seu conteúdo seja listado:

upload_4

A classe para upload da imagem: o mecanismo de upload é simples graças ao componente Upload da biblioteca PrimeFaces. Sua utilização é simples:
upload_5

A classe FotoProdutoBean encaminhará a ação à Camada de Serviço de produto, que utilizará a classe FotoHelper para escrever o conteúdo do download para o diretório definido.

upload_6

A constante CAMINHO_DAS_FOTOS contém o caminho para o nosso diretório de conteúdo estático, isto é, nossas fotos de produtos (peças): /home/meuvisua/var/static/images/pecas/.

Exibindo as imagens: Enfim, para exibir a imagem basta uma tab <img> html com o mapeamento. Desta forma:

upload_7

Só isso! Ao utilizarmos o handler para mapear um diretório fora do servidor de aplicação tornamos nosso conteúdo estático independente. Num cenário de atualização ou substituição do servidor nada será afetado. Ainda, assim evitamos também salvarmos essas imagens direto no banco, impactando a performance.

Se alguém tiver uma solução melhor ou alternativa, comentem.

Até o próximo.

 

LocalDate e LocalDateTime em JSF 2.2 e 2.3

tempo_122-692x360

Com a API Date-Time do Java 8 novos objetos de representação e tratamento de data e tempo foram introduzidos no cotidiano de desenvolvedores que recorriam à implementações diversas, como o Joda Time.

Como caraterística desta API pode ser destacados a facilidade na utilização o que não era presente nas versões anteriores com os objetos java.util.Date e java.sql.Date.

Entretanto a versão JSF 2.2 ainda não proporciona a conversão nativa desses objetos. O que já incorporado na próxima versão, 2.3, programada para ser lançada em 2017 junto a Java EE 8.

Assim, para utilizar os objetos LocalDate e LocalDateTime é necessário criar conversores JSF e atribuí-los ao conversor da tag <h:outputText>. Abaixo o exemplo de utilização.

Os converters devem implementar a interface javax.faces.convert.Converter e ser anotados com javax.faces.convert.FacesConverter, onde é definido o nome (id).

@FacesConverter("localDateTimeFacesConverter")
public class LocalDateTimeFacesConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String stringValue) {

if (null == stringValue || stringValue.isEmpty()) {
return null;
}

LocalDateTime localDateTime = null;

try {

localDateTime = LocalDateTime.parse(
stringValue.trim(),
DateTimeFormatter.ofPattern(“dd/MM/yyyy hh:mm:ss”).withZone(ZoneId.systemDefault()));

} catch (DateTimeParseException e) {

throw new ConverterException(“O formato da data e hora deve ser 13/11/2015 12:00:00.”);
}

return localDateTime;

}

@Override
public String getAsString(FacesContext context, UIComponent component, Object localDateTimeValue) {

if (null == localDateTimeValue) {

return “”;
}

return ((LocalDateTime) localDateTimeValue)
.format(DateTimeFormatter.ofPattern(“dd/MM/yyyy hh:mm:ss”)
.withZone(ZoneId.systemDefault()));
}
}

@FacesConverter("localDateFacesConverter")
public class LocalDateFacesConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String stringValue) {

if (null == stringValue || stringValue.isEmpty()) {
return null;
}

LocalDate localDate;

try {
localDate = LocalDate.parse(
stringValue,
DateTimeFormatter.ofPattern(“dd/MM/yyyy”));

} catch (DateTimeParseException e) {

throw new ConverterException(“O ano deve conter 4 dígitos. Exemplo: 13/11/2015.”);
}

return localDate;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object localDateValue) {

if (null == localDateValue) {

return “”;
}

return ((LocalDate) localDateValue).format(DateTimeFormatter.ofPattern(“dd/MM/yyyy”));
}
}

Os Converters apenas fazem a conversão do objeto para String e vice-versa, não há maiores problemas na implementação. Caso o parse para o padrão definido gere uma exceção esta é lançada como ConverterException e exibida ao usuário. No entanto nos testes e em implementações dessa lógica esta mensagem não chega ao na view e deve ser definido o atributo converterMessage da tag <h:inputText>.

<code><label for=”inputAdmissao”>Data de admissão <span class=”required”>*</span></label>
<h:inputText
class=”form-control input-sm m-bot15″
id=”inputAdmissao”
pt:placeholder=”Admissao ”
value=”#{cadastroFuncionarioBean.funcionario.dataDeAdmissao}”
required=”true”
requiredMessage=”É necessário informar a data de admissão.”
converterMessage=”A data deve estar no formato dd/MM/aaaa”>

<f:converter
converterId=”localDateFacesConverter”
for=”inputAdmissao”/>

<f:ajax
event=”blur”
render=”m_inputAdmissao” />

</h:inputText> </code>

data

A novidade que a versão do JSF 2.3 traz é a adição de type attributes para as classes java.time.LocalDate e java.time.LocalDateTime, respectivamente localDate e localTime. :-p

<code>

<h:inputText value="#{myBean.startTime}">
    <f:convertDateTime type="localDateTime" />
</h:inputText>
<h:outputText value="#{myBean.endDate}">
    <f:convertDateTime type="localDate" pattern="dd.MM.uu" />
</h:outputText>

</code>

É isso. E para saber mais das novidades da nova versão do JSF segue esse link What’s new in JSF 2.3?.