/*
* "Copyright (c) 2010-11 The Regents of the University of California.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose, without fee, and without written agreement is
* hereby granted, provided that the above copyright notice, the following
* two paragraphs and the author appear in all copies of this software.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
* CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
*
* Author: Jorge Ortiz (jortiz@cs.berkeley.edu)
* IS4 release version 1.0
*/
package is4;
import java.net.URL;
import java.util.List;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.util.UUID;
import java.util.ArrayList;
import local.rest.proxy.ProxyInternal;
import java.io.Serializable;
/**
* Internally used, subscriber object.
*/
public class Subscriber implements Serializable{
private UUID subscriberID = null;
private URL url_ = null;
private String subname = null;
private List<UUID> streams_ = (List<UUID>)new ArrayList<UUID>();
private ProxyInternal proxy = null;
private transient final Logger logger = Logger.getLogger(Subscriber.class.getPackage().getName());
public Subscriber(String name, String subId, URL url, List<String> streams){
subname = name;
url_ = url;
setup(subId, streams);
logger.info("Created Subscriber: (" + name + ", " + subId + ", " +
url.toString() + ", " + streams + ")");
}
public Subscriber(String subId, URL url, List<String> streams){
url_ = url;
setup(subId, streams);
logger.info("Created Subscriber: (" + subId + ", " +
url.toString() + ", " + streams + ")");
}
public Subscriber(String subId, URL proxyUrl, List<String> streams, boolean proxyEnabled) throws NullPointerException{
setup(subId, streams);
//start the proxy process
//System.out.println("Starting Proxy");
logger.info("Starting Proxy for subscriber " + subId);
try{
proxy = new ProxyInternal(proxyUrl);
//proxy.start();
//Runtime runtime = Runtime.getRuntime();
String javahome = System.getenv("JAVAHOME");
String HOST = proxyUrl.getHost();
int PORT = (proxyUrl.getPort()>0)?proxyUrl.getPort():80;
logger.info(javahome + " local.rest.proxy.Proxy " + HOST + " " + PORT );
//runtime.exec(javahome + " local.rest.proxy.Proxy " + HOST + " " + PORT );
} catch(Exception e){
logger.log(Level.WARNING, "", e);
}
}
public static void main(String[] args){
try{
ArrayList<String> streams = new ArrayList<String>();
for(int i=0; i<10; i++)
streams.add(UUID.randomUUID().toString());
Subscriber testSub1 = new Subscriber("test1", UUID.randomUUID().toString(),new URL("http://localhost:8082"), streams);
Subscriber testSub2 = new Subscriber(UUID.randomUUID().toString(), new URL("http://localhost:8083"), streams);
Subscriber testSub3 = new Subscriber(UUID.randomUUID().toString(), new URL("http://localhost:8083"), streams, true);
System.out.println("testSub1:\n" + testSub1.toString());
System.out.println("\n\ntestSub2:\n" + testSub2.toString());
System.out.println("\n\ntestSub3:\n" + testSub3.toString());
Thread.sleep(1000 * 10);
} catch(Exception e){
e.printStackTrace();
}
}
public String toString(){
StringBuffer objStrBuf = new StringBuffer();
objStrBuf.append("[name=");
if(subname!=null)
objStrBuf.append(subname);
else
objStrBuf.append("none");
objStrBuf.append(",\nident=").append(subscriberID);
//URL
objStrBuf.append(",\nurl=");
if(url_!=null)
objStrBuf.append(url_.toString());
else
objStrBuf.append("none");
//publisher/stream information
objStrBuf.append(",\nstream_ids=[");
if(streams_.size()>0){
for(int i=0; i<streams_.size(); i++) {
objStrBuf.append("\n\t").append(streams_.get(i));
if(i<streams_.size()-1)
objStrBuf.append(",");
}
} else {
objStrBuf.append("null");
}
objStrBuf.append("\n\t],\n");
//Proxy Information
objStrBuf.append("ProxyEnabled=");
if(proxy != null){
objStrBuf.append("true");
objStrBuf.append("\n,Proxy URL=").append(proxy.getProxyUrl().toString());
}
else {
objStrBuf.append("false");
}
//close it out and return the string
objStrBuf.append("\n];");
return objStrBuf.toString();
}
private void setup(String subId, List<String> streams){
int k=-1;
try {
subscriberID = UUID.fromString(subId);
for(int i=0; i<streams.size(); i++) {
k=i;
streams_.add(UUID.fromString(streams.get(i)));
logger.info("Subscriber: " + subId + ", added stream: " + streams.get(i));
}
} catch(IllegalArgumentException e){
String msg=null;
if (k<0){
msg = "Could not create Subscriber object; Subscriber id " + subId + " is an invalid UUID";
logger.log(Level.WARNING, msg, e);
} else{
msg = "Could not create Subscriber object; Stream id " + streams.get(k) + " is an invalid UUID";
logger.log(Level.WARNING, msg, e);
}
}
catch(Exception e){
logger.log(Level.SEVERE, "Unknown error has occurred", e);
}
}
public String getName(){
return subname;
}
public void setName(String name){
subname = name;
}
public URL getSubUrl(){
return url_;
}
public void setSubUrl(URL url){
url_ = url;
}
public List<String> getSubStreamIds(){
ArrayList<String> strms = new ArrayList<String>();
logger.info("getSubStreamIds: streams_.size()=" + streams_.size());
for (int i=0; i<streams_.size(); i++)
strms.add(streams_.get(i).toString());
logger.info("returning: " + strms);
return strms;
}
public String getSubId(){
return subscriberID.toString();
}
public void addStream(String pid){
try {
streams_.add(UUID.fromString(pid));
} catch (IllegalArgumentException e){
logger.log(Level.WARNING, "Could not add stream id " + pid + "; Invalid UUID",e);
}
}
public void removeStream(String pid){
try {
streams_.remove(UUID.fromString(pid));
} catch (IllegalArgumentException e){
logger.log(Level.WARNING, "Could not remove stream id " + pid + "; Invalid UUID", e);
}
}
//Proxy Functions
/**
* Sets the internal proxy for this subscriber.
*/
public void setProxyBuffer(ProxyInternal p){
proxy=p;
}
/**
* Unsets the internal proxy for this subscriber.
*/
public void unsetProxyBuffer(){
proxy.stop();
proxy=null;
}
public boolean usesProxy(){
if(proxy!=null)
return true;
return false;
}
public URL getProxyUrl(){
return proxy.getProxyUrl();
}
}