Android Studio / Gradle / Maven – Como fazer upload de sua biblioteca em seu repositório Maven.

maven

O plugin Maven adiciona suporte para a implantação de artefatos nos repositórios Maven.

Como utilizar (inserir no build.gradle do modulo do seu projeto):
—————-

apply plugin: 'com.android.library'
apply plugin: 'maven' //ADICIONE O PLUGIN MAVEN

//CRIE O METODO ABAIXO PARA CONFIGURAR O UPLOAD:
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: mavenLocal().getUrl()) //URL DO SEU REPO MAVEN(NO EXEMPLO ESTA USANDO O LOCAL)
            pom.artifactId ='swap_android'
            pom.groupId = 'br.com.helpdev'
            pom.version = '1.0'
        }
    }
}

Após configurado, basta sincronizar o projeto e chamar o ‘uploadArchives’: Continue reading

Java – Criando um serviço WEB para executar fora de um container java (web server standalone with grizzly-http-server / jersey-server / javax.ws.rs)

javaeeNesta publicação vamos mostrar como criar um servidor web standalone, ou seja, vamos compilar o projeto como um jar e executa-lo pelo terminal sem a necessidade de precisar dar deploy em um container java (exemplo: glassfish, toncat, etc). Para isso vamos criar um projeto java com o maven para incluir as seguintes dependências:

javax: javaee-web-api
org.glassfish.grizzly: grizzly-http-server, grizzly-framework
org.glassfish.jersey.core: jersey-server, jersey-common, jersey-client
org.glassfish.jersey.media: jersey-media-sse, jersey-media-json-processing
org.glassfish.jersey.containers: jersey-container-grizzly2-http, jersey-container-servlet

Essas dependências permitem criar um web server e subir sua aplicação em um container próprio. As dependências do javax nos permite criar o serviço web REST, a grizzly fica responsável pelo servidor web e a jersy pelo container. Nesse projeto não vamos chegar a usar todas essas dependências porem vamos deixar no projeto.

Iniciaremos o projeto configurando o pom.xml: Continue reading

Maven – Gerar uma distribuição com suas dependências / Gerar um FatJar / Configurar o JavaExec / Configurar Manifest

maven

Segue um script de configuração para compilar projetos java e gerar uma distribuição com todas dependências, com opcional de fatJar.
- Configurar o Manifest
- Configurar a execução pela IDE através do type: JavaExec
- Gerar uma distribuição com as dependências dentro da pasta libs/
- Gerar uma distribuição fatJar
- Maven Can’t execute jar- file: “no main manifest attribute”

ARQUIVO POM.XML: Continue reading

Java / GSON – Serializing and Deserializing Generic Types

gson - json

Quando você chama .toJson(obj) o Gson internamente usa obj.getClass() para obter informações sobre os campos para serializar. Da mesma forma na deserialização se passa MyClass.class no método fromJson(json, MyClass.class). Isso funciona bem se o objeto é um tipo não-genérico. No entanto, se o objeto é de um tipo genérico as informações são perdida porcausa da sua generalização. Segue um exemplo:

class Foo<T> {
  T value;
}

Gson gson = new Gson();

Foo<Bar> foo = new Foo<Bar>();
// Não pode serializar foo.value corretamente:
gson.toJson(foo);
// Falha ao deserializar foo.value as Bar:
gson.fromJson(json, foo.getClass()); 

O código acima não consegue interpretar  o valor como um tipo Bar porque o Gson invoca list.getClass() para pegar a informação da classe, mas esse método retorna uma classe cru, Foo.class. Isto significa que Gson não têm nenhuma maneira de saber que este é um objeto do tipo Foo <Bar>, e não simplesmente Foo.

Você pode resolver esse problema especificando o tipo correto para o seu tipo genérico. Você pode fazer isso usando a classe TypeToken veja o exemplo: Continue reading

C# – Como adicionar PIN/Senha automaticamente no Certificado A3.

Suporte Técnico, Instalação e Configuração de Certficado Digital Seara Experian

Em dezenas de artigos eu vi métodos que adicionam o PIN automaticamente, mas nenhum funcionava, inclusive alguns fizeram eu até perder o certificado do cartão.

Essa parte abaixo costumam usar nos métodos:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
RSACryptoServiceProvider.UseMachineKeyStore = true;
rsa.PersistKeyInCsp = false;

Com essas duas propriedades, linha 2 e 3, ela apagava o PIN do cartão ou fazia não funcionar a senha.
Método para adicionar o PIN / Senha no certificado A3 automaticamente.

public static RSACryptoServiceProvider LerDispositivo(RSACryptoServiceProvider key, string PIN)
{
CspParameters csp = new CspParameters(key.CspKeyContainerInfo.ProviderType, key.CspKeyContainerInfo.ProviderName);
SecureString ss = new SecureString();
foreach (char a in PIN)
{
ss.AppendChar(a);
}
csp.ProviderName = key.CspKeyContainerInfo.ProviderName;
csp.ProviderType = key.CspKeyContainerInfo.ProviderType;
csp.KeyNumber = key.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2;
csp.KeyContainerName = key.CspKeyContainerInfo.KeyContainerName;
csp.KeyPassword = ss;
csp.Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseDefaultKeyContainer;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
return rsa;
}

Abaixo coloquei o método que desenvolvi para assinar o arquivo XML e que assina o método de adicionar o PIN no cartão, automaticamente, sem fazer nada manualmente: Continue reading

Java – Como utilizar a FutureTask, controlando o timeout e status de uma thread

multithreadingFutureTask é uma implementação da interface Future a ser executada numa chamada em paralelo. Sendo possível cancelar a execução de uma tarefa, descobrir se a execução já terminou com sucesso ou erro, entre outras operações.

A FutureTask precisa de uma interface para a implementação de uma execução em paralelo. a Callable é parecida com a interface Runnable, mas esta não retorna nenhum valor, enquanto a Callable deve retornar um valor ao final da execução;

MÉTODOS DO FUTURE:

future.cancel(boolean mayInterruptIfRunning) : Cancela o processamento, passar true para interromper se ela ja está iniciada, ou false para cancelar se ainda nao foi iniciada.
future.get(long timeout, TimeUnit unit)  : Espera a resposta da execução de acordo com timeout.
future.get() : Espera a resposta da execução.
future.isDone() : Verifica se a execução já acabou.
future.isCancelled() : Verifica se o processamento foi cancelado.

Exemplo: Continue reading

Android – Bloqueando a orientação de tela programaticamente

full_screen_android

Segue alguns métodos uteis para lidar com a orientação de tela programaticamente.

/**
 * Destravando orientação de tela
 *
 */
public static boolean releaseScreenOrientation(Activity activity) {
    return lockScreenOrientation(activity, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

/**
 * Travando orientação de tela na posição atual.
 *
 */
public static boolean lockCurrentScreenOrientation(Activity activity) {
    return lockScreenOrientation(activity, activity.getRequestedOrientation());
}

/**
 * Recebe como parametro: ActivityInfo.SCREEN_ORIENTATION_XXXXXX
 *
 * @param activity Activity
 * @param screenOrientation ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
 */
public static boolean lockScreenOrientation(Activity activity, int screenOrientation) {
    activity.setRequestedOrientation(screenOrientation);
    return true;
}

/**
 * Recebe como parametro: Surface.ROTATION_X
 *
 * @param activity Activity
 * @param screenRotation Surface.ROTATION_0 / 90 / 180 / 270
 */
public static boolean lockScreenRotation(Activity activity, int screenRotation) {
    if (screenRotation > -1) {
        int orientation = activity.getRequestedOrientation();
        switch (screenRotation) {
            case Surface.ROTATION_0:
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
                break;
            case Surface.ROTATION_90:
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
                break;
            case Surface.ROTATION_180:
                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
                break;
            case Surface.ROTATION_270:
                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
                break;
        }
        return lockScreenOrientation(activity, orientation);
    } else {
        return false;
    }
}

Android Studio / Gradle / Maven – Como usar o seu repositório local Maven (How to use Maven Local repository for gradle build)

gradle

Para configurar seu repositório local Maven em um projeto no Android Studio, ou em qualquer outra IDE que utilize o Gradle basta configurarmos o arquivo build.grade adicionando o repositorio local e configurando sua localização. No exemplo a seguir vou configurar meu projeto para que use o mesmo repositório local maven utilizado pelo netbeans, assim consigo utilizar minhas bibliotecas java de uma maneira bem simples.

Abra o arquivo do projeto build.grade e edite da seguinte maneira: Continue reading