/*
 * weinre is available under *either* the terms of the modified BSD license *or* the
 * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
 * 
 * Copyright (c) 2010, 2011 IBM Corporation
 */

package weinre.server;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.apache.wink.json4j.JSONArray;
import org.apache.wink.json4j.JSONException;
import org.apache.wink.json4j.JSONObject;

//-------------------------------------------------------------------
public class Target extends Connector {

    private List<Client> connectedClients;
    private String       url;
    
    //---------------------------------------------------------------
    public Target(Channel channel, String url) {
        super(channel);
        
        connectedClients = new ArrayList<Client>();
        this.url = url;
        _register();

    }
    
    //---------------------------------------------------------------
    public String getURL() {
        return this.url;
    }
    
    //---------------------------------------------------------------
    public boolean isTarget() {
        return true;
    }
    
    //---------------------------------------------------------------
    public List<Client> getConnectedClients() {
        List<Client> result = new LinkedList<Client>();
        
        Lock.lock();
        try {
            result.addAll(connectedClients);
        }
        finally {
            Lock.unlock();
        }
        
        return result;
    }
    
    //---------------------------------------------------------------
    protected void _connect(Client client) {
        if (null == client) return;
        
        Lock.lock();
        
        try {
            if (connectedClients.contains(client)) return;
        
            connectedClients.add(client);
        }
        finally {
            Lock.unlock();
        }
    }
    
    //---------------------------------------------------------------
    protected void _disconnect(Client client) {
        if (null == client) return;
        
        Lock.lock();
        
        try {
            if (!connectedClients.contains(client)) return;

            connectedClients.remove(client);
        }
        finally {
            Lock.unlock();
        }
    }

    //---------------------------------------------------------------
    public JSONObject getDescription() {
        JSONObject result = new JSONObject();
        
        try {
            result.put("id",                 getChannel().getName());
            result.put("hostName",           getChannel().getRemoteHost());
            result.put("url",                this.url);
            result.put("connectedClientIds", new JSONArray());
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }
        
        return result;
    }
    
}
