/* * Copyright © 2016 Cask Data, Inc. * * 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 co.cask.cdap.data2.metadata.system; import co.cask.cdap.api.ProgramSpecification; import co.cask.cdap.api.app.ApplicationSpecification; import co.cask.cdap.api.plugin.Plugin; import co.cask.cdap.api.plugin.PluginClass; import co.cask.cdap.api.schedule.Schedule; import co.cask.cdap.api.schedule.ScheduleSpecification; import co.cask.cdap.data2.metadata.dataset.MetadataDataset; import co.cask.cdap.data2.metadata.store.MetadataStore; import co.cask.cdap.proto.Id; import co.cask.cdap.proto.ProgramType; import com.google.common.collect.ImmutableMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * A {@link AbstractSystemMetadataWriter} for an {@link Id.Application application}. */ public class AppSystemMetadataWriter extends AbstractSystemMetadataWriter { private final ApplicationSpecification appSpec; public AppSystemMetadataWriter(MetadataStore metadataStore, Id.Application entityId, ApplicationSpecification appSpec) { super(metadataStore, entityId); this.appSpec = appSpec; } @Override protected Map<String, String> getSystemPropertiesToAdd() { ImmutableMap.Builder<String, String> properties = ImmutableMap.builder(); addPrograms(properties); addSchedules(properties); // appSpec.getPlugins() returns all instances of all plugins, so there may be duplicates. // we only store unique plugins right now Set<PluginClass> existing = new HashSet<>(); for (Plugin plugin : appSpec.getPlugins().values()) { if (!existing.contains(plugin.getPluginClass())) { addPlugin(plugin.getPluginClass(), null, properties); existing.add(plugin.getPluginClass()); } } return properties.build(); } @Override protected String[] getSystemTagsToAdd() { return new String[] { appSpec.getName(), appSpec.getArtifactId().getName() }; } private void addPrograms(ImmutableMap.Builder<String, String> properties) { addPrograms(ProgramType.FLOW, appSpec.getFlows().values(), properties); addPrograms(ProgramType.MAPREDUCE, appSpec.getMapReduce().values(), properties); addPrograms(ProgramType.SERVICE, appSpec.getServices().values(), properties); addPrograms(ProgramType.SPARK, appSpec.getSpark().values(), properties); addPrograms(ProgramType.WORKER, appSpec.getWorkers().values(), properties); addPrograms(ProgramType.WORKFLOW, appSpec.getWorkflows().values(), properties); } private void addPrograms(ProgramType programType, Iterable<? extends ProgramSpecification> specs, ImmutableMap.Builder<String, String> properties) { for (ProgramSpecification spec : specs) { properties.put(programType.getPrettyName() + MetadataDataset.KEYVALUE_SEPARATOR + spec.getName(), spec.getName()); } } private void addSchedules(ImmutableMap.Builder<String, String> properties) { for (ScheduleSpecification scheduleSpec : appSpec.getSchedules().values()) { Schedule schedule = scheduleSpec.getSchedule(); properties.put("schedule" + MetadataDataset.KEYVALUE_SEPARATOR + schedule.getName(), schedule.getName() + MetadataDataset.KEYVALUE_SEPARATOR + schedule.getDescription()); } } }