// **********************************************************************
//
// Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
package IceGridGUI.LiveDeployment;

import java.awt.Component;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import java.util.Enumeration;

import IceGrid.*;
import IceGridGUI.*;

class Service extends ListArrayTreeNode
{
    public Component getTreeCellRendererComponent(
	    JTree tree,
	    Object value,
	    boolean sel,
	    boolean expanded,
	    boolean leaf,
	    int row,
	    boolean hasFocus) 
    {
	if(_cellRenderer == null)
	{
	    _cellRenderer = new DefaultTreeCellRenderer();
	    _cellRenderer.setOpenIcon(
		Utils.getIcon("/icons/16x16/service.png"));

	    _cellRenderer.setClosedIcon(
		Utils.getIcon("/icons/16x16/service.png"));
	}

	return _cellRenderer.getTreeCellRendererComponent(
	    tree, value, sel, expanded, leaf, row, hasFocus);
    }

    public Editor getEditor()
    {
	if(_editor == null)
	{
	    _editor = new ServiceEditor();
	}
	_editor.show(this);
	return _editor;
    }


    Service(Server parent, String serviceName, Utils.Resolver resolver,
	    ServiceInstanceDescriptor descriptor, 
	    ServiceDescriptor serviceDescriptor)
    {
	super(parent, serviceName, 2);
	_resolver = resolver;
	
	_instanceDescriptor = descriptor;
	_serviceDescriptor = serviceDescriptor;
	
	_childrenArray[0] = _adapters;
	_childrenArray[1] = _dbEnvs;

	createAdapters();
	createDbEnvs();
    }

    boolean updateAdapter(AdapterDynamicInfo info)
    {
	java.util.Iterator p = _adapters.iterator();
	while(p.hasNext())
	{
	    Adapter adapter = (Adapter)p.next();
	    if(adapter.update(info))
	    {
		return true;
	    }
	}
	return false;
    }

    int updateAdapters(java.util.List infoList)
    {
	int result = 0;
	java.util.Iterator p = _adapters.iterator();
	while(p.hasNext() && result < infoList.size())
	{
	    Adapter adapter = (Adapter)p.next();
	    if(adapter.update(infoList))
	    {
		result++;
	    }
	}
	return result;
    }

    void nodeDown()
    {
	java.util.Iterator p = _adapters.iterator();
	while(p.hasNext())
	{
	    Adapter adapter = (Adapter)p.next();
	    adapter.update((AdapterDynamicInfo)null);
	}
    }

    Utils.Resolver getResolver()
    {
	return _resolver;
    }

    ServiceDescriptor getServiceDescriptor()
    {
	return _serviceDescriptor;
    }

    ServiceInstanceDescriptor getInstanceDescriptor()
    {
	return _instanceDescriptor;
    }

    java.util.SortedMap getProperties()
    {
	Utils.ExpandedPropertySet instancePropertySet = null;
	Node node = (Node)_parent.getParent();

	String applicationName = ((Server)_parent).getApplication().name;

	if(_instanceDescriptor != null)
	{
	    instancePropertySet = node.expand(_instanceDescriptor.propertySet, 
					      applicationName, _resolver);
	}

	Utils.ExpandedPropertySet propertySet = 
	    node.expand(_serviceDescriptor.propertySet,
			applicationName, _resolver);

	return Utils.propertySetToMap(propertySet, instancePropertySet, _resolver);
    }

    private void createAdapters()
    {
	java.util.Iterator p = _serviceDescriptor.adapters.iterator();
	while(p.hasNext())
	{
	    AdapterDescriptor descriptor = (AdapterDescriptor)p.next();
	    String adapterName = Utils.substitute(descriptor.name, _resolver);
	    
	    String adapterId = Utils.substitute(descriptor.id, _resolver);
	    Ice.ObjectPrx proxy = null;
	    if(adapterId.length() > 0)
	    {
		proxy = ((Node)_parent.getParent()).getProxy(adapterId);
	    }
	    
	    insertSortedChild(
		new Adapter(this, adapterName, 
			    _resolver, adapterId, descriptor, proxy),
		_adapters, null);
	}
    }
    
    private void createDbEnvs()
    {
	java.util.Iterator p = _serviceDescriptor.dbEnvs.iterator();
	while(p.hasNext())
	{
	    DbEnvDescriptor descriptor = (DbEnvDescriptor)p.next();
	    String dbEnvName = Utils.substitute(descriptor.name, _resolver);
	    insertSortedChild(
		new DbEnv(this, dbEnvName, _resolver, descriptor), _dbEnvs, null);
	}
    }    

    private ServiceInstanceDescriptor _instanceDescriptor;
    private ServiceDescriptor _serviceDescriptor;
    private Utils.Resolver _resolver;

    private java.util.List _adapters = new java.util.LinkedList();
    private java.util.List _dbEnvs = new java.util.LinkedList();

    static private ServiceEditor _editor;
    static private DefaultTreeCellRenderer _cellRenderer;   
}
