package com.robonobo.core.service; import static com.robonobo.common.util.CodeUtil.*; import java.util.*; import com.robonobo.core.api.model.Stream; import com.robonobo.core.metadata.AbstractMetadataService; import com.robonobo.core.metadata.StreamCallback; public class StreamService extends AbstractService { AbstractMetadataService metadata; DbService db; public StreamService() { addHardDependency("core.metadata"); addHardDependency("core.db"); } @Override public String getName() { return "Stream Service"; } @Override public String getProvides() { return "core.streams"; } @Override public void startup() throws Exception { metadata = rbnb.getMetadataService(); db = rbnb.getDbService(); } @Override public void shutdown() throws Exception { // Do nothing } /** * This will only return a stream if it has already been looked up from the metadata service - to do this, call * fetchStreams() in this class - don't call the metadata service directly */ public Stream getKnownStream(String sid) { return db.getStream(sid); } public void putStream(Stream s) { db.putStream(s); metadata.putStream(s, null); } /** * Fetches metadata from our remote metadata service. Returns immediately - if you want to be informed when the * stream has been fetched, pass in a handler */ public void fetchStreams(Collection<String> sids, StreamCallback handler) { List<String> lookupSids = new ArrayList<String>(); for (String sid : sids) { Stream s = getKnownStream(sid); if(s == null) lookupSids.add(sid); else if (handler != null) handler.success(s); } if(lookupSids.size() > 0) metadata.fetchStreams(lookupSids, new AddToDbHandler(handler)); } class AddToDbHandler implements StreamCallback { StreamCallback onwardHandler; public AddToDbHandler(StreamCallback onwardHandler) { this.onwardHandler = onwardHandler; } public void success(Stream s) { db.putStream(s); if(onwardHandler != null) onwardHandler.success(s); } public void error(String streamId, Exception ex) { log.error("Caught "+shortClassName(ex.getClass())+" fetching stream from metadataservice:"+ex.getMessage()); if(onwardHandler != null) onwardHandler.error(streamId, ex); } } }