/*
* Copyright (c) 2011 Enrico Franchi, Michele Tomaiuolo and University of Parma.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package net.blogracy.controller;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.security.InvalidParameterException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import net.blogracy.config.Configurations;
import net.blogracy.util.FileUtils;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.commons.codec.binary.Base32;
import org.apache.shindig.protocol.conversion.BeanConverter;
import org.apache.shindig.protocol.conversion.BeanJsonConverter;
import org.apache.shindig.social.core.model.ActivityEntryImpl;
import org.apache.shindig.social.core.model.ActivityObjectImpl;
import org.apache.shindig.social.core.model.AlbumImpl;
import org.apache.shindig.social.core.model.MediaItemImpl;
import org.apache.shindig.social.opensocial.model.ActivityEntry;
import org.apache.shindig.social.opensocial.model.ActivityObject;
import org.apache.shindig.social.opensocial.model.Album;
import org.apache.shindig.social.opensocial.model.MediaItem;
import org.apache.shindig.social.opensocial.model.MediaItem.Type;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Module;
import com.google.inject.name.Names;
/**
* Generic functions to manipulate feeds are defined in this class.
*/
public class ActivitiesController {
static final DateFormat ISO_DATE_FORMAT = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss'Z'");
static final String CACHE_FOLDER = Configurations.getPathConfig()
.getCachedFilesDirectoryPath();
private static final FileSharing sharing = FileSharing.getSingleton();
private static final DistributedHashTable dht = DistributedHashTable
.getSingleton();
private static final ActivitiesController theInstance = new ActivitiesController();
private static BeanJsonConverter CONVERTER = new BeanJsonConverter(
Guice.createInjector(new Module() {
@Override
public void configure(Binder b) {
b.bind(BeanConverter.class)
.annotatedWith(
Names.named("shindig.bean.converter.json"))
.to(BeanJsonConverter.class);
}
}));
public static ActivitiesController getSingleton() {
return theInstance;
}
public ActivitiesController() {
ISO_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
}
static public List<ActivityEntry> getFeed(String user) {
List<ActivityEntry> result = new ArrayList<ActivityEntry>();
System.out.println("Getting feed: " + user);
JSONObject record = dht.getRecord(user);
if (record != null) {
try {
String latestHash = FileSharing.getHashFromMagnetURI(record
.getString("uri"));
File dbFile = new File(CACHE_FOLDER + File.separator
+ latestHash + ".json");
if (!dbFile.exists() && record.has("prev")) {
latestHash = FileSharing.getHashFromMagnetURI(record
.getString("prev"));
dbFile = new File(CACHE_FOLDER + File.separator
+ latestHash + ".json");
}
if (dbFile.exists()) {
System.out.println("Getting feed: "
+ dbFile.getAbsolutePath());
JSONObject db = new JSONObject(new JSONTokener(
new FileReader(dbFile)));
JSONArray items = db.getJSONArray("items");
for (int i = 0; i < items.length(); ++i) {
JSONObject item = items.getJSONObject(i);
ActivityEntry entry = (ActivityEntry) CONVERTER
.convertToObject(item, ActivityEntry.class);
result.add(entry);
}
System.out.println("Feed loaded");
} else {
System.out.println("Feed not found");
}
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
public void addFeedEntry(String id, String text, File attachment) {
try {
String hash = sharing.hash(text);
File textFile = new File(CACHE_FOLDER + File.separator + hash
+ ".txt");
FileWriter w = new FileWriter(textFile);
w.write(text);
w.close();
String textUri = sharing.seed(textFile);
String attachmentUri = null;
if (attachment != null) {
attachmentUri = sharing.seed(attachment);
}
final List<ActivityEntry> feed = getFeed(id);
final ActivityEntry entry = new ActivityEntryImpl();
entry.setVerb("post");
entry.setUrl(textUri);
entry.setPublished(ISO_DATE_FORMAT.format(new Date()));
entry.setContent(text);
if (attachment != null) {
ActivityObject enclosure = new ActivityObjectImpl();
enclosure.setUrl(attachmentUri);
entry.setObject(enclosure);
}
feed.add(0, entry);
String feedUri = seedActivityStream(id, feed);
DistributedHashTable.getSingleton().store(id, feedUri,
entry.getPublished());
} catch (Exception e) {
e.printStackTrace();
}
}
public String seedActivityStream(String userId,
final List<ActivityEntry> feed) throws JSONException, IOException {
final File feedFile = new File(CACHE_FOLDER + File.separator + userId
+ ".json");
JSONArray items = new JSONArray();
for (int i = 0; i < feed.size(); ++i) {
JSONObject item = new JSONObject(feed.get(i));
items.put(item);
}
JSONObject db = new JSONObject();
db.put("items", items);
FileWriter writer = new FileWriter(feedFile);
db.write(writer);
writer.close();
String feedUri = sharing.seed(feedFile);
return feedUri;
}
}