org.exoplatform.social.extras.feedmash.AbstractFeedmashJob.java Source code

Java tutorial

Introduction

Here is the source code for org.exoplatform.social.extras.feedmash.AbstractFeedmashJob.java

Source

/*
 * Copyright (C) 2003-2010 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero 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 org.exoplatform.social.extras.feedmash;

import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import java.util.List;

import org.exoplatform.container.ExoContainer;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.social.core.activity.model.ExoSocialActivity;
import org.exoplatform.social.core.activity.model.ExoSocialActivityImpl;
import org.exoplatform.social.core.identity.model.Identity;
import org.exoplatform.social.core.manager.ActivityManager;
import org.exoplatform.social.core.manager.IdentityManager;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.google.common.collect.Lists;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
import com.sun.syndication.io.impl.Base64;

public abstract class AbstractFeedmashJob implements Job {

    private static final Log LOG = ExoLogger.getLogger(AbstractFeedmashJob.class);

    protected static final String LAST_CHECKED = "lastChecked";

    protected String targetActivityStream;

    protected String portalContainer;

    protected String feedUrl;

    protected Integer rampup = 1;

    protected String pluginName;

    protected String feedLastCheck;

    protected String username;

    protected String password;

    /**
     * Feedmash job. Provides support for fetching the job. Lets subclasses filter
     * and process the matching entries.
     */
    @SuppressWarnings("unchecked")
    public void execute(JobExecutionContext context) throws JobExecutionException {
        try {
            JobDataMap dataMap = context.getJobDetail().getJobDataMap();

            // read job settings
            init(dataMap);

            // make sure server has finished starting
            if (severIsStarting(dataMap)) {
                return;
            }

            // let subclass do something before proceeding
            beforeJobExecute(dataMap);

            // Read the feed
            SyndFeedInput input = new SyndFeedInput();

            URLConnection urlConnection = null;
            URL url = new URL(feedUrl);
            if (url.getUserInfo() != null) {
                byte[] authEncBytes = Base64.encode(url.getUserInfo().getBytes());
                String authStringEnc = new String(authEncBytes);
                urlConnection = url.openConnection();
                urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
            } else if (username != null && password != null) {
                byte[] authEncBytes = Base64.encode((username + ":" + password).getBytes());
                String authStringEnc = new String(authEncBytes);
                urlConnection = url.openConnection();
                urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
            } else {
                urlConnection = url.openConnection();
            }

            InputStream is = urlConnection.getInputStream();
            SyndFeed feed = input.build(new XmlReader(is));
            List<SyndEntryImpl> entries = feed.getEntries();

            // process what we are interested in
            for (SyndEntryImpl entry : Lists.reverse(entries)) {
                if (accept(entry)) {
                    handle(entry);
                }
            }
        } catch (Exception e) {
            throw new JobExecutionException(e);
        }

    }

    protected abstract void handle(SyndEntryImpl entry);

    protected abstract boolean accept(SyndEntryImpl entry);

    public void beforeJobExecute(JobDataMap dataMap) {
        // void by default
    }

    protected Object getState(String key) {
        String uniqueKey = getStateKey(key);
        return getExoComponent(MashupStateHolder.class).getState(uniqueKey);
    }

    protected void saveState(String key, Object state) {
        String uniqueKey = getStateKey(key);
        getExoComponent(MashupStateHolder.class).saveState(uniqueKey, state);
    }

    protected String getStateKey(String key) {
        return pluginName + "." + key;
    }

    protected boolean alreadyChecked(Date date) {
        Date lastChecked = (Date) getState(feedLastCheck);
        if (lastChecked == null) {
            return false; // case never checked
        } else {
            return !lastChecked.before(date);
        }
    }

    @SuppressWarnings("unchecked")
    protected <T> T getExoComponent(Class<T> type) {
        ExoContainer container = ExoContainerContext.getContainerByName(portalContainer);
        ExoContainerContext.setCurrentContainer(container);
        return (T) container.getComponentInstanceOfType(type);
    }

    /**
     * Publish an activity
     *
     * @param message body of the activity
     * @param from owner of the activity
     * @param to target of the activity
     * @throws Exception
     */
    protected void publishActivity(String message, Identity from, Identity to) throws Exception {

        ExoSocialActivity activity = new ExoSocialActivityImpl();
        activity.setTitle(message);
        activity.setAppId("feedmash:" + getClass());
        activity.setUserId(from.getId());

        ActivityManager activityManager = getExoComponent(ActivityManager.class);
        activityManager.saveActivityNoReturn(to, activity);

    }

    protected Identity getIdentity(String targetUser) {
        Identity identity = null;
        String[] identityInfo = null;
        try {
            if (targetUser != null && targetUser.split(":").length == 2) {
                identityInfo = targetUser.split(":");
            } else {
                throw new Exception();
            }
            IdentityManager identityManager = getExoComponent(IdentityManager.class);
            identity = identityManager.getOrCreateIdentity(identityInfo[0], identityInfo[1], false);
        } catch (Exception e) {
            LOG.warn("Could not find identity for " + targetUser + ": " + e.getMessage());
        }
        return identity;
    }

    protected String getStringParam(JobDataMap dataMap, String name, String defaultValue) {
        String value = dataMap.getString(name);
        return (value == null) ? defaultValue : value;
    }

    protected Identity getAppIdentity(Application app) throws Exception {

        IdentityManager identityManager = getExoComponent(IdentityManager.class);
        // appExists(app, identityManager);

        ApplicationsIdentityProvider appIdentityProvider = new ApplicationsIdentityProvider();
        appIdentityProvider.addApplication(app);
        identityManager.addIdentityProvider(appIdentityProvider);
        Identity identity = identityManager.getOrCreateIdentity(ApplicationsIdentityProvider.NAME, app.getId(),
                true);
        return identity;
    }

    private void init(JobDataMap dataMap) {
        pluginName = dataMap.getString("pluginName");
        targetActivityStream = dataMap.getString("targetActivityStream");
        portalContainer = dataMap.getString("portalContainer");
        feedUrl = dataMap.getString("feedURL");
        username = dataMap.getString("username");
        password = dataMap.getString("password");
    }

    private boolean severIsStarting(JobDataMap dataMap) {
        // hack to before actually starting working otherwise picketlink fails
        if (rampup > 1) {
            --rampup;
            LOG.debug("waiting #" + rampup);
            return true;
        }

        return false;
    }

}