package net.fortytwo.twitlogic.larkc; import eu.larkc.core.data.CloseableIterator; import net.fortytwo.twitlogic.TwitLogic; import org.openrdf.model.Literal; import org.openrdf.model.Statement; import org.openrdf.model.URI; import javax.jms.Message; import eu.larkc.core.data.SetOfStatements; import org.openrdf.model.Value; import java.util.Properties; import java.util.logging.Logger; /** * A streaming LarKC plugin which uses Twitter as a real-time data source for RDF statements. * * @author Joshua Shinavier (http://fortytwo.net) */ public class TwitLogicPlugin extends StreamingPlugin { // Configuration properties specific to the TwitLogic LarKC plugin public static final String OVERFLOW_POLICY = "net.fortytwo.twitlogic.larkc.overflowPolicy", QUEUE_CAPACITY = "net.fortytwo.twitlogic.larkc.queueCapacity"; public static final int DEFAULT_QUEUE_CAPACITY = 1000; private static final Logger LOGGER = TwitLogic.getLogger(TwitLogicPlugin.class); private boolean once = false; private final URI pluginName; public TwitLogicPlugin(final URI pluginName) { super(pluginName); this.pluginName = pluginName; } @Override public void onMessage(final Message message) { // Ignore messages for now. } @Override protected void initialiseInternal(final SetOfStatements workflowDescription) { Properties props = propertiesFromStatements(workflowDescription); TwitLogic.setConfiguration(props); } // Note: input is ignored. public SetOfStatements invokeInternal(final SetOfStatements input) { StreamingSetOfStatements s; if (once) { return null; } once = true; return new TwitterStream(findOverflowPolicy()); } public void shutdown() { } private OverflowPolicy findOverflowPolicy() { String v = TwitLogic.getConfiguration().getProperty(OVERFLOW_POLICY, null); OverflowPolicy policy = null == v ? null : OverflowPolicy.valueOf(v); if (null == policy) { policy = OverflowPolicy.DROP_OLDEST; } LOGGER.info("using overflow policy " + policy); return policy; } private Properties propertiesFromStatements(final SetOfStatements statements) { Properties props = new Properties(); CloseableIterator<Statement> iter = statements.getStatements(); try { while (iter.hasNext()) { Statement st = iter.next(); if (st.getSubject().equals(pluginName)) { String p = st.getPredicate().stringValue(); if (p.startsWith("urn:")) { Value v = st.getObject(); if (v instanceof Literal) { String name = p.substring(4); String value = ((Literal) v).getLabel().trim(); props.put(name, value); } } } } } finally { iter.close(); } return props; } }