/*******************************************************************************
* Copyright (c) 2015 IBH SYSTEMS GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.repo.manage.usage;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import org.eclipse.packagedrone.VersionInformation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.io.CharStreams;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class Pinger extends Thread
{
private final static Logger logger = LoggerFactory.getLogger ( Pinger.class );
private final static String PING_URL = "http://packagedrone.org/stats/";
private final static URL URL;
static
{
URL url = null;
try
{
url = new URL ( PING_URL );
}
catch ( final MalformedURLException e )
{
}
URL = url;
}
private final Statistics statistics;
public Pinger ( final Statistics statistics )
{
this.statistics = statistics;
setDaemon ( true );
setName ( "Pinger" );
setPriority ( Thread.MIN_PRIORITY );
}
@Override
public void run ()
{
if ( URL == null )
{
logger.info ( "Trouble parsing ping URL: {}", PING_URL );
return;
}
final long start = System.currentTimeMillis ();
logger.debug ( "Starting ping" );
try
{
performPing ( this.statistics );
}
catch ( final Exception e )
{
logger.info ( "Failed to ping", e );
}
finally
{
logger.debug ( "Ended ping after {} ms", System.currentTimeMillis () - start );
}
}
protected static void performPing ( final Statistics statistics ) throws Exception
{
final URLConnection con = URL.openConnection ();
con.setDoOutput ( true );
con.setUseCaches ( false );
logger.debug ( "Connection: {}", con );
if ( con instanceof HttpURLConnection )
{
( (HttpURLConnection)con ).setRequestMethod ( "POST" );
( (HttpURLConnection)con ).setInstanceFollowRedirects ( false );
}
con.setRequestProperty ( "Content-type", "text/json" );
con.setRequestProperty ( "User-agent", VersionInformation.USER_AGENT );
try ( OutputStream out = con.getOutputStream () )
{
final GsonBuilder gb = new GsonBuilder ();
final Gson g = gb.create ();
final OutputStreamWriter writer = new OutputStreamWriter ( out, StandardCharsets.UTF_8 );
g.toJson ( statistics, writer );
writer.flush ();
}
try ( InputStream in = con.getInputStream () )
{
final String result = CharStreams.toString ( new InputStreamReader ( in, StandardCharsets.UTF_8 ) );
logger.debug ( "Ping result: {}", result );
}
}
}