001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.commons.pipeline.testFramework; 019 020 import java.util.ArrayList; 021 import java.util.Collection; 022 import java.util.Collections; 023 import java.util.EventObject; 024 import java.util.HashMap; 025 import java.util.List; 026 import java.util.Map; 027 028 import org.apache.commons.pipeline.Feeder; 029 import org.apache.commons.pipeline.Stage; 030 import org.apache.commons.pipeline.StageContext; 031 import org.apache.commons.pipeline.StageEventListener; 032 033 034 /** 035 * Stage Context for test harness. 036 */ 037 public class TestStageContext implements StageContext { 038 public List<StageEventListener> listeners = Collections.synchronizedList( new ArrayList<StageEventListener>() ); 039 public List<EventObject> raisedEvents = new ArrayList<EventObject>(); 040 public Map<String, TestFeeder> branchFeeders = new HashMap<String,TestFeeder>(); 041 public Map<Stage, Feeder> downstreamFeeders = new HashMap<Stage,Feeder>(); 042 public Map<String, Object> env = new HashMap<String, Object>(); 043 044 public void registerListener(StageEventListener listener) { 045 this.listeners.add(listener); 046 } 047 048 public void raise(EventObject ev) { 049 this.raisedEvents.add(ev); 050 notifyListeners( ev ); 051 } 052 053 private void notifyListeners( EventObject event ) 054 { 055 for( StageEventListener listener : listeners ) 056 { 057 listener.notify( event ); 058 } 059 } 060 061 /** 062 * Dynamically adds branch feeders as needed to provide a feeder for 063 * the requested branch key. 064 */ 065 public Feeder getBranchFeeder(String key) { 066 if (branchFeeders.containsKey(key)) { 067 return branchFeeders.get(key); 068 } else { 069 TestFeeder feeder = new TestFeeder(); 070 branchFeeders.put(key, feeder); 071 return feeder; 072 } 073 } 074 075 /** 076 * Dynamically adds downstream feeders as needed to provide a downstream 077 * feeder for the specified stage. 078 */ 079 public Feeder getDownstreamFeeder(Stage stage) { 080 if (downstreamFeeders.containsKey(stage)) { 081 return downstreamFeeders.get(stage); 082 } else { 083 TestFeeder feeder = new TestFeeder(); 084 downstreamFeeders.put(stage, feeder); 085 return feeder; 086 } 087 } 088 089 /** 090 * This method is used by the test implementation to set up the feeders 091 * for a stage as though they were provided by drivers in a pipeline. 092 */ 093 public void registerDownstreamFeeder(Stage stage, Feeder feeder) { 094 this.downstreamFeeders.put(stage, feeder); 095 } 096 097 public Collection<StageEventListener> getRegisteredListeners() { 098 return this.listeners; 099 } 100 101 /** 102 * This method allows objects in the global environment 103 * to be accessed by the stages running in this context. 104 * 105 * @return the object corresponding to the specified string key, or null 106 * if no such key exists. 107 */ 108 public Object getEnv(String key) { 109 return this.env.get(key); 110 } 111 }