/*
 * 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 com.phonegap.weinre.server;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.apache.wink.json4j.JSONObject;

/**
 * 
 */
abstract public class Connector {

    static final protected Lock Lock = new ReentrantLock();
    
    private Channel channel;
    
    /**
     * 
     */
    public Connector(Channel channel) {
        super();
        
        this.channel = channel;
        channel._setConnector(this);
    }
    
    /**
     * 
     */
    protected void _register() {
        if (isClient()) ConnectionManager.$.addClient((Client) this);
        if (isTarget()) ConnectionManager.$.addTarget((Target) this);
    }
    
    /**
     * 
     */
    public Channel getChannel() {
        return channel;
    }
    
    /**
     * 
     */
    public String getName() {
        return channel.getName();
    }
    
    /**
     * 
     */
    public List<Connector> getConnections() {
        List<Connector> result = new ArrayList<Connector>();
        
        if (isClient()) {
            Connector target = ((Client) this).getConnectedTarget();
            if (null != target) {
                result.add(target);
            }
        }
        
        else if (isTarget()) {
            result.addAll(((Target) this).getConnectedClients());
        }
        
        else {
            throw new RuntimeException("connector which isn't a client or target");
        }
        
        return result;
    }
    
    /**
     * 
     */
    abstract public JSONObject getDescription();
    
    /**
     * 
     */
    public boolean isClosed() {
        return channel.isClosed();
    }
    
    /**
     * 
     */
    public boolean isClient() {
        return false;
    }
    
    /**
     * 
     */
    public boolean isTarget() {
        return false;
    }
    
    /**
     * 
     */
    public String toString() {
        return getClass().getName() + "{" + channel + "}";
    }
}
