package com.pugh.sockso; import com.pugh.sockso.events.LatestVersionEvent; import com.pugh.sockso.events.LatestVersionListener; import com.google.inject.Inject; import com.google.inject.Singleton; import org.apache.log4j.Logger; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * This class handles checking for the latest version from the website, and * allowing listeners to be notified of this information when it's received. * */ @Singleton public class VersionChecker { private static final Logger log = Logger.getLogger( VersionChecker.class ); private final Properties p; private final List<LatestVersionListener> listeners; /** * Constructor * */ @Inject public VersionChecker( final Properties p ) { this.p = p; this.listeners = new ArrayList<LatestVersionListener>(); } /** * Adds a listener * * @param listener * */ public void addLatestVersionListener( final LatestVersionListener listener ) { listeners.add( listener ); } /** * Fires a LatestVersionEvent to all listeners * * @param version * */ public void fireLatestVersionEvent( final String version ) { final LatestVersionEvent evt = new LatestVersionEvent( version ); for ( final LatestVersionListener listener : listeners ) { listener.latestVersionReceived( evt ); } } /** * Tries to fetch the latest version from the Sockso website * */ public void fetchLatestVersion() { try { final String latestUrl = Constants.VERSION_LATEST_URL; final URL url = new URL( latestUrl ); final HttpURLConnection cnn = (HttpURLConnection) url.openConnection(); cnn.setRequestMethod( "GET" ); fetchLatestVersionFrom( cnn ); } catch ( final IOException e ) { log.error( e ); } } /** * Uses the HTTP connection to find the latest version available. If it * succeeds then it will fire a LatestVersionEvent. * * @param cnn * */ protected void fetchLatestVersionFrom( final HttpURLConnection cnn ) { if ( p.get(Constants.VERSION_CHECK_DISABLED).equals(Properties.YES) ) { return; } try { BufferedReader in = null; try { in = new BufferedReader( new InputStreamReader(cnn.getInputStream()) ); final String s = in.readLine(); final Matcher m = Pattern.compile("\\d+.\\d+.?\\d*").matcher( s ); log.debug( "Latest version response: " + s ); if ( m.matches() ) { fireLatestVersionEvent( s ); } } finally { Utils.close(in); } } catch ( final IOException e ) { log.error( e ); } } }