package negocios.impl.eventosExternos; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Iterator; import java.util.List; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import persistencia.Evento; public class GoogleCalendarFeed { private final static String BASEURL = "http://www.google.com/calendar/feeds/%1/public/full?futureevents=true&orderby=starttime&sortorder=ascending"; static final String ENTRY = "entry"; static final String WHEN = "when"; static final String TITLE = "title"; static final String CONTENT = "content"; static final String GD = "gd"; static final int longFmtDateLgth = 29; static final int shortFmtDateLgth = 10; static final String ENDTIME = "endTime"; static final String STARTTIME = "startTime"; private String calendarId; public List<Evento> obtenerEventos() throws IOException, XMLStreamException, ParseException { String urlStr = BASEURL.replace("%1", calendarId); URL url = new URL(urlStr); XMLInputFactory inputFactory = XMLInputFactory.newInstance(); // Setup a new eventReader InputStream in = url.openStream(); XMLEventReader eventReader = inputFactory.createXMLEventReader(in); // Read the XML document List<Evento> ret = new ArrayList<Evento>(); Evento evento = null; boolean inEntry = false; while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); if (event.isStartElement()) { StartElement element = event.asStartElement(); if (element.getName().getLocalPart() == ENTRY) { inEntry = true; event = eventReader.nextEvent(); evento = new Evento(); continue; } if ((element.getName().getPrefix() == GD) && (element.getName().getLocalPart() == WHEN)) { Iterator<Attribute> atributos = element.getAttributes(); while (atributos.hasNext()) { Attribute attr = atributos.next(); if (attr.getName().toString() == STARTTIME) { Calendar cal = this.parseGoogleDate(attr.getValue()); evento.setInicio(cal); continue; } if (attr.getName().toString() == ENDTIME) { Calendar cal = this.parseGoogleDate(attr.getValue()); evento.setFin(cal); continue; } } } if (element.getName().getLocalPart() == TITLE && inEntry) { event = eventReader.nextEvent(); evento.setNombre(event.asCharacters().getData()); continue; } if (element.getName().getLocalPart() == CONTENT && inEntry) { event = eventReader.nextEvent(); evento.setDescripcion("Evento externo"); continue; } } if (event.isEndElement()) { if ((event.asEndElement().getName().getLocalPart() == ENTRY) && (evento != null)){ inEntry = false; ret.add(evento); evento = null; continue; } } } return ret; } private Calendar parseGoogleDate(String strDate) throws ParseException { Calendar cal = Calendar.getInstance(); if (strDate.length() == longFmtDateLgth) { strDate = strDate.replace("T", ""); strDate = strDate.replaceFirst("(\\d\\d):(\\d\\d)$", "$1$2"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss.SSSZ"); cal.setTime(sdf.parse(strDate)); } else if (strDate.length() == shortFmtDateLgth) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); cal.setTime(sdf.parse(strDate)); } return cal; } public String getCalendarId() { return calendarId; } public void setCalendarId(String calendarId) { this.calendarId = calendarId; } }