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

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

Mysql Workbench – Failed to load module “canberra-gtk-module”

mysql-workbenchApós a instalação do Workbench no Debian 8 me deparei com o seguinte erro ao executa-lo:

Failed to load module “canberra-gtk-module”

Segue a instrução para solucionar o problema:

1 – Instale a dependência que está faltando para que o Workbench execute:

$ apt install libcanberra-gtk-module libcanberra-gtk3-module

2 – Desinstale (não consegui fazer funcionar sem desinstalar)

$ apt update ; apt purge mysql-workbench mysql-workbench-data

3 - Instale novamente:

$ apt install mysql-workbench mysql-workbench-data

4 – Pronto basta executar que esta funcionando.

Fontes:

https://askubuntu.com/questions/342202/failed-to-load-module-canberra-gtk-module-but-already-installed

https://www.vivaolinux.com.br/topico/MySQL/MySQL-Workbench-parou-de-funcionar

Android – Como reiniciar a aplicação programaticamente (How to ‘restart’ an android application programmatically)

Android reiniciar aplicativo

    public void backToMain(Bundle params) {
    	//Monta a intent para abrir a aplicação.
        Intent mStartActivity = new Intent(this, MainActivity.class);
        //Se quiser adicionar algum parametro para o inicio da aplicação:
        if (params != null) {
            mStartActivity.putExtras(params);
        }

        //Realiza o agendamento da intent de abrir o aplicativo:
        //No caso abaixo o aplicativo vai ser reaberto daqui 500ms (System.currentTimeMillis() + 500);
        PendingIntent mPendingIntent = PendingIntent.getActivity(this, 123456, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager mgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 500, mPendingIntent);

        //Mata todos processos associados a este aplicativo.
        android.os.Process.killProcess(android.os.Process.myPid());
        //Fecha o aplicativo.
        System.exit(1);
    }