Arquitetura hexagonal

Feliz 2014. Saúde, sucesso paz e muita tecnologia.
Sei que estou com o blog parado a algum tempo, mas estou voltando a ativa esse ano. Pretendo escrever sobre referências de novidades que vão agitar o mundo de 2014. Também desejo continuar escrevendo alguns artigos relatando dificuldades e como resolve-las do meu dia a dia de trabalho na TI.

Sempre fui defensor de realizar testes unitários de forma a isolar camadas, mas isso não é uma atividade fácil de ser criada pelo programador, exige um pouco de prática e gerentes de projetos costumam não adicionar em seus planejamentos/cronogramas esse tempo na implementação.
Uma nova abordagem de arquitetura vem surgindo, acredito que trazendo alguns benefícios nesse e em outros campos, a arquitetura hexagonal, através de adaptadores e portas (conceito genérico).
Aqueles que se interessarem pelo assunto, dediquem um tempo para examinar o material e refletir em algumas idéias que ela pode nos oferecer.
Segue link: http://alistair.cockburn.us/Hexagonal+architecture

Anúncios

KSoap2 Android e .NET

Como todos sabem, a MS tem alguma iniciativas que fogem dos padrões. Um deles é WS e SOAP.
Para se trabalhar com Android e WS em .NET utilizamos a Ksoap2, onde é necessário informar ao envelope que está trabalhando com .NET. Sendo assim a lib irá remover algumas propriedades dos elementos do envelope.
Caso esse atributos forem enviados, por exemplo na versão 11, teremos então uma falha de recebimento do envelope no WS .NET.
Assim como essa padronização diferenciada da MS, o KSoap2 em Android também apresenta alguns BUGs, tal como trabalhar com objetos complexos e enviar ao WS .NET que o atributo “anytype” não deverá ser enviada.

Procurei em vários forums(Stackoverflow meu favorito) alguma forma para resolver esse problema, não a encontrei e então resolvi sobrescrever o método createRequestData da classe HttpTransportSE, resolvendo assim esse bug para remover atributos indesejados.

A finalidade abaixo é somente remover o atributo “anytype” de seu envolope, mas necessitante de excluir outros atributos, basta modificar o código abaixo.

public class CustomHttpSE extends HttpTransportSE {
	...
	
	@Override
    protected byte[] createRequestData(SoapEnvelope envelope)
            throws IOException {
        byte[] envelopeReturned = super.createRequestData(envelope);

        String requestObject = new String(envelopeReturned);
        String pattern = "i:type=\"d:anyType\"";

        SoapSerializationEnvelope soapEnvelope = (SoapSerializationEnvelope) envelope;
        if (soapEnvelope.dotNet) {
            if (requestObject.contains(pattern)) {
                requestObject = requestObject.replace(pattern, "");
            }
        }
        
        return requestObject.getBytes();
    }
}

Espero ter ajudado,
André Rezende

Sessões SOAP dotNet em Ksoap-android.

Pela falta de informação sobre esse assunto resolvi publicar esse POST para não cair em esquecimento.

Se você precisa armazenar a sessão de uma conexão WS no Android utilizando o Ksoap, já adianto, não é possível fazer utilizando a biblioteca de versão 2.6.5. Mas para tanto, existe uma solução simples, mas que leva tempo para descobrir e segue abaixo.

package br.com.cacula.fv.servicos.soap.connection;

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

import org.ksoap2.HeaderProperty;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

public class CustomHttpSE extends HttpTransportSE {
    private String sessionID;
    
    public CustomHttpSE(String URL, int timeout) {
        super(URL, timeout);
    }

    public String getSessionID() {
        return sessionID;
    }

    public void setSessionID(String sessionID) {
        this.sessionID = sessionID;
    }

    @Override
    public List call(String soapAction, SoapEnvelope envelope)
            throws IOException, XmlPullParserException {
        SoapSerializationEnvelope soapEnvelop
        headers = new ArrayList<HeaderProperty>();
        
        if (soapEnvelope.dotNet && !"".equals(sessionID)) {
            headers.add(new HeaderProperty("Cookie", "ASP.NET_SessionId="
                    + sessionID));
        }
        return super.call(soapAction, envelope, headers);
    }

}

Agora utilize a CustomHttpSE ao invés da HttpTransportSE que vem dentro do Ksoap, lembre-se de fazer um set ao sessionID e as seguintes opções de dotNET.

envelope.dotNet = true;
envelope.implicitTypes = true;
envelope.setAddAdornments(false);

Abraços,
André Rezende