com.freedomotic.plugins.devices.push.Push.java Source code

Java tutorial

Introduction

Here is the source code for com.freedomotic.plugins.devices.push.Push.java

Source

/**
 *
 * Copyright (c) 2009-2016 Freedomotic team http://freedomotic.com
 *
 * This file is part of Freedomotic
 *
 * 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 2, 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
 * Freedomotic; see the file COPYING. If not, see
 * <http://www.gnu.org/licenses/>.
 */
package com.freedomotic.plugins.devices.push;

import com.freedomotic.api.EventTemplate;
import com.freedomotic.api.Protocol;
import com.freedomotic.events.MessageEvent;
import com.freedomotic.exceptions.UnableToExecuteException;
import com.freedomotic.reactions.Command;
import com.freedomotic.rules.Statement;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.lang.text.StrSubstitutor;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClientBuilder;

public class Push extends Protocol {

    private static final Logger LOG = Logger.getLogger(Push.class.getName());
    private final HashMap<String, Integer> tupleMap = new HashMap<>();

    public Push() {
        //every plugin needs a name and a manifest XML file
        super("Push", "/push/push-manifest.xml");
        setPollingWait(-1); //millisecs interval between hardware device status reads

    }

    @Override
    protected void onShowGui() {
    }

    @Override
    protected void onRun() {
    }

    @Override
    protected void onStart() {
        int j = 0;
        for (int i = 0; i < configuration.getTuples().size(); i++) {
            String channel = "app.event.sensor.messages." + configuration.getTuples().getProperty(i, "category")
                    + "." + configuration.getTuples().getProperty(i, "provider");
            tupleMap.put(channel, i);

            if (configuration.getTuples().getBooleanProperty(i, "active", false)) {
                addEventListener(channel);
                j++;
            }
        }
        setDescription("Push plugin: " + j + " providers registered");
    }

    @Override
    protected void onStop() {
        setDescription("Push plugin is stopped ");
    }

    @Override
    protected void onCommand(Command c) throws IOException, UnableToExecuteException {
        MessageEvent mess = new MessageEvent(null, c.getProperty("push.message"));
        mess.setType(c.getProperty("push.category") + "." + c.getProperty("push.provider"));
        // populate event with originating command properties
        for (Entry<Object, Object> entry : c.getProperties().entrySet()) {
            mess.getPayload().addStatement(entry.getKey().toString(), entry.getValue().toString());
        }
        notifyEvent(mess);
    }

    @Override
    protected boolean canExecute(Command c) {
        //don't mind this method for now
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    protected void onEvent(EventTemplate e) {
        try {
            MessageEvent event = (MessageEvent) e;
            int t = tupleMap.get(event.getDefaultDestination());

            URIBuilder ub = new URIBuilder()
                    .setScheme(configuration.getTuples().getStringProperty(t, "scheme", "http"))
                    .setHost(configuration.getTuples().getStringProperty(t, "host", "localhost"))
                    .setPort(configuration.getTuples().getIntProperty(t, "port",
                            configuration.getTuples().getStringProperty(t, "scheme", "http")
                                    .equalsIgnoreCase("https") ? 443 : 80))
                    .setPath(configuration.getTuples().getStringProperty(t, "path", "/"));

            // prepare substitution tokens
            HashMap<String, String> valuesMap = new HashMap<>();
            Iterator<Statement> it = event.getPayload().iterator();
            while (it.hasNext()) {
                Statement s = it.next();
                if (s.getOperand().equalsIgnoreCase(Statement.EQUALS)) {
                    valuesMap.put(s.getAttribute(), s.getValue());
                }
            }
            StrSubstitutor sub = new StrSubstitutor(valuesMap);

            // add extra parameters
            for (String key : configuration.getTuples().getTuple(t).keySet()) {
                if (key.startsWith("param.")) {
                    String toBeReplaced = configuration.getTuples().getStringProperty(t, key, "");
                    // replace default string with the one provided into payload
                    if (event.getPayload().getStatementValue(key) != null
                            && !event.getPayload().getStatementValue(key).isEmpty()) {
                        toBeReplaced = event.getPayload().getStatementValue(key);
                    }
                    // do substitutions
                    String resolvedString = sub.replace(toBeReplaced);

                    ub.setParameter(key.substring(6), resolvedString);
                }
            }

            // override default message (with variable substitution) if a new one is specified in MessageEvent.text
            if (event.getText() != null & !event.getText().isEmpty()) {
                ub.setParameter(configuration.getTuples().getStringProperty(t, "mapMessageToParam", "message"),
                        sub.replace(event.getText()));
            }

            LOG.info(ub.build().toString());

            HttpClientBuilder hcb = HttpClientBuilder.create();
            HttpClient client = hcb.build();

            // set http method to use
            HttpRequestBase request;
            if (configuration.getTuples().getStringProperty(t, "method", "get").equalsIgnoreCase("POST")) {
                request = new HttpPost(ub.build());
            } else {
                request = new HttpGet(ub.build());
            }

            int responseCode = client.execute(request).getStatusLine().getStatusCode();
            LOG.info("Push request got code: " + responseCode);

        } catch (URISyntaxException | IOException ex) {
            LOG.log(Level.SEVERE, null, ex);
        }
    }
}