net.networksaremadeofstring.rhybudd.ZenossPoller.java Source code

Java tutorial

Introduction

Here is the source code for net.networksaremadeofstring.rhybudd.ZenossPoller.java

Source

/*
 * Copyright (C) 2013 - Gareth Llewellyn
 *
 * This file is part of Rhybudd - http://blog.NetworksAreMadeOfString.co.uk/Rhybudd/
 *
 * This program 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.
 *
 * This program 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
 * this program. If not, see <http://www.gnu.org/licenses/>
 */
package net.networksaremadeofstring.rhybudd;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.os.*;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.bugsense.trace.BugSenseHandler;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

public class ZenossPoller extends Service {
    private NotificationManager mNM;
    public ZenossAPI API = null;
    SharedPreferences settings = null;
    JSONObject EventsObject = null;
    JSONArray Events = null;
    int EventCount = 0;
    String CriticalList = "";
    Handler handler;
    Handler eventsHandler;
    List<ZenossEvent> listOfZenossEvents = new ArrayList<ZenossEvent>();
    List<String> EventDetails = new ArrayList<String>();
    boolean EventsRefreshInProgress = false;
    boolean loginSuccessful = false;
    public boolean loginInProgress = false;

    private final IBinder mBinder = new LocalBinder();
    // Random number generator
    private final Random mGenerator = new Random();

    public class LocalBinder extends Binder {
        ZenossPoller getService() {
            return ZenossPoller.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    public int getRandomNumber() {
        return mGenerator.nextInt(100);
    }

    @Override
    public void onLowMemory() {
        //These could be quite large
        EventsObject = null;
        Events = null;
        CriticalList = "";

        if (listOfZenossEvents != null)
            listOfZenossEvents.clear();
    }

    public void PrepAPI(Boolean Login, Boolean inThread) {
        //There are some minor differences here
        if (null != settings) {
            if (settings.getBoolean(ZenossAPI.PREFERENCE_IS_ZAAS, false)) {
                //Log.e("PrepAPI","Am ZAAS");
                API = new ZenossAPIZaas();
            } else {
                //Log.e("PrepAPI","Am not ZAAS");
                API = new ZenossAPICore();
            }
        } else {
            //Screw it
            API = new ZenossAPICore();
        }

        if (Login) {
            if (inThread) {
                ZenossCredentials credentials = new ZenossCredentials(ZenossPoller.this);
                try {
                    loginSuccessful = API.Login(credentials);
                } catch (Exception e) {
                    e.printStackTrace();
                    BugSenseHandler.sendExceptionMessage("ZenossPoller", "PrepAPI", e);
                    loginSuccessful = false;
                }
            } else {
                (new Thread() {
                    public void run() {
                        ZenossCredentials credentials = new ZenossCredentials(ZenossPoller.this);

                        if (!credentials.UserName.equals("") && !credentials.URL.equals("")) {
                            try {
                                loginSuccessful = API.Login(credentials);
                            } catch (Exception e) {
                                BugSenseHandler.sendExceptionMessage("ZenossPoller", "PrepAPI", e);
                                e.printStackTrace();
                                loginSuccessful = false;
                            }
                        } else {
                            //Log.e("ZenossPoller", "No credentials yet");
                        }
                    }
                }).start();
            }
        }
    }

    @Override
    public void onCreate() {
        settings = PreferenceManager.getDefaultSharedPreferences(this);
        //Log.i("ServiceThread","Service Starting");

        BugSenseHandler.initAndStartSession(ZenossPoller.this, "44a76a8c");

        String ns = Context.NOTIFICATION_SERVICE;
        mNM = (NotificationManager) getSystemService(ns);

        PrepAPI(true, false);

        eventsHandler = new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    //onlyAlertOnProd = settings.getBoolean("onlyProductionAlerts", true);
                    EventDetails.clear();

                    Boolean alertsEnabled = settings.getBoolean("AllowBackgroundService", true);
                    if (null != listOfZenossEvents && listOfZenossEvents.size() > 0) {
                        try {
                            EventCount = 0;
                            for (ZenossEvent event : listOfZenossEvents) {
                                if (alertsEnabled && event.isNew()
                                        && ZenossAPI.CheckIfNotify(event.getProdState(), event.getDevice(),
                                                getApplicationContext(),
                                                settings.getBoolean("onlyProductionAlerts", true))) {
                                    EventDetails.add(event.getDevice() + ": " + event.getSummary());
                                    EventCount++;
                                }
                            }

                            if (EventCount > 0) {
                                Notifications.SendPollNotification(EventCount, EventDetails,
                                        getApplicationContext());
                            }
                        } catch (Exception e) {
                            BugSenseHandler.sendExceptionMessage("ZenossPoller", "eventsHandler", e);
                            e.printStackTrace();
                        }
                    } else {
                        //This should never happen but also people should stop using the Poller and move to Rhybudd Push
                    }

                    if (alertsEnabled) {
                        Notifications.SendStickyNotification(getApplicationContext());
                    } else {
                        ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE))
                                .cancel(Notifications.NOTIFICATION_POLLED_STICKY);
                    }
                } else if (msg.what == 999) {
                    //TODO All manner of bad happened
                }

                EventsRefreshInProgress = false;
            }
        };
    }

    @Override
    public void onDestroy() {
        try {
            ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE))
                    .cancel(Notifications.NOTIFICATION_POLLED_STICKY);
        } catch (Exception e) {
            BugSenseHandler.sendExceptionMessage("ZenossPoller", "onDestroy", e);
        }

        //Log.e("ZenossPoller","I GOT DESTROYED WTF?!?!?!?!??!?!?!");
    }

    /*@Override
    public void onStart(Intent intent, int startid) 
    {
       Log.d("Service", "onStart");
    }*/

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null && intent.getBooleanExtra("events", false)) {
            //Log.i("onStartCommand","Received an intent to check for events");
            CheckForEvents();
        }
        /*else if(intent != null && intent.getBooleanExtra("refreshCache", false))
        {
           //Log.i("onStartCommand","Received an intent to refresh the cache");
           RefreshCache();
        }*/
        else if (intent != null && intent.getBooleanExtra("settingsUpdate", false)) {
            //Refresh our reference to the settings just in case something changed
            settings = PreferenceManager.getDefaultSharedPreferences(this);
            //Log.i("onStartCommand","Received an intent from the settings Activity");
            PollerCheck();
        } else {
            //Log.i("onStartCommand","I got started for no particular reason. I should probably do a refresh (but I'm not going too");
            //PollerCheck();
        }

        // If we get killed, after returning from here, restart
        return START_STICKY;
    }

    private void PollerCheck() {
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        Intent Poller = new Intent(this, ZenossPoller.class);

        if (settings.getBoolean("AllowBackgroundService", true)) {
            //Log.i("PollerCheck","Background scanning enabled!");
            Notifications.SendStickyNotification(this);

            Poller.putExtra("events", true);
            PendingIntent Monitoring = PendingIntent.getService(this, 0, Poller, PendingIntent.FLAG_UPDATE_CURRENT);//PendingIntent.FLAG_UPDATE_CURRENT
            am.cancel(Monitoring);
            try {
                am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, (long) 0,
                        Long.parseLong(settings.getString("BackgroundServiceDelay", "60")) * 1000, Monitoring);
            } catch (Exception e) {
                am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, (long) 0, 60000, Monitoring);
                BugSenseHandler.sendExceptionMessage("ZenossPoller", "PollerCheck", e);
            }
        } else {
            //Log.i("PollerCheck","Background scanning disabled!");
            Poller.putExtra("events", true);
            PendingIntent Monitoring = PendingIntent.getService(this, 0, Poller, PendingIntent.FLAG_UPDATE_CURRENT);//PendingIntent.FLAG_UPDATE_CURRENT
            am.cancel(Monitoring);
            mNM.cancel(Notifications.NOTIFICATION_POLLED_STICKY);
        }

        /*if(settings.getBoolean("refreshCache", true))
        {
           //Log.i("PollerCheck","Background cache refresh enabled!");
               
           Poller.putExtra("refreshCache", true);
           PendingIntent CacheRefresh = PendingIntent.getService(this, 1, Poller, PendingIntent.FLAG_UPDATE_CURRENT);
           am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 10000, AlarmManager.INTERVAL_HOUR, CacheRefresh);
        }
        else
        {
           //Log.i("PollerCheck","Background cache refresh disabled!");
           Poller.putExtra("refreshCache", true);
           PendingIntent CacheRefresh = PendingIntent.getService(this, 1, Poller, PendingIntent.FLAG_UPDATE_CURRENT);
           am.cancel(CacheRefresh);
        }*/

        //We use a SyncAdapter now like good citizens
        try {
            if (settings.getBoolean("refreshCache", true)) {
                Poller.putExtra("refreshCache", true);
                PendingIntent CacheRefresh = PendingIntent.getService(this, 1, Poller,
                        PendingIntent.FLAG_UPDATE_CURRENT);
                am.cancel(CacheRefresh);
                SharedPreferences.Editor editor = settings.edit();
                editor.putBoolean("refreshCache", false);
                editor.commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
            BugSenseHandler.sendExceptionMessage("ZenossPoller", "cancel refresh cache poller", e);
        }
    }

    /*private void RefreshCache()
    {
       (new Thread(){
     public void run()
     {
        try 
        {
        
                ZenossCredentials credentials = new ZenossCredentials(ZenossPoller.this);
                loginSuccessful = API.Login(credentials);
        
           List<ZenossDevice> listOfZenossDevices = API.GetRhybuddDevices();
               
           if(listOfZenossDevices != null && listOfZenossDevices.size() > 0)
           {
                    RhybuddDataSource datasource = new RhybuddDataSource(ZenossPoller.this);
                    datasource.open();
                    datasource.UpdateRhybuddDevices(listOfZenossDevices);
                    datasource.close();
        
                    ZenossAPI.updateLastChecked(ZenossPoller.this);
           }
           else
           {
           }
               
        } 
        catch (Exception e) 
        {
                BugSenseHandler.sendExceptionMessage("ZenossPoller","onDestroy",e);
        }
     }
       }).start();
    }*/

    private void CheckForEvents() {
        if (EventsRefreshInProgress) {
            //Log.i("CheckForEvents","Lock flag in place, skipping this iteration");
            return;
        }
        //Flag must have been false let's set it!
        EventsRefreshInProgress = true;

        EventCount = 0;
        ((Thread) new Thread() {
            public void run() {
                if (listOfZenossEvents != null)
                    listOfZenossEvents.clear();

                try {
                    if (API == null) {
                        PrepAPI(true, true);
                    }

                    ZenossCredentials credentials = new ZenossCredentials(ZenossPoller.this);
                    loginSuccessful = API.Login(credentials);

                    listOfZenossEvents = API.GetRhybuddEvents(ZenossPoller.this);

                    if (listOfZenossEvents != null && listOfZenossEvents.size() > 0) {
                        eventsHandler.sendEmptyMessage(1);

                        RhybuddDataSource datasource = new RhybuddDataSource(ZenossPoller.this);
                        datasource.open();
                        datasource.UpdateRhybuddEvents(listOfZenossEvents);
                        datasource.close();
                    }
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                    BugSenseHandler.sendExceptionMessage("ZenossPoller", "CheckForEvents", e);
                } catch (JSONException e) {
                    e.printStackTrace();
                    BugSenseHandler.sendExceptionMessage("ZenossPoller", "CheckForEvents", e);
                } catch (IOException e) {
                    e.printStackTrace();
                    BugSenseHandler.sendExceptionMessage("ZenossPoller", "CheckForEvents", e);
                } catch (Exception e) {
                    e.printStackTrace();
                    BugSenseHandler.sendExceptionMessage("ZenossPoller", "CheckForEvents", e);
                } finally {
                    EventsRefreshInProgress = false;
                }
            }
        }).start();
    }
}