blob: 0e1116fa0d8936d06e2ae400b514a9c35636bf3a [file] [log] [blame]
/**
* 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.ambari.server.stack;
import org.apache.ambari.server.AmbariException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Abstract base service definition module.
* Provides functionality that is common across multiple modules.
*/
public abstract class BaseModule<T, I> implements StackDefinitionModule<T, I> {
/**
* Module visitation state
*/
protected ModuleState moduleState = ModuleState.INIT;
/**
* Module state.
* Initial state is INIT.
* When resolve is called state is set to VISITED.
* When resolve completes, state is set to RESOLVED.
*
* @return the module's state
*/
public ModuleState getModuleState() {
return moduleState;
}
/**
* Merges child modules with the corresponding parent modules.
*
* @param allStacks collection of all stack module in stack definition
* @param commonServices collection of all common service module in stack definition
* @param modules child modules of this module that are to be merged
* @param parentModules parent modules which the modules are to be merged with
*
* @return collection of the merged modules
*/
protected <T extends StackDefinitionModule<T, ?>> Collection<T> mergeChildModules(
Map<String, StackModule> allStacks, Map<String, ServiceModule> commonServices, Map<String, ExtensionModule> extensions, Map<String, T> modules, Map<String, T> parentModules)
throws AmbariException {
Set<String> addedModules = new HashSet<String>();
Collection<T> mergedModules = new HashSet<T>();
for (T module : modules.values()) {
String id = module.getId();
addedModules.add(id);
if (!module.isDeleted()) {
if (parentModules.containsKey(id)) {
module.resolve(parentModules.get(id), allStacks, commonServices, extensions);
}
mergedModules.add(module);
}
}
// add non-overlapping parent modules
for (T parentModule : parentModules.values()) {
String id = parentModule.getId();
if (!addedModules.contains(id)) {
mergedModules.add(parentModule);
}
}
return mergedModules;
}
/**
* Finalize a modules child components.
* Any child module marked as deleted will be removed from this module after finalizing
* the child.
*
* @param modules child modules to finalize
*/
protected void finalizeChildModules(Collection<? extends StackDefinitionModule> modules) {
Iterator<? extends StackDefinitionModule> iter = modules.iterator();
while (iter.hasNext()) {
StackDefinitionModule module = iter.next();
module.finalizeModule();
if (module.isDeleted()) {
iter.remove();
}
}
}
@Override
public void finalizeModule() {
// do nothing by default
}
}