/**
* Global Sensor Networks (GSN) Source Code
* Copyright (c) 2006-2016, Ecole Polytechnique Federale de Lausanne (EPFL)
*
* This file is part of GSN.
*
* GSN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GSN is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GSN. If not, see <http://www.gnu.org/licenses/>.
*
* File: src/ch/epfl/gsn/wrappers/general/HttpGetWrapper.java
*
* @author Ali Salehi
* @author Mehdi Riahi
*
*/
package ch.epfl.gsn.wrappers.general;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.slf4j.LoggerFactory;
import ch.epfl.gsn.beans.AddressBean;
import ch.epfl.gsn.beans.DataField;
import ch.epfl.gsn.wrappers.AbstractWrapper;
import org.slf4j.Logger;
public class HttpGetWrapper extends AbstractWrapper {
private int DEFAULT_RATE = 2000;
private static int threadCounter = 0;
private final transient Logger logger = LoggerFactory.getLogger( HttpGetWrapper.class );
private String urlPath;
private HttpURLConnection httpURLConnection;
private URL url;
private AddressBean addressBean;
private String inputRate;
private int rate;
private transient final DataField [] outputStructure = new DataField [] { new DataField( "data" , "binary:image/jpeg" , "JPEG image from the remote networked camera." ) };
/**
* From XML file it needs the followings :
* <ul>
* <li>url</li> The full url for retriving the binary data.
* <li>rate</li> The interval in msec for updating/asking for new information.
* <li>mime</li> Type of the binary data.
* </ul>
*/
public boolean initialize ( ) {
this.addressBean =getActiveAddressBean( );
urlPath = this.addressBean.getPredicateValue( "url" );
try {
url = new URL(urlPath);
} catch (MalformedURLException e) {
logger.error("Loading the http wrapper failed : "+e.getMessage(),e);
return false;
}
inputRate = this.addressBean.getPredicateValue( "rate" );
if ( inputRate == null || inputRate.trim( ).length( ) == 0 ) rate = DEFAULT_RATE;
else
rate = Integer.parseInt( inputRate );
logger.debug( "AXISWirelessCameraWrapper is now running @" + rate + " Rate." );
return true;
}
public void run ( ) {
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(1024*20);
byte[] buffer = new byte[16*1024];
BufferedInputStream content;
while ( isActive( ) ) {
try {
Thread.sleep( rate );
httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.connect();
if ( httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_ACCEPTED ) continue;
content = new BufferedInputStream(httpURLConnection.getInputStream(),4096);
arrayOutputStream.reset();
int readIndex = -1;
while ( (readIndex= content.read(buffer))!=-1)
arrayOutputStream.write(buffer, 0, readIndex);
postStreamElement( arrayOutputStream.toByteArray());
} catch ( InterruptedException e ) {
logger.error( e.getMessage( ) , e );
}catch (IOException e) {
logger.error( e.getMessage( ) , e );
}
}
}
public String getWrapperName() {
return "Http Receiver";
}
public void dispose ( ) {
threadCounter--;
}
public DataField[] getOutputFormat ( ) {
return outputStructure;
}
}