You are on page 1of 10

Sobreapalestra

DesenvolvendoaplicaesWeb comJavaeGoogle
RafaelSantos
LaboratrioAssociadodeComputaoeMatemticaAplicada InstitutoNacionaldePesquisasEspaciais

TodosconhecemoGoogle! Vriosmecanismosdebusca/ferramentasde produtividade/etc.:


Todosconhecemasinterfacesbsicasdeacesso(WWW)...

Agenda/calendrio,email. Grupos,diretrios,imagenseblogs. Livroseartigosacadmicos. GoogleMaps,GoogleEarth. Picasa,GoogleToolbar,etc.

...massabiamquepodemosdesenvolvercdigousandofunesdo Google?
http://www.lac.inpe.br/~rafael.santos 2

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

Dezembro/2006

Sobreapalestra

ProgramandocomaGoogleSOAPSearchAPI

Objetivo:DemonstraralgumasAPIs(Application ProgrammingInterfaces)doGoogleusandoJava/JavaScript comolinguagensdeprogramao. Exemplodecomo...


Exemploscomcdigo,semdescriodedesign.

EmbutirbuscasdoGoogleemsuasaplicaesemJava. AcessaremodificaroGoogleAgenda. CriarmapascustomizadoscomGoogleMapseJavaScript.

OGoogleSOAPAPIDeveloper'sKit (http://code.google.com/apis/soapsearch/download.html) contmarquivoWSDL,wrapperseexemplosparacriaode aplicaesquefazembuscasnoGoogle.


Working code attracts people who want to code. Design documents attract people who want to talk about coding -- Charles Miller.
Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 3

ODKcontmtambmdocumentao!

SOAP:(originalmenteSimpleObjectAccessProtocol)um protocoloparatrocademensagemsemXMLusandoHTTP. WSDL:(WebServicesDescriptionLanguage)oformatode arquivosXMLparadescriodewebservices. Wrappers:classesqueencapsulamoswebservices.

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

Partetcnica:setup

Partetcnica:setup

VocprecisadeumacontanoGoogle(quaseautomtico paraquemtemcontanoGmail).

Ocdigopodeserbaixadode http://code.google.com/apis/soapsearch/ Oquenosinteressaoarquivogoogleapi.jar(VB,C#, Python,Perl,PHP,outrastambmpodemserusadas).

Umalicenaserenviadaparaseuemail. Alicenapermite1000acessosdiriosparausonocomercial.

Ambienterecomendado:Eclipse(www.eclipse.org). Passos:

1. Criarumnovoprojeto. 2. Adicionaraoprojetooarquivogoogleapi.jar(Properties,JavaBuild Path,Libraries, AddExternalJAR).

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

DesenvolvendoaplicaessimplescomGSA

DesenvolvendoaplicaessimplescomGSA(1)
import java.io.*; import com.google.soap.search.*; public class BuscaSimples { public static void main(String[] args) { String googleKey = readKey(); GoogleSearch s = new GoogleSearch(); try { s.setKey(googleKey); s.setQueryString("aplicaes cientficas em Java"); GoogleSearchResult resultado = s.doSearch(); GoogleSearchResultElement[] elementos = resultado.getResultElements(); for (GoogleSearchResultElement elemento:elementos) { System.out.println(elemento.getTitle()+": "+elemento.getURL()); } } catch (GoogleSearchFault f) { System.out.println("Erro na busca:"+f.toString()); } }
7 Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 8

AgorasusaraAPI!

1. CriarumainstnciadeGoogleSearcheusarmtodossetpara informarlicena,termosparabusca,linguagensecodificao, outrasopes. 2. ExecutaromtododoSearchparaobterumainstnciade GoogleSearchResult. 3. Obterresultadosindividuais(arrayde GoogleSearchResultElement)commtodogetResultElements. 4. ObtercamposespecficosdeGoogleSearchResultElement.

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

DesenvolvendoaplicaessimplescomGSA(1)
private static String readKey() { String key = null; try { BufferedReader br = new BufferedReader(new FileReader("google.key")); key = br.readLine(); br.close(); } catch(IOException ioe) { } return key; } }
LCP - Projetos: http://www.lcp.coppe.ufrj.br/projetos.html LA-Web/WebMedia 2004: http://www.icmc.usp.br/laweb/webmedia/shortcourses.php MIT - Introduo Soluo de Problemas de Computao e Engenharia <b>...</b>: http://www.universiabrasil.net/mit/curso.jsp?codcurso=30 in Latin America | Bem vindo ao site do TCSC em Amrica Latina: http://tcsc.ic.uff.br/node?page=2 EXEHDA: http://www.inf.ufrgs.br/~exehda/index.php?arquivo=atividades Introduo Internet: http://mesonpi.cat.cbpf.br/escola99/II.html Introduo Internet: http://mesonpi.cat.cbpf.br/verao98/Nilton.html ...

DesenvolvendoaplicaessimplescomGSA(2)
import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class TabelaBuscaMelhorada extends AbstractTableModel { private String[] colunas = {"Ttulo","URL","Contexto"}; private ArrayList<ArrayList<String>> entradas; public TabelaBuscaMelhorada() { super(); entradas = new ArrayList<ArrayList<String>>(); } public void adicionaLinha(ArrayList<String> linha) { entradas.add(linha); } public String getColumnName(int column) { return colunas[column]; }

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

10

DesenvolvendoaplicaessimplescomGSA(2)
public int getColumnCount() { return colunas.length; } public int getRowCount() { return entradas.size(); } public Object getValueAt(int rowIndex, int columnIndex) { if ((rowIndex >= 0) && (rowIndex < entradas.size())) { ArrayList<String> entrada = entradas.get(rowIndex); if ((columnIndex >= 0) && (columnIndex < entrada.size())) return entrada.get(columnIndex); } return null; } } import import import import

DesenvolvendoaplicaessimplescomGSA(2)
java.io.*; java.util.ArrayList; javax.swing.*; com.google.soap.search.*;

public class BuscaMelhorada extends JFrame { private TabelaBuscaMelhorada tabelaDados; private int numResultados; public BuscaMelhorada(String busca) { tabelaDados = new TabelaBuscaMelhorada(); String googleKey = readKey(); GoogleSearch s = new GoogleSearch(); try { s.setKey(googleKey); s.setQueryString(busca); s.setSafeSearch(true); s.setLanguageRestricts("lang_br"); GoogleSearchResult resultado = s.doSearch(); numResultados = resultado.getEstimatedTotalResultsCount(); GoogleSearchResultElement[] elementos = resultado.getResultElements();

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

11

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

12

DesenvolvendoaplicaessimplescomGSA(2)
for (GoogleSearchResultElement elemento:elementos) { ArrayList<String> linha = new ArrayList<String>(); linha.add(elemento.getTitle()); linha.add(elemento.getURL()); linha.add(elemento.getSnippet()); tabelaDados.adicionaLinha(linha); } } catch (GoogleSearchFault f) { System.out.println("Erro na busca:"+f.toString()); } // Comeamos a montar a GUI setTitle("Busca por ["+busca+"] (aprox. "+1+" resultados)"); getContentPane().add(new JScrollPane(new JTable(tabelaDados))); pack(); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new BuscaMelhorada("Google Java API"); }
Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 13

DesenvolvendoaplicaessimplescomGSA(2)

Divertido,masnotanto...

Potencialenormeparacustomizao(selimitesforem removidos).
Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 14

Limiteparabusca:10resultados. Buscasdirias:1000. Programabeta,continuargratuito?

ProgramandocomaGoogleDataAPI

Partetcnica:setup

AGoogleDataAPI (http://code.google.com/apis/gdata/index.html)provclasses parausarumprotocolosimples(baseadoemHTTP)para obter,publicar,removerealterardadosnaWWW. UsadaporservioscomoGoogleAgenda,Blogger, Spreadsheets,CodeSearch,etc. AAPIescondeacomplexidadedacomunicaocomo servidor.

AindaprecisamosdacontanoGoogle. Precisamosdogdata.java.zip. Paraosexemplos,precisamosdeumacontanoGoogle Agenda.


AdicionamosaoEclipseosgdataclient1.0.jaregdata calendar1.0.jar.

QuemtemGmail,temcalendrio/agenda (http://www.google.com/calendar). Assumimosqueexistemalgunseventosjcadastrados.

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

15

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

16

Partetcnica:setup

Partetcnica:setup

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

17

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

18

Partetcnica:setup
import import import import import import import

DesenvolvendoaplicaessimplescomGDA(1)
java.io.IOException; java.net.URL; java.util.List; com.google.gdata.client.calendar.*; com.google.gdata.data.*; com.google.gdata.data.extensions.*; com.google.gdata.util.*;

public class LeAgenda { public static void main(String[] args) throws IOException { URL urlCalendrio = new URL("http://www.google.com/calendar/feeds/default/private/full"); CalendarQuery consultaCalendrio = new CalendarQuery(urlCalendrio); consultaCalendrio.setMinimumStartTime( DateTime.parseDateTime("2006-12-11T00:00:00+11:00")); consultaCalendrio.setMaximumStartTime( DateTime.parseDateTime("2006-12-15T23:59:59+11:00")); CalendarService servioCalendrio = new CalendarService("ExemploApp");

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

19

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

20

DesenvolvendoaplicaessimplescomGDA(1)
try { servioCalendrio.setUserCredentials("rafaeldcsantos@gmail.com",P.senhaGmail); Feed resultado = servioCalendrio.query(consultaCalendrio, Feed.class); List<Entry> entradas = resultado.getEntries(); for(Entry e:entradas) { EventEntry ce = new EventEntry(e); String ttulo = ce.getTitle().getPlainText(); String contedo = ""; if (ce.getContent().getType() == Content.Type.TEXT) { TextContent tc = (TextContent)ce.getContent(); contedo = tc.getContent().getPlainText(); } List<When> quando = ce.getTimes(); System.out.println("Quando:"); for(When w:quando) { DateTime incio = w.getStartTime(); incio.setTzShift(-11*60); DateTime fim = w.getEndTime(); fim.setTzShift(-11*60); System.out.println(incio.toUiString()+" a "+fim.toUiString()); }

DesenvolvendoaplicaessimplescomGDA(1)
System.out.println("O que:"); System.out.println(ttulo); if (contedo.length() > 0) { System.out.println("Detalhes:"); System.out.println(contedo); } DateTime publicado = ce.getPublished(); publicado.setTzShift(-11*60); System.out.println("Publicado em "+publicado.toUiString()); System.out.println("--------------------------------------------------"); } } catch (AuthenticationException e) { e.printStackTrace(); } catch (ServiceException e) { e.printStackTrace(); } } }

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

21

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

22

DesenvolvendoaplicaessimplescomGDA(1)
Quando: 2006-12-12 14:00 a 2006-12-12 15:00 2006-12-11 14:00 a 2006-12-11 15:00 2006-12-14 14:00 a 2006-12-14 15:00 2006-12-10 14:00 a 2006-12-10 15:00 2006-12-13 14:00 a 2006-12-13 15:00 O que: Treinamento XP Detalhes: Treinamento em metodologia XP (introduo) Publicado em 2006-12-06 06:41 -------------------------------------------------Quando: 2006-12-14 17:00 a 2006-12-14 18:00 O que: Dentista Detalhes: Lembrar de pegar oramento! Publicado em 2006-12-06 06:27 -------------------------------------------------Quando: 2006-12-12 16:00 a 2006-12-12 20:00 O que: Curso de Aplicaes Cientficas Detalhes: Curso sobre desenvolvimento de aplicaes cientficas Publicado em 2006-12-06 06:26 -------------------------------------------------Quando: 2006-12-10 19:00 a 2006-12-10 20:00 O que: Palestra Java e Google Publicado em 2006-12-06 05:59 --------------------------------------------------

DesenvolvendoaplicaessimplescomGDA(2)
import import import import import import java.io.IOException; java.net.URL; com.google.gdata.client.calendar.CalendarService; com.google.gdata.data.*; com.google.gdata.data.extensions.*; com.google.gdata.util.*;

public class ModificaAgenda { public static void main(String[] args) throws IOException { URL urlCalendrio = new URL("http://www.google.com/calendar/feeds/default/private/full"); EventEntry entrada = new EventEntry(); entrada.setTitle(new PlainTextConstruct("Curso de Java ELAC")); entrada.setContent(new PlainTextConstruct("Mini-curso na escola de+ vero do LAC")); Person autor = new Person("Rafael Santos", null, "rafaeldcsantos@gmail.com"); entrada.getAuthors().add(autor); DateTime incio = DateTime.parseDateTime("2007-01-30T14:00:00+11:00"); DateTime fim = DateTime.parseDateTime("2007-01-30T17:15:00+11:00"); When horrioEvento = new When(); horrioEvento.setStartTime(incio); horrioEvento.setEndTime(fim);
23 Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 24

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

DesenvolvendoaplicaessimplescomGDA(2)
entrada.addTime(horrioEvento); CalendarService servio = new CalendarService("ExemploApp"); try { servio.setUserCredentials("rafaeldcsantos@gmail.com",Personal.senhaGmail); EventEntry entradaModificada = servio.insert(urlCalendrio,entrada); System.out.println(entradaModificada.getId()); System.out.println(entradaModificada.getPublished()); } catch (AuthenticationException e) { e.printStackTrace(); } catch (ServiceException e) { e.printStackTrace(); } } }

DesenvolvendoaplicaessimplescomGDA(2)

http://www.google.com/calendar/feeds/default/private/full/96s67icco3qtvc84gg9cdp0kcc 2006-12-06T23:06:39.000Z

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

25

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

26

ProgramandocomaGoogleMapsAPI

Partetcnica:setup

AGoogleMapsAPI(http://www.google.com/apis/maps/) permiteainclusodemapasdoGoogleempginasnaWeb. precisoobterumachavequeserrelacionadaaum site/diretrio. precisoterumacontanoGoogle.

Notem! AoregistrarparareceberumachaveparausodoGoogle Maps,vocjrecebe:


1. Achave(umalongastringaparentementealeatria), 2. AconfirmaodaURLparaqualachavevlida, 3. UmexemplosimplesemHTML+JavaScript.

Limitesbemgenerososparaaplicaessimples! InteratividadetodaemJavaScript,mas...

necessrioseregistrarseparadamenteparaobteracessoAPI.

Testesdevemserfeitosnomesmoservidordedeployment!

...podemosusarJSP/Servletsparaadicionar(mais)lgica!

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

27

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

28

DesenvolvendoaplicaessimplescomGMA(1)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Exemplo com Google Maps</title> <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA4pOlVHnW5h0rxGx-M9fBBSehV83twcaz1QuVwko5BmHT1khXxTdvk1AFVxM8aXmz0epCmP2xsF3bA" type="text/javascript"></script> <script type="text/javascript"> function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); map.setCenter(new GLatLng(-23.227465,-45.838394),12); } } </script> </head> <body onload="load()" onunload="GUnload()"> <h3>Mapa de So Jos dos Campos</h3> <div id="map" style="width: 1040px; height: 450px"></div> </body> </html>

DesenvolvendoaplicaessimplescomGMA(1)

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

29

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

30

DesenvolvendoaplicaessimplescomGMA(2)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Exemplo com Google Maps</title> <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA4pOlVHnW5h0rxGx-M9fBBSehV83twcaz1QuVwko5BmHT1khXxTdvk1AFVxM8aXmz0epCmP2xsF3bA" type="text/javascript"></script> <script type="text/javascript"> function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); map.setCenter(new GLatLng(-23.227465,-45.838394),12); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.setMapType(G_SATELLITE_TYPE); addPoints(map); } }

DesenvolvendoaplicaessimplescomGMA(2)
function addPoints(map) { var icon = new GIcon(); icon.image = "http://www.google.com/mapfiles/marker.png"; icon.shadow = "http://www.google.com/mapfiles/shadow50.png"; icon.iconSize = new GSize(20, 34); icon.shadowSize = new GSize(37, 34); icon.iconAnchor = new GPoint(9, 34); icon.infoWindowAnchor = new GPoint(9, 2); icon.infoShadowAnchor = new GPoint(18, 25); var newpoints = new Array(); newpoints[0] = new Array(-23.207824014188837, -45.86015224456787, icon, 'INPE', 'Aqui fica o Instituto Nacional de Pesquisas Espaciais'); newpoints[1] = new Array(-23.19934356453084, -45.91113567352295, icon, 'IBTA', 'A palestra foi aqui!'); for(var i = 0; i < newpoints.length; i++) { var point = new GPoint(newpoints[i][1],newpoints[i][0]); var popuphtml = newpoints[i][4] ; var marker = createMarker(point,newpoints[i][2],popuphtml); map.addOverlay(marker); } }

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

31

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

32

DesenvolvendoaplicaessimplescomGMA(2)
function createMarker(point, icon, popuphtml) { var popuphtml = "<div id=\"popup\">" + popuphtml + "<\/div>"; var marker = new GMarker(point, icon); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(popuphtml); }); return marker; } </script> </head> <body onload="load()" onunload="GUnload()"> <h3>Mapa de So Jos dos Campos</h3> <div id="map" style="width: 1040px; height: 450px"></div> </body> </html>

DesenvolvendoaplicaessimplescomGMA(2)

Ajudainestimveldehttp://mapmaker.donkeymagic.co.uk/
Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 33 Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 34

DesenvolvendoaplicaessimplescomGMA(3)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Exemplo com Google Maps</title> <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA4pOlVHnW5h0rxGx-M9fBBSehV83twcaz1QuVwko5BmHT1khXxTdvk1AFVxM8aXmz0epCmP2xsF3bA" type="text/javascript"></script> </head> <body> <h3>Mapa de So Jos dos Campos</h3> <div id="map" style="width: 1040px; height: 450px"></div> <script type="text/javascript"> var map; map = new GMap2(document.getElementById("map")); map.setCenter(new GLatLng(-23.207587357776266,-45.889549255371094),14); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.setMapType(G_HYBRID_TYPE);

DesenvolvendoaplicaessimplescomGMA(3)
var x_array = new Array(0); var y_array = new Array(0); x_array.push(-23.21504183342577); y_array.push(-45.90961217880249); x_array.push(-23.213917772458363); y_array.push(-45.90989112854004); x_array.push(-23.20900728996491); y_array.push(-45.908989906311035); ... ... x_array.push(-23.206778778537803); y_array.push(-45.86124658584595); map.clearOverlays(); var points = []; for (i = 0; i < x_array.length; i++) { var point = new GPoint(y_array[i], x_array[i]); points.push(point); } map.addOverlay(new GPolyline(points)); </script> </body> </html>

Ajudainestimvelde http://www.mappinghacks.com/projects/gmaps/
Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 36

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

35

DesenvolvendoaplicaessimplescomGMA(3)

Comentriosfinais AlgumasAPIssoumtantoquantocomplexas...

UtilidadedoGoogleSOAPAPI?

AlgumaconfusoemGDataeCalendar. Muitaconfusocomformatodedatasediferenadefusoshorrios! Seriamuitotilparaadicionarintelignciaespecficasbuscasdo Google. Comaslimitaespresentes,ficapoucoatraente.

Maiorproblema:continuidade/maturaodasAPIs.

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

37

Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

38

Comentriosfinais

Comentriosfinais

FuturodestasAPIs

Mashing,Web2.0:Muitaspossibilidades,masmuitohype.

Existempossibilidadescomerciaisoubenefciosindiretos?

Algunsserviospossivelmentesobreviveromelhorsemais ferramentasforemdisponibilizadas.
Dezembro/2006 http://www.lac.inpe.br/~rafael.santos 39

Possvel,comalgumacodificao,criarserviosnovosbaseados emserviosexternosexistentes. Eacomercializaodestesservios? EseasAPIs/WebServicesusadascomobaseforem descontinuadas? Dequalquerjeito,odesafiointeressante.

Apresentao(emuitomais)em http://www.lac.inpe.br/~rafael.santos Mapas:


Referncias:

http://www.lac.inpe.br/~rafael.santos/Maps1.html http://www.lac.inpe.br/~rafael.santos/Maps1.jsp http://www.lac.inpe.br/~rafael.santos/Maps2.jsp GoogleHacks(3aEdio.RaelDornfest,PaulBauscheTara Calishain;O'Reilly2006) GoogleMapsHacks(RichGibsoneSchuylerErle;O'Reilly2006)

Perguntas?
Dezembro/2006

http://www.lac.inpe.br/~rafael.santos

40

You might also like