| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.hadoop.lib.server; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.lib.util.ConfigurationUtils; |
| |
| import java.util.Map; |
| |
| /** |
| * Convenience class implementing the {@link Service} interface. |
| */ |
| public abstract class BaseService implements Service { |
| private String prefix; |
| private Server server; |
| private Configuration serviceConfig; |
| |
| /** |
| * Service constructor. |
| * |
| * @param prefix service prefix. |
| */ |
| public BaseService(String prefix) { |
| this.prefix = prefix; |
| } |
| |
| /** |
| * Initializes the service. |
| * <p/> |
| * It collects all service properties (properties having the |
| * <code>#SERVER#.#SERVICE#.</code> prefix). The property names are then |
| * trimmed from the <code>#SERVER#.#SERVICE#.</code> prefix. |
| * <p/> |
| * After collecting the service properties it delegates to the |
| * {@link #init()} method. |
| * |
| * @param server the server initializing the service, give access to the |
| * server context. |
| * |
| * @throws ServiceException thrown if the service could not be initialized. |
| */ |
| @Override |
| public final void init(Server server) throws ServiceException { |
| this.server = server; |
| String servicePrefix = getPrefixedName(""); |
| serviceConfig = new Configuration(false); |
| for (Map.Entry<String, String> entry : ConfigurationUtils.resolve(server.getConfig())) { |
| String key = entry.getKey(); |
| if (key.startsWith(servicePrefix)) { |
| serviceConfig.set(key.substring(servicePrefix.length()), entry.getValue()); |
| } |
| } |
| init(); |
| } |
| |
| |
| /** |
| * Post initializes the service. This method is called by the |
| * {@link Server} after all services of the server have been initialized. |
| * <p/> |
| * This method does a NOP. |
| * |
| * @throws ServiceException thrown if the service could not be |
| * post-initialized. |
| */ |
| @Override |
| public void postInit() throws ServiceException { |
| } |
| |
| /** |
| * Destroy the services. This method is called once, when the |
| * {@link Server} owning the service is being destroyed. |
| * <p/> |
| * This method does a NOP. |
| */ |
| @Override |
| public void destroy() { |
| } |
| |
| /** |
| * Returns the service dependencies of this service. The service will be |
| * instantiated only if all the service dependencies are already initialized. |
| * <p/> |
| * This method returns an empty array (size 0) |
| * |
| * @return an empty array (size 0). |
| */ |
| @Override |
| public Class[] getServiceDependencies() { |
| return new Class[0]; |
| } |
| |
| /** |
| * Notification callback when the server changes its status. |
| * <p/> |
| * This method returns an empty array (size 0) |
| * |
| * @param oldStatus old server status. |
| * @param newStatus new server status. |
| * |
| * @throws ServiceException thrown if the service could not process the status change. |
| */ |
| @Override |
| public void serverStatusChange(Server.Status oldStatus, Server.Status newStatus) throws ServiceException { |
| } |
| |
| /** |
| * Returns the service prefix. |
| * |
| * @return the service prefix. |
| */ |
| protected String getPrefix() { |
| return prefix; |
| } |
| |
| /** |
| * Returns the server owning the service. |
| * |
| * @return the server owning the service. |
| */ |
| protected Server getServer() { |
| return server; |
| } |
| |
| /** |
| * Returns the full prefixed name of a service property. |
| * |
| * @param name of the property. |
| * |
| * @return prefixed name of the property. |
| */ |
| protected String getPrefixedName(String name) { |
| return server.getPrefixedName(prefix + "." + name); |
| } |
| |
| /** |
| * Returns the service configuration properties. Property |
| * names are trimmed off from its prefix. |
| * <p/> |
| * The sevice configuration properties are all properties |
| * with names starting with <code>#SERVER#.#SERVICE#.</code> |
| * in the server configuration. |
| * |
| * @return the service configuration properties with names |
| * trimmed off from their <code>#SERVER#.#SERVICE#.</code> |
| * prefix. |
| */ |
| protected Configuration getServiceConfig() { |
| return serviceConfig; |
| } |
| |
| /** |
| * Initializes the server. |
| * <p/> |
| * This method is called by {@link #init(Server)} after all service properties |
| * (properties prefixed with |
| * |
| * @throws ServiceException thrown if the service could not be initialized. |
| */ |
| protected abstract void init() throws ServiceException; |
| |
| } |