001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.xbean.kernel;
018    
019    import java.util.Set;
020    
021    /**
022     * This class holds information about a service event.
023     *
024     * @author Dain Sundstrom
025     * @version $Id$
026     * @since 2.0
027     */
028    public class ServiceEvent {
029        private final long eventId;
030        private final Kernel kernel;
031        private final ServiceName serviceName;
032        private final ServiceFactory serviceFactory;
033        private final ClassLoader classLoader;
034        private final Object service;
035        private final Throwable cause;
036        private final Set unsatisfiedConditions;
037    
038        /**
039         * Creates a service event.
040         *
041         * @param eventId the sequence number for this event
042         * @param kernel the kernel in which the service is registered
043         * @param serviceName the name of the service
044         * @param serviceFactory the factory for the service
045         * @param classLoader the class loader for the service
046         * @param service the service instance if it exists
047         * @param cause the exception that caused the event if this is an exception event
048         * @param unsatisfiedConditions the unsatified conditions that caused the event if this is a waiting event
049         */
050        public ServiceEvent(long eventId, Kernel kernel, ServiceName serviceName, ServiceFactory serviceFactory, ClassLoader classLoader, Object service, Throwable cause, Set unsatisfiedConditions) {
051            if (kernel == null) throw new NullPointerException("kernel is null");
052            if (serviceName == null) throw new NullPointerException("name is null");
053            if (serviceFactory == null) throw new NullPointerException("serviceFactory is null");
054            if (classLoader == null) throw new NullPointerException("classLoader is null");
055            if (unsatisfiedConditions != null && cause != null) throw new IllegalArgumentException("Either unsatisfiedConditions or cause must be null");
056            if (cause != null && service != null) throw new IllegalArgumentException("A ServiceEvent can not carry both a cause and a service");
057            this.eventId = eventId;
058            this.kernel = kernel;
059            this.serviceName = serviceName;
060            this.serviceFactory = serviceFactory;
061            this.classLoader = classLoader;
062            this.service = service;
063            this.cause = cause;
064            this.unsatisfiedConditions = unsatisfiedConditions;
065        }
066    
067        /**
068         * Gets the sequence number for this event.  A service gaurentees that events will occur in increasing order with out
069         * skipping any numbers.
070         *
071         * @return the sequence number for this event
072         */
073        public long getEventId() {
074            return eventId;
075        }
076    
077        /**
078         * Gets the kernel in which the service is registered.
079         *
080         * @return the kernel in which the servce is registerd
081         */
082        public Kernel getKernel() {
083            return kernel;
084        }
085    
086        /**
087         * Gets the name of the service.
088         *
089         * @return the name of the service
090         */
091        public ServiceName getServiceName() {
092            return serviceName;
093        }
094    
095        /**
096         * Gets the service factory for the service.
097         *
098         * @return the service factory for the service
099         */
100        public ServiceFactory getServiceFactory() {
101            return serviceFactory;
102        }
103    
104        /**
105         * Gets the class loader for the service.
106         *
107         * @return the class loader for the service
108         */
109        public ClassLoader getClassLoader() {
110            return classLoader;
111        }
112    
113        /**
114         * Gets the service instance or null if the service doesn't exist.
115         *
116         * @return the service instance
117         */
118        public Object getService() {
119            return service;
120        }
121    
122        /**
123         * Gets the error that was thrown during startup or shutdown.  This is available only in error events.
124         *
125         * @return the error
126         */
127        public Throwable getCause() {
128            return cause;
129        }
130    
131        /**
132         * Gets the unsatified dependencies that cause the service to wait.   This is available only in waiting events.
133         *
134         * @return the unsatified dependencies that cause the service to wait
135         */
136        public Set getUnsatisfiedConditions() {
137            return unsatisfiedConditions;
138        }
139    }