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!!

Série AngularJS – Por onde começar? Qual o melhor livro?

Olá Pessoal,

Resolvi criar esse post para ajudar aqueles que estão querendo começar com o AngularJS, mas não sabem como dar os primeiros passos.

Lets go…

Por onde começar?

Essa é uma pergunta muito comum para quem quer ter o primeiro contato com o framework da Google. Eu também fiz essa pergunta quando me foi apresentado o AngularJS, apesar de que a documentação do framework é boa e está em atualização constante. Algumas coisas não são bem explicadas como deveriam, mas dá pra fazer pelo menos um “Hello world” e tirar dúvidas de como usar algumas funcionalidades do Angular, sem falar que a lista de discussão deles é bem ativa e os próprios desenvolvedores do framework estão lá participando.

Sabemos que se formos no Google.com e realizarmos uma pesquisa sobre AngularJS vai ter bastante post sobre assunto, e alguns de qualidade, mas será o suficiente para você de fato aprender o framework? Depende até onde você deseja ir. Para sair do 0 x 0 o material que está disponível na internet já é mais que o suficiente, mas se você deseja se aprofundar mais no framework e começar a tratar o mesmo para ambientes corporativos, dai terá que entender alguns assuntos mais específicos, pois achei as informações práticas limitadas na documentação. Sem falar que entender angularJS é apenas uma parte da história, o ideal é que você entenda como trabalhar com frameworks JS da mesma forma que você trabalha do lado do servidor, por exemplo unit test, build etc. Eu particularmente estou entrando aos poucos no mundo JS e o Angular está sendo meu ponto de entrada, uma vez que client-side nunca foi meu forte por questões de projetos e fora um trauma que tenho de JavaScript de 13 anos atras, mas hoje acho que ja superei.

Quando me perguntam por onde começar com o AngularJS sempre recomendo na seguinte ordem:

1. Internet: pesquise posts sobre o assunto na Internet, veja aqueles que tem qualidade e comece a ler, e se for prático ja saia metendo mão na massa. Leia a parte teórica que tem na documentação, participe de grupo de discussões como o AngularJS-Brazil  e  o AngularJS-Brasil no Faceboook. Aqui seu objetivo é descobrir o framework, de poder brincar com ele e saber se você curtiu o jeito de “trampar”. Acho que é a melhor forma e mais barata que se deve seguir quando ainda está experimentando se você deve investir tempo e dinheiro no angularJS. No grupo AngularJS-Brazil eu postei uma pilha de hotlinks sobre o framework, é só acessar o grupo e conferir.

2. Livros: Hoje há bastante livro  sobre o assunto comparado a 3 meses atras onde tinham apenas 2-3. Mas o negócio cresceu e temos mais opções.

3. Comunidade: Participe das comunidades ativas do AngularJS. A página no facebook é bem agitada e recentemente criei um grupo no Google Groups AngularJS-Brazil para centralizar posts, links e discussoes sobre o framework.

A seguir alguns livros que recomendo:

1. AngularJS na Prática

É um livro em português sobre o framework, mas ainda está em desenvolvimento. Acho que já passou da hora do autor publicar, pois esse foi o primeiro livro que vi do assunto em português, lá em meados de julho/13. Recomendo o livro para quem quer dar os primeiros passos com o framework. A escrita do autor é bem confortável e os exemplos funcionam. Um detalhe importante é que a parte de server-side é em PHP, mas não vejo isso como problema, é só pegar o conceito e aplicar na linguagem que você trabalha.

2. Recipes with Angular.js
É um livro bacana que recomendo para quem já está mexendo com AngularJS. Não precisa ser um expert, mas se você já aprendeu a base do framework já consegue fazer um pequeno projeto (nem que seja um crud) usando o AngularJS. Esse livro vai dar umas dicas legais, é bem pequeno e prático. Pena que o autor não mostra o resultado do código, apenas joga e o resto fica direcionado para pegar no github dele. Mas ele organizou bem os arquivos no github e você pega por capítulo. Recomendo. Foi o terceiro livro que li.

3. Instant AngularJS Starter

Esse livro aqui não é dos melhores. Em termos teóricos até ajuda, mas parece que o autor pegou o que tem na documentação, jogou no livro e tratou apenas deixando a escrita direcionada para o modelo de livro. Eu li e gostei como ele conceituou, já que no início tinham coisas que não eu sabia o porquê e a forma que ele explicou ficou melhor de entender. Muitos dos códigos que estão no livro estão quebrados, parece que o copy/paste não foi feito da melhor forma. Por um lado foi minha primeira oportunidade em abrir a fazer um fix em um código angularJS escrito por outra pessoa. Pelo preço do livro na versão kindle talvez vale a pena comprar só pra não aprender pelo caminho feliz.

4. ng-book (http://www.ng-book.com/)

É um livro que ainda não li, mas vi que quem leu gostou do livro. Está na minha lista. Aqui

5. Mastering Web Application Development with AngularJS

Esse é o que estou começando a ler. Os comentarios de quem já leu são animais. Parece ser um bom livro. Estou esperando chegar o meu exemplar, pois pela quantidade de página prefiro ler na versão impressa, além de poder usar o marcatexto, escrever no livro, etc. O preço é diferente, $40 doletas e ainda tem IOF + Frete. A versão Kindle tá mais em conta. Assim que terminar de ler posto um review aqui no blog.

Estou com um post em draft com review dos livros que já li. Vou postar em breve e com mais detalhes.

Bom, é isso pessoal. Vou ficando por aqui e espero que tenham gostado da série AngularJS, foi mais de um mês postando e compartilhando com vocês há muito mais coisas sobre o framework (claro) e quem sabe fica para uma outra série mais lá na frente?

Abracos, see ya!!!