/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package UtilServices;
import UtilClasses.Forecast;
import UtilClasses.PrevisaoMetereologica;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
/**
*
* @author LAP01
*/
public class Weather {
public static PrevisaoMetereologica getWeatherByRegion(String region) {
try {
PrevisaoMetereologica previsao = new PrevisaoMetereologica();
LinkedHashSet<Forecast> forecasts = new LinkedHashSet<Forecast>();
URL url = new URL("http://www.google.com/ig/api?weather=Aveiro&hl=pt-pt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true);
XMLStreamReader streamReader = inputFactory.createXMLStreamReader(in);
do{
int eventType = streamReader.next();
if( eventType == XMLStreamConstants.START_ELEMENT ){
//Current conditions
if( streamReader.getLocalName().equals("current_conditions") ){
previsao = readCurrentConditions(streamReader);
}
//Forecasts
else if( streamReader.getLocalName().equals("forecast_conditions") ){
forecasts.add( readForecast(streamReader) );
}
}
}while( streamReader.hasNext() );
previsao.setForecasts(forecasts);
return previsao;
} catch (XMLStreamException ex) {
Logger.getLogger(Weather.class.getName()).log(Level.SEVERE, null, ex);
} catch (MalformedURLException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace(System.out);
} catch (IOException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace(System.out);
}
return null;
}
private static PrevisaoMetereologica readCurrentConditions(XMLStreamReader streamReader) throws XMLStreamException {
PrevisaoMetereologica previsao = new PrevisaoMetereologica();
int eventType = 0;
do{
eventType = streamReader.next();
if( eventType == XMLStreamConstants.START_ELEMENT ){
if( streamReader.getLocalName().equals("condition") ){
previsao.setCondicao(streamReader.getAttributeValue(null,"data"));
}
else if( streamReader.getLocalName().equals("temp_c") ){
previsao.setTemperatura(streamReader.getAttributeValue(null,"data"));
}
else if( streamReader.getLocalName().equals("humidity") ){
previsao.setHumidade(streamReader.getAttributeValue(null,"data"));
}
else if( streamReader.getLocalName().equals("icon") ){
previsao.setIcon(streamReader.getAttributeValue(null,"data"));
}
else if( streamReader.getLocalName().equals("wind_condition") ){
previsao.setCondicao_vento(streamReader.getAttributeValue(null,"data"));
}
}
} while( streamReader.hasNext()
&& !( eventType == XMLStreamConstants.END_ELEMENT && streamReader.getLocalName().equals("current_conditions") )
);
return previsao;
}
private static Forecast readForecast(XMLStreamReader streamReader) throws XMLStreamException {
Forecast forecast = new Forecast();
int eventType = 0;
do{
eventType = streamReader.next();
if( eventType == XMLStreamConstants.START_ELEMENT ){
if( streamReader.getLocalName().equals("day_of_week") ){
forecast.setDia(streamReader.getAttributeValue(null,"data"));
}
else if( streamReader.getLocalName().equals("low") ){
forecast.setMin( streamReader.getAttributeValue(null,"data") );
}
else if( streamReader.getLocalName().equals("high") ){
forecast.setMax( streamReader.getAttributeValue(null,"data") );
}
else if( streamReader.getLocalName().equals("icon") ){
forecast.setIcon( streamReader.getAttributeValue(null,"data") );
}
else if( streamReader.getLocalName().equals("condition") ){
forecast.setCondicao( streamReader.getAttributeValue(null,"data") );
}
}
} while( streamReader.hasNext()
&& !( eventType == XMLStreamConstants.END_ELEMENT && streamReader.getLocalName().equals("forecast_conditions") )
);
return forecast;
}
}