Série Dropbox Lançamento easyJavaDropboxAPI for Java Developer

Olá Pessoal,

É com muito prazer que venho apresentar pra vocês mais um trabalho da minha start-up: a ITS. Estamos trabalhando bastante com o dropbox aqui para soluções corporativas, e até final do ano devemos lançar uma plataforma para comunidade que vai estar usando a tecnologia. Nesse trabalho percebemos que era necessário criar uma API Java para o dropboxAPI. O motivo? Tínhamos muito trabalho sempre que um projeto ia precisar o dropbox API, ai decidi criar uma API  que chamei de easyJavaDropboxAPI. Como sabemos, qualidade de software, produtividade e manutenção é um desafio sempre e aqui acreditamos bastante no aprendizado contínuo para melhorar o que fizemos ontem, hoje e amanhã.  A seguir explico mais sobre a API e mostro um exemplo simples de uma aplicação Java  + easyJavaDropboxAPI.

lets go…

easyJavaDropboxAPI

Tudo começou de uma simples ideia, e enquanto fui dormir com um problema achei a solução durante os sonhos. Pode acreditar, foi verdade isso. Dei inicio aos estudos e achei a solução na api do dropbox. Infelizmente não posso entrar em detalhes do negócio, pois foi para um projeto corporativo que usamos. Outros projetos chegaram e precisamos da API, então certa hora eu disse “pessoal, precisamos criar uma API Java para o dropbox API. Já temos vários projetos usando e vai ser complicado dar manutenção”. Antes de tornar a easyJavaDropboxAPI pública, ela tinha outro nome, easyDropboxAPI. E por que eu deveria usar a easyJavaDropboxAPI e não diretamente API dropbox API?

É dificil responder a pergunta acima, mas vou mostrar os motivos que nos levou aqui na ITS a termos uma API .

 

Problemas

Produtividade

Estamos crescendo com soluções enterprise usando dropbox API e já estávamos entrando no terceiro projeto quando vimos que o custo de manutenção estava começando a aparecer. No inicio não tínhamos noção do quanto a API poderia ajudar em outros projetos e foi preciso usar em um projeto interno, testar por um período não só a funcionalidade, mas outros fatores de negócio. Por isso que não começamos criando uma API, mas a coisa “virou” e agora queremos ganhar tempo, e com a API é muito simples sair usando em meia dúzia de linhas e em poucos minutos você já está conectado ao dropbox.

Manutenção

Agora não é preciso ficar preocupado com a manutenção do código que conecta com a API do dropbox. Como o dropbox team está sempre atualizando e lançando novas features, temos apenas um único local que vai ter essa feature atualizada e os projetos que precisarem faz o update do .jar para a versão mais recente.

Desenvolvimento Ágil

Na interface temos os métodos mais comuns e objetos do dropbox API que é a base do serviço, então um desenvolvedor novo precisa inicialmente entender pontualmente e à medida que ele for evoluindo vai entrando nos detalhes. Por exemplo, se você pretende listar os arquivos que está no diretório /home do seu dropbox o que precisa ser feito?

1. Saber o que é um token e gerar um;

2. Chamar o método listFiles que retorna todos os arquivos do diretório informado

Cada elemento no list é um arquivo do diretório.

Esses três pontos foram o suficiente para termos API e impactou bastante no dia a dia desenvolvimento.

Vamos ver na prática?

Praticando

1. Crie um simple maven project

2. Adicione a dependência no pom.xml

dropboxeasyjavaapipom

 

<dependency>

<groupId>com.its.api</groupId>

<artifactId>easyJavaDropboxAPI</artifactId>

<version>1.0.0</version>

</dependency>

 

3. Adicione o nosso repositório no pom.xml

<repositories>

<repository>

<id>easyJavaDropboxAPI</id>

<url>https://raw.github.com/ITSStartup/easyJavaDropboxAPI/mvn-repo</url>

<snapshots>

<enabled>true</enabled>

<updatePolicy>always</updatePolicy>

</snapshots>

</repository>

</repositories>

 

4. Crie uma classe Java com o método main

 

public class DropboxMain {

public static void main(String[] args) throws DbxException {

String token = "TOKEN HERE";

EasyJavaDropBoxService easyJavaDropBoxService = new EasyJavaDropBoxServiceImpl(path, token);

List<DbxEntry> listFiles = easyJavaDropBoxService.listFiles();

for (DbxEntry file : listFiles) {

System.out.println(file.name);

}

}

}

 

5. Gere o token seguindo as instruções:

http://apps.camilolopes.com.br/dpboxapiweb

 

6. Rode aplicação e verá:

dropboxconsoleasyapi

 

Pronto, os arquivos que tenho na pasta são listados.

Simples, não?

O projeto de exemplo está disponível no repositório da ITS.

E caso queriam saber mais sobre API, visite o repositório:

https://github.com/ITSStartup/easyJavaDropboxAPI

Abracos. See ya!!!

Série Dropbox Gerando Token dropboxAPI via Web

Olá Pessoal,

O post de hoje é bem rápido. Quero apresentar para vocês o Dropbox API Web.  Mas o que é isso Camilo?

Calma que vou explicar.

Lets go…

Dropbox API Web

É uma versão web que permite gerar um token a partir do app_key e app_secret que é criada no App Console do dropbox quando queremos dar acesso à uma aplicação em nossa conta no dropbox.

Tínhamos um problema  sobre como gerar o token facilmente,  dai criamos uma aplicação web que gera token para app no dropbox. Muitos emails chegaram até mim com dúvidas sobre essa versão e a primeira que postei aqui usando Java Application.

A resposta é que não há diferença entre as aplicações. Fizemos a versão web para ser mais fácil e rápido, sem falar que agora o desenvolvedor não Java pode gerar um token facilmente, já que não precisa saber como rodar um Java Application.

Basicamente é isso. Essa é mais uma constribuição para a comunidade e espero que tenham gostado. Mais novidade está no forno.

E a versão live:

http://apps.camilolopes.com.br/dpboxapiweb

O projeto foi desenvolvido com AngularJS, Spring e Jersey. Sinta-se à vontade em fazer o clone e brincar.  Confira no repositório:

O projeto público está no github:

https://github.com/camilolopes/dpboxapiweb/

Abracos.

Série Dropbox Gerando Token no DropBox API

Olá Pessoal,

No post de hoje vamos ver como gerar um Token para evitar o problema que tivemos no último post, onde cada vez que a aplicação rodar será preciso autorizar novamente para obter o code.

Lets go…

Starting…

Assumindo que você acompanhou e meteu a mão na massa com o post anterior, vou apenas me limitar aqui a resolver o problema que identificamos de evitar múltiplos allow toda vez que a aplicação sobe e precisa conectar com o dropbox.

Development

Crie uma nova classe no projeto (eu chamei de DropBoxGenerateToken). Esse código não fui eu quem criou. Lembro que encontrei nas minhas inúmeras pesquisas para resolver o problema. Acho que tinham umas 40 abas abertas e achei essa solução na discussão do fórum do dropbox developer. Como o código visto no post anterior, se apenas rodar sem entender não vamos conseguir atingir o objetivo. Veja o código a seguir:

public class DropboxGenerateToken{
    public static void main(String[] args)   throws IOException
    {
        // Only display important log messages.

        Logger.getLogger("").setLevel(Level.WARNING); 

        if (args.length == 0) {

            printHelp(System.out);

            return;

        }
        if (args.length != 2) {

            System.err.println("Expecting exactly 2 arguments, got " + args.length + ".");

            System.err.println("Run with no arguments for help.");

            System.exit(1); return;

        } 

        String argAppInfoFile = args[0];

        String argAuthFileOutput = args[1];

        // Read app info file (contains app key and app secret)

        DbxAppInfo appInfo;

        try {

            appInfo = DbxAppInfo.Reader.readFromFile(argAppInfoFile);

        }

        catch (JsonReader.FileLoadException ex) {

            System.err.println("Error reading <app-info-file>: " + ex.getMessage());

            System.exit(1); return;

        }

        // Run through Dropbox API authorization process

        String userLocale = Locale.getDefault().toString();

        DbxRequestConfig requestConfig = new DbxRequestConfig("examples-authorize", userLocale);

        DbxWebAuthNoRedirect webAuth = new DbxWebAuthNoRedirect(requestConfig, appInfo);

        String authorizeUrl = webAuth.start();

        System.out.println("1. Go to " + authorizeUrl);

        System.out.println("2. Click \"Allow\" (you might have to log in first).");

        System.out.println("3. Copy the authorization code.");

        System.out.print("Enter the authorization code here: ");

        String code = new BufferedReader(new InputStreamReader(System.in)).readLine();

        if (code == null) {

            System.exit(1); return;

        }

        code = code.trim();

        DbxAuthFinish authFinish;

        try {

            authFinish = webAuth.finish(code);

        }

        catch (DbxException ex) {

            System.err.println("Error in DbxWebAuth.start: " + ex.getMessage());

            System.exit(1); return;

        }

        System.out.println("Authorization complete.");

        System.out.println("- User ID: " + authFinish.userId);

        System.out.println("- Access Token: " + authFinish.accessToken);

        // Save auth information to output file.

        DbxAuthInfo authInfo = new DbxAuthInfo(authFinish.accessToken, appInfo.host);

        try {

            DbxAuthInfo.Writer.writeToFile(authInfo, argAuthFileOutput);

            System.out.println("Saved authorization information to \"" + argAuthFileOutput + "\".");

        }

        catch (IOException ex) {

            System.err.println("Error saving to <auth-file-out>: " + ex.getMessage());

            System.err.println("Dumping to stderr instead:");

            DbxAuthInfo.Writer.writeToStream(authInfo, System.out);

            System.exit(1); return;

        }

    }

    private static void printHelp(PrintStream out)

    {

        out.println("Usage: COMMAND <app-info-file> <auth-file-output>");

        out.println("");

        out.println("<app-info-file>: a JSON file with information about your API app.  Example:");

        out.println("");

        out.println("  {");

        out.println("    \"key\": \"Your Dropbox API app key...\",");

        out.println("    \"secret\": \"Your Dropbox API app secret...\"");

        out.println("  }");

        out.println("");

        out.println("  Get an API app key by registering with Dropbox:");

        out.println("    https://dropbox.com/developers/apps");

        out.println("");

        out.println("<auth-file-output>: If authorization is successful, the resulting API");

        out.println("  access token will be saved to this file, which can then be used with");

        out.println("  other example programs, such as the one in \"examples/account-info\".");

        out.println("");

    }

}

 

 Feito isso, crie um arquivo com o nome que quiser do tipo .json (o meu chamei de cam.json) e crie um outro chamado de TOKEN. Poderia ser outro nome.

dropboxapiproject

No arquivo cam.json vamos colocar as Keys do app:

{

"key":"7x7k0667",

"secret":"ccc8p2"

}

 

O arquivo TOKEN ficará vazio, mas após executarmos a aplicação será preenchido com o token que será o code usado sempre que precisarmos conectar ao dropbox.

Se tiver usando o Eclipse IDE vá em Run >> Configuration e execute assim:

dropboxruntokenargs

Aguarde o término e abra o arquivo TOKEN:

{

"access_token" : "V5C0NKXurvIAAAAAAAAAAdgoY"

}

Pronto, temos o Token gerado. Agora podemos usá-lo para autenticar e acessar sempre o nosso dropbox sem precisar dar mais allow, mesmo quando a aplicação for finalizada. Voltando ao projeto anterior, devemos fazer essa alteração no método main:

DbxRequestConfig config = new DbxRequestConfig("JavaTutorial/1.0",       Locale.getDefault().toString());

try {

DbxClient client = new DbxClient(config, "V5C0NKXurvIAAAAAAAAAAdgoY");

System.out.println("Linked account: "

+ client.getAccountInfo().displayName);

DbxEntry.WithChildren listing = client.getMetadataWithChildren("/");

System.out.println("Files in the root path:");

for (DbxEntry child : listing.children) {

System.out.println("       " + child.name + ": " + child.toString());

}

}catch (DbxException e) {

e.printStackTrace();

}

catch (Exception e) {

e.printStackTrace();

}

}

 

Observe quanto de código cortamos comparado com a versão do primeiro post.  Claro que poderíamos ler o arquivo TOKEN e ler apenas a chave para obter o valor.  Execute a aplicação e verá que poderá ver todos os seus arquivos sendo listados.

Muito bom, né? Vou ficando por aqui e espero que tenham gostado de mais um post.

Confiram o projeto no Github da ITS: https://github.com/ITSStartup/dropboxapi-example

Abraços. See ya!!!

Série Dropbox: Conectando com DropBox API Java

Olá Pessoal,

Hoje quero compartilhar uma experiência bem bacana que tive com a API do dropbox. Estou trabalhando em um projeto novo e vamos usar alguns recursos do DropBox como ferramenta  para poder automatizar alguns processos e facilitar a vida do usuário. A ideia deste post é mostrar como conectar sua aplicação com o DropBox.

Lets go…

Starting…

No inicio foi meio confuso de entender como funcionava a documentação do dropbox. É até boa, mas o tutorial não é muito objetivo. Levei algumas horas para entender nos detalhes como realmente as coisas funcionavam, até porque na primeira versão sempre que eu parava e iniciava a aplicação o code da autorização precisava ser gerado de novo. Veja os passos que precisamos fazer antes de colocar a mão no código:

  • Ir no https://www.dropbox.com/developers/apps e create app. Daí é só seguir os passos e ir respondendo as perguntas. Não tem erro aqui por serem bem diretas. No meu caso usei a opção full Access e permiti que a aplicação acesse os arquivos já existentes.  Claro que você precisa estar logado no dropbox.

dropboxapiappcreated

  • Ao clicar na app que foi criada teremos dois caras importantes, veja:

 

dropboxkeygenerated

Precisamos dessas Keys para poder conectar a nossa conta.

Pronto, só isso. Agora vamos programar.

Development

Crie um Java Project

O nosso exemplo será com Java Application somente para vermos a conexão e listagem do que temos no dropbox. O meu projeto é um maven project, portanto vamos precisar da API do dropbox. Adicione o código abaixo no pom.xml

<dependency>

<groupId>com.dropbox.core</groupId>

<artifactId>dropbox-core-sdk</artifactId>

<version>1.7.2</version>

</dependency>

 

Crie uma classe com método main do Java (chamei minha classe de Main). O código a seguir é o que está nessa página: https://www.dropbox.com/developers/core/start/java

A ideia aqui é explicar como fazer tudo funcionar. Ter apenas o código e executar não é o suficiente.  Veja o código:

public class Main {
public static void main(String[] args) {
final String APP_KEY = "KEY HERE";
final String APP_SECRET = "KEY SECRET HERE";

DbxAppInfo appInfo = new DbxAppInfo(APP_KEY, APP_SECRET);

DbxRequestConfig config = new DbxRequestConfig("JavaTutorial/1.0",
Locale.getDefault().toString());

DbxWebAuthNoRedirect webAuth = new DbxWebAuthNoRedirect(config, appInfo);
String authorizeUrl = webAuth.start();

System.out.println("AuthorizeURL " + authorizeUrl);
System.out.println("3. Copy the authorization code.");

try {
String code = new BufferedReader(new InputStreamReader(System.in)).
readLine().trim();

DbxAuthFinish authFinish = null;

authFinish = webAuth.finish(code);

DbxClient client = new DbxClient(config, authFinish.accessToken);

System.out.println("Linked account: "

+ client.getAccountInfo().displayName);
DbxEntry.WithChildren listing = client.getMetadataWithChildren("/");

System.out.println("Files in the root path:");

for (DbxEntry child : listing.children) {
System.out.println("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " + child.name + ": " + child.toString());
}
}
catch (DbxException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
}

 

Agora é que vem o pulo do gato. Se você rodar essa app e não fizer nada, o que acontece? Bem, você poderia esperar que fossem listados todos os seus arquivos que estão na raiz da sua conta do dropbox, certo? Por causa dessa linha aqui:

       DbxEntry.WithChildren listing = client.getMetadataWithChildren("/");

Rode e veja o resultado a seguir:

dropboxrunningmain

O que você precisa fazer? Copiar a URL e colar no browser. O dropbox vai solicitar allow para app que está querendo acessar, então você dar autorização e ele gera um token:

dropboxtokenbrowser

Feito isso vá para a aplicação e vamos alterar apenas uma linha veja qual:

//String code = new BufferedReader(new InputStreamReader(System.in)).readLine().trim();

String code = "TOKEN CREATED HERE";

 

Observe que comentei uma linha e coloquei o token que foi gerado na variavel code, poderia também ter digitado no console. Se tudo der certo você vai ver tudo que tem na raiz do seu dropbox:

dropboxworking

Simples, não? Você pode fazer o que quiser com os arquivos. Na documentação você pode ver como fazer o download.

Problema

Se você rodar a aplicação novamente, o code gerado acima é inválido e será preciso criar um novo. No próximo post vamos ver como resolver isso.

Abraços, see ya!!