/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.enterprise.server.plugins.alertMicroblog;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.enterprise.server.plugin.pc.ControlFacet;
import org.rhq.enterprise.server.plugin.pc.ControlResults;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
import org.rhq.enterprise.server.plugin.pc.alert.CustomAlertSenderBackingBean;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
/**
* Microblog Server Plugin Component
*
* @author Rafael Soares
*
*/
public class MicroblogServerPluginComponent extends CustomAlertSenderBackingBean implements ServerPluginComponent,
ControlFacet {
private Twitter twitter;
private RequestToken requestToken;
private final Log log = LogFactory.getLog(MicroblogServerPluginComponent.class);
private ServerPluginContext context;
public void initialize(ServerPluginContext context) throws Exception {
this.context = context;
String consumerKey = this.context.getPluginConfiguration().getSimpleValue("consumerKey", MicroblogSender.CONS_KEY);
String consumerSecret = this.context.getPluginConfiguration().getSimpleValue("consumerSecret", MicroblogSender.CONS_SECRET);
if (consumerKey == null || consumerSecret == null)
throw new TwitterException(
"consumerKey or consumerSecret missing. Please configure the Microblog plugin before.");
// The factory instance is re-useable and thread safe.
this.twitter = new TwitterFactory().getInstance();
this.twitter.setOAuthConsumer(consumerKey, consumerSecret);
log.debug("Twitter using consumerKey [" + consumerKey + "] and consumerSecret: [" + consumerSecret + "]");
}
private String getAuthorizationURL() throws TwitterException {
RequestToken requestToken = twitter.getOAuthRequestToken();
log.info("Open the following URL and grant access to your account: " + requestToken.getAuthorizationURL());
return requestToken.getAuthorizationURL();
}
private String storeAccessToken(AccessToken token) throws IOException {
//use buffering
String filePath = null;
if (this.context.getDataDirectory().exists() || this.context.getDataDirectory().mkdir()) {
filePath = this.context.getDataDirectory().getAbsolutePath() + "/OAuthAccessToken_" + token.getUserId() + ".ser";
// merge the PLugin Configuration to store the token file path reference.
// this property will be user by Microblog AlertSender to load the accessToken from file system
this.context.getPluginConfiguration().put(new PropertySimple("accessTokenFilePath", filePath));
this.persistConfiguration(this.context.getPluginConfiguration());
OutputStream file = new FileOutputStream(filePath);
OutputStream buffer = new BufferedOutputStream(file);
ObjectOutput output = new ObjectOutputStream(buffer);
try {
output.writeObject(token);
} finally {
output.close();
log.info("AccessToken saved at " + filePath);
}
} else
throw new IOException("AccessToken not stored!");
return filePath;
}
@Override
public ControlResults invoke(String controlOperation, Configuration operationConfig) {
ControlResults ctrlResult = new ControlResults();
try {
if (controlOperation.equals("GET_OAUTH_REQUEST_URL")) {
// get and store AuthURL in plugin config to be rederend on UI
ctrlResult.getComplexResults().put(new PropertySimple("authorizationURL", getAuthorizationURL()));
} else if (controlOperation.equals("GET_ACCESS_TOKEN")) {
AccessToken accessToken = null;
String pin = operationConfig.getSimpleValue("pin", null);
log.debug("using PIN [" + pin + "]");
if (pin != null && pin.length() > 0) {
accessToken = this.twitter.getOAuthAccessToken(requestToken, pin);
} else {
accessToken = this.twitter.getOAuthAccessToken();
}
log.debug("ScreenName: " + twitter.getScreenName());
log.debug("TwitterId: [" + twitter.verifyCredentials().getId() + "]");
log.debug("token: [" + accessToken.getToken() + "]");
log.debug("tokenSecret: [" + accessToken.getTokenSecret() + "]");
// Save the accessToken for future use by this plugin.
String filePath = storeAccessToken(accessToken);
ctrlResult.getComplexResults().put(
new PropertySimple("accessToken", "token[" + accessToken.getToken() + "] tokenSecret["
+ accessToken.getTokenSecret() + ""));
ctrlResult.getComplexResults().put(new PropertySimple("twitterScreenName", twitter.getScreenName()));
ctrlResult.getComplexResults().put(new PropertySimple("accessTokenFilePath", filePath));
} else {
ctrlResult.setError("Invalid Operation! Please Select a valid one.");
}
} catch (TwitterException te) {
log.error("Twitter Error: ", te);
ctrlResult.setError(te);
} catch (IOException ioe) {
log.error("Error storing AccessToken: ", ioe);
ctrlResult.setError(ioe);
}
return ctrlResult;
}
@Override
public void start() {
// TODO Auto-generated method stub
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
@Override
public void shutdown() {
}
}