/** * Copyright 2011-2017 Asakusa Framework Team. * * 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 com.asakusafw.testdriver.compiler.basic; import java.util.Collection; import java.util.Collections; import java.util.EnumMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Objects; import java.util.Set; import com.asakusafw.testdriver.compiler.JobflowMirror; import com.asakusafw.testdriver.compiler.PortMirror; import com.asakusafw.testdriver.compiler.TaskMirror; import com.asakusafw.vocabulary.external.ExporterDescription; import com.asakusafw.vocabulary.external.ImporterDescription; /** * A basic implementation of {@link JobflowMirror}. * @since 0.8.0 */ public class BasicJobflowMirror extends AbstractGraphElement<JobflowMirror> implements JobflowMirror { private final String flowId; private final Map<String, PortMirror<? extends ImporterDescription>> inputs = new LinkedHashMap<>(); private final Map<String, PortMirror<? extends ExporterDescription>> outputs = new LinkedHashMap<>(); private final Map<TaskMirror.Phase, Set<TaskMirror>> tasks = new EnumMap<>(TaskMirror.Phase.class); { for (TaskMirror.Phase phase : TaskMirror.Phase.values()) { tasks.put(phase, new LinkedHashSet<TaskMirror>()); } } /** * Creates a new instance. * @param flowId the flow ID */ public BasicJobflowMirror(String flowId) { Objects.requireNonNull(flowId); this.flowId = flowId; } @Override public String getFlowId() { return flowId; } @Override public Collection<? extends PortMirror<? extends ImporterDescription>> getInputs() { return Collections.unmodifiableCollection(inputs.values()); } @Override public Collection<? extends PortMirror<? extends ExporterDescription>> getOutputs() { return Collections.unmodifiableCollection(outputs.values()); } @Override public Set<? extends TaskMirror> getTasks(TaskMirror.Phase phase) { Objects.requireNonNull(phase); return tasks.get(phase); } @Override public PortMirror<? extends ImporterDescription> findInput(String name) { Objects.requireNonNull(name); return inputs.get(name); } @Override public PortMirror<? extends ExporterDescription> findOutput(String name) { Objects.requireNonNull(name); return outputs.get(name); } /** * Adds external input ports. * @param ports the external port mirrors */ public void addInputs(Collection<? extends PortMirror<? extends ImporterDescription>> ports) { Objects.requireNonNull(ports); for (PortMirror<? extends ImporterDescription> port : ports) { addInput(port); } } /** * Adds external output ports. * @param ports the external port mirrors */ public void addOutputs(Collection<? extends PortMirror<? extends ExporterDescription>> ports) { Objects.requireNonNull(ports); for (PortMirror<? extends ExporterDescription> port : ports) { addOutput(port); } } /** * Adds an external input port. * @param port the external port mirror */ public void addInput(PortMirror<? extends ImporterDescription> port) { Objects.requireNonNull(port); inputs.put(port.getName(), port); } /** * Adds an external output port. * @param port the external port mirror */ public void addOutput(PortMirror<? extends ExporterDescription> port) { Objects.requireNonNull(port); outputs.put(port.getName(), port); } /** * Adds a task. * @param phase the target phase * @param task the task */ public void addTask(TaskMirror.Phase phase, TaskMirror task) { Objects.requireNonNull(phase); Objects.requireNonNull(task); tasks.get(phase).add(task); } }