/** * 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 java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.state.ThemeInfo; import org.apache.ambari.server.state.theme.Theme; import org.codehaus.jackson.map.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ThemeModule extends BaseModule<ThemeModule, ThemeInfo> implements Validable { private static final Logger LOG = LoggerFactory.getLogger(ThemeModule.class); private static final ObjectMapper mapper = new ObjectMapper(); public static final String THEME_KEY = "Theme"; private ThemeInfo moduleInfo; private boolean valid = true; private Set<String> errors = new HashSet<>(); public ThemeModule(File themeFile) { this(themeFile, new ThemeInfo()); } public ThemeModule(File themeFile, ThemeInfo moduleInfo) { this.moduleInfo = moduleInfo; if (!moduleInfo.isDeleted() && themeFile != null) { LOG.debug("Looking for theme in {}", themeFile.getAbsolutePath()); FileReader reader = null; try { reader = new FileReader(themeFile); } catch (FileNotFoundException e) { LOG.error("Theme file not found"); } try { Theme theme = mapper.readValue(reader, Theme.class); Map<String, Theme> map = new HashMap<>(); map.put(THEME_KEY, theme); moduleInfo.setThemeMap(map); LOG.debug("Loaded theme: {}", moduleInfo); } catch (IOException e) { LOG.error("Unable to parse theme file ", e); setValid(false); addError("Unable to parse theme file " + themeFile); } } } public ThemeModule(ThemeInfo moduleInfo) { this.moduleInfo = moduleInfo; } @Override public void resolve(ThemeModule parent, Map<String, StackModule> allStacks, Map<String, ServiceModule> commonServices, Map<String, ExtensionModule> extensions) throws AmbariException { ThemeInfo parentModuleInfo = parent.getModuleInfo(); if (parent.getModuleInfo() != null && !moduleInfo.isDeleted()) { if (moduleInfo.getThemeMap() == null || moduleInfo.getThemeMap().isEmpty()) { moduleInfo.setThemeMap(parentModuleInfo.getThemeMap()); } else if(parentModuleInfo.getThemeMap() != null && !parentModuleInfo.getThemeMap().isEmpty()) { Theme childTheme = moduleInfo.getThemeMap().get(THEME_KEY); Theme parentTheme = parentModuleInfo.getThemeMap().get(THEME_KEY); childTheme.mergeWithParent(parentTheme); } } } @Override public ThemeInfo getModuleInfo() { return moduleInfo; } @Override public boolean isDeleted() { return false; } @Override public String getId() { return moduleInfo.getFileName(); } @Override public boolean isValid() { return valid; } @Override public void setValid(boolean valid) { this.valid = valid; } @Override public void addError(String error) { errors.add(error); } @Override public void addErrors(Collection<String> errors) { this.errors.addAll(errors); } @Override public Collection<String> getErrors() { return errors; } }