/*
 *   Copyright 2005 The Apache Software Foundation
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */

package org.apache.felix.jmood;

import java.util.Iterator;
import java.util.Vector;

import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;

import org.apache.felix.jmood.compendium.ConfigAdminManager;
import org.apache.felix.jmood.compendium.ConfigAdminManagerMBean;
import org.apache.felix.jmood.compendium.LogManager;
import org.apache.felix.jmood.compendium.LogManagerMBean;
import org.apache.felix.jmood.compendium.UserManager;
import org.apache.felix.jmood.compendium.UserManagerMBean;
import org.apache.felix.jmood.utils.ObjectNames;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.log.LogService;
import org.osgi.service.useradmin.UserAdmin;


/**
 * This class will control the life-cycle of MBeans related to OSGi Compendium
 * Services
 * 
 * 
 */
public class CompendiumHandler {

    private AgentContext ac;

    private ServiceListener sl;

    private Vector svcs;

    private MBeanServer server;

    public CompendiumHandler(MBeanServer server, AgentContext ac) {
        super();
        this.ac = ac;
        this.server = server;
        svcs = new Vector();
        svcs.add(ConfigurationAdmin.class.getName());
        svcs.add(UserAdmin.class.getName());
        svcs.add(LogService.class.getName());
        sl = new ServiceListener() {
            public void serviceChanged(ServiceEvent event) {
                processServiceEvent(event);
            }
        };
    }

    public void initController() {
        try {
            if (ac.getConfigurationAdmin() != null) {
                ConfigAdminManagerMBean ca = new ConfigAdminManager(ac);
                server
                        .registerMBean(ca, new ObjectName(
                                ObjectNames.CM_SERVICE));
            }
            if (ac.getLogservice() != null) {
                LogManagerMBean lm = new LogManager(ac);
                server.registerMBean(lm,
                        new ObjectName(ObjectNames.LOG_SERVICE));
            }
            if (ac.getUserAdmin() != null) {
                UserManagerMBean um = new UserManager(ac);
                server
                        .registerMBean(um, new ObjectName(
                                ObjectNames.UA_SERVICE));
            }
        } catch (InstanceAlreadyExistsException e) {
            ac.error("Unexpected error", e);
        } catch (MBeanRegistrationException e) {
            ac.error("Unexpected error", e);
        } catch (NotCompliantMBeanException e) {
            ac.error("Unexpected error", e);
        } catch (MalformedObjectNameException e) {
            ac.error("Unexpected error", e);
        } catch (NullPointerException e) {
            ac.error("Unexpected error", e);
        }
        ac.getBundleContext().addServiceListener(sl);

    }

    public void dispose() {
        ac.getBundleContext().removeServiceListener(sl);
        try {
            Iterator it = server.queryNames(
                    new ObjectName(ObjectNames.COMPENDIUM + ":*"), null)
                    .iterator();
            while (it.hasNext())
                server.unregisterMBean((ObjectName) it.next());

        } catch (MalformedObjectNameException e) {
            ac.error("Unexpected error", e);
        } catch (NullPointerException e) {
            ac.error("Unexpected error", e);
        } catch (InstanceNotFoundException e) {
            ac.error("Unexpected error", e);
        } catch (MBeanRegistrationException e) {
            ac.error("Unexpected error", e);
        }
    }

    private void processServiceEvent(ServiceEvent event) {
        String[] svs = (String[]) event.getServiceReference().getProperty(
                Constants.OBJECTCLASS);
        // Check if this event comes from an OSGi compendium service
        for (int i = 0; i < svs.length; i++) {
            if (svcs.contains(svs[i])) {
                if (event.getType() == ServiceEvent.REGISTERED
                        || event.getType() == ServiceEvent.UNREGISTERING)
                    handleEvent(event.getServiceReference(), svs[i], event
                            .getType());
            }
        }

    }

    private void handleEvent(ServiceReference serviceReference,
            String iService, int eType) {
        try {

            if (iService.equals(ConfigurationAdmin.class.getName())) {
                switch (eType) {
                case ServiceEvent.REGISTERED:
                    ConfigAdminManagerMBean ca = new ConfigAdminManager(ac);
                    server.registerMBean(ca, new ObjectName(
                            ObjectNames.CM_SERVICE));
                    break;
                case ServiceEvent.UNREGISTERING:
                    server.unregisterMBean(new ObjectName(
                            ObjectNames.CM_SERVICE));
                    break;
                default:
                    break;
                }
            }

            if (iService.equals(LogService.class.getName())) {
                switch (eType) {
                case ServiceEvent.REGISTERED:
                    LogManagerMBean lm = new LogManager(ac);
                    server.registerMBean(lm, new ObjectName(
                            ObjectNames.LOG_SERVICE));
                    break;
                case ServiceEvent.UNREGISTERING:
                    server.unregisterMBean(new ObjectName(
                            ObjectNames.LOG_SERVICE));
                    break;
                default:
                    break;
                }
            }

            if (iService.equals(UserAdmin.class.getName())) {
                switch (eType) {
                case ServiceEvent.REGISTERED:
                    UserManagerMBean um = new UserManager(ac);
                    server.registerMBean(um, new ObjectName(
                            ObjectNames.UA_SERVICE));
                    break;
                case ServiceEvent.UNREGISTERING:
                    server.unregisterMBean(new ObjectName(
                            ObjectNames.UA_SERVICE));
                    break;
                default:
                    break;
                }
            }
        } catch (InstanceAlreadyExistsException e) {
            ac.error("Unexpected error", e);
        } catch (MBeanRegistrationException e) {
            ac.error("Unexpected error", e);
        } catch (NotCompliantMBeanException e) {
            ac.error("Unexpected error", e);
        } catch (MalformedObjectNameException e) {
            ac.error("Unexpected error", e);
        } catch (NullPointerException e) {
            ac.error("Unexpected error", e);
        } catch (InstanceNotFoundException e) {
            ac.error("Unexpected error", e);
        }
    }

}
