/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * 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 org.pentaho.di.trans.step; import java.util.ArrayList; import java.util.List; import org.pentaho.di.trans.step.errorhandling.StreamInterface; public class StepIOMeta implements StepIOMetaInterface, Cloneable { private boolean inputAcceptor; private boolean outputProducer; private boolean inputOptional; private boolean outputDynamic; private boolean inputDynamic; private List<StreamInterface> streams; private boolean sortedDataRequired; private String generalInfoDescription; private String generalTargetDescription; /** * @param inputAcceptor * @param outputProducer */ public StepIOMeta( boolean inputAcceptor, boolean outputProducer, boolean inputOptional, boolean sortedDataRequired, boolean inputDynamic, boolean outputDynamic ) { this.inputAcceptor = inputAcceptor; this.outputProducer = outputProducer; this.inputOptional = inputOptional; this.sortedDataRequired = sortedDataRequired; this.streams = java.util.Collections.synchronizedList( new ArrayList<StreamInterface>() ); this.inputDynamic = inputDynamic; this.outputDynamic = outputDynamic; } @Override protected StepIOMeta clone() throws CloneNotSupportedException { StepIOMeta ioMeta = (StepIOMeta) super.clone(); List<StreamInterface> cloneStreams = new ArrayList<>( streams ); ioMeta.streams = java.util.Collections.synchronizedList( cloneStreams ); return ioMeta; } /** * @return the inputAcceptor */ public boolean isInputAcceptor() { return inputAcceptor; } /** * @param inputAcceptor * the inputAcceptor to set */ public void setInputAcceptor( boolean inputAcceptor ) { this.inputAcceptor = inputAcceptor; } /** * @return the outputProducer */ public boolean isOutputProducer() { return outputProducer; } /** * @param outputProducer * the outputProducer to set */ public void setOutputProducer( boolean outputProducer ) { this.outputProducer = outputProducer; } /** * @return the inputOptional */ public boolean isInputOptional() { return inputOptional; } /** * @param inputOptional * the inputOptional to set */ public void setInputOptional( boolean inputOptional ) { this.inputOptional = inputOptional; } /** * @return the info streams of this step. Important: Modifying this list does not have any effect on the Steps IO * metadata. * */ public List<StreamInterface> getInfoStreams() { List<StreamInterface> list = new ArrayList<StreamInterface>(); synchronized ( streams ) { for ( StreamInterface stream : streams ) { if ( stream.getStreamType().equals( StreamInterface.StreamType.INFO ) ) { list.add( stream ); } } } return list; } /** * @return the target streams of this step. Important: Modifying this list does not have any effect on the Steps IO * metadata. * */ public List<StreamInterface> getTargetStreams() { List<StreamInterface> list = new ArrayList<StreamInterface>(); synchronized ( streams ) { for ( StreamInterface stream : streams ) { if ( stream.getStreamType().equals( StreamInterface.StreamType.TARGET ) ) { list.add( stream ); } } } return list; } /** * @return the sortedDataRequired */ public boolean isSortedDataRequired() { return sortedDataRequired; } /** * @param sortedDataRequired * the sortedDataRequired to set */ public void setSortedDataRequired( boolean sortedDataRequired ) { this.sortedDataRequired = sortedDataRequired; } public void addStream( StreamInterface stream ) { streams.add( stream ); } public String[] getInfoStepnames() { List<StreamInterface> infoStreams = getInfoStreams(); String[] names = new String[infoStreams.size()]; for ( int i = 0; i < names.length; i++ ) { names[i] = infoStreams.get( i ).getStepname(); } return names; } public String[] getTargetStepnames() { List<StreamInterface> targetStreams = getTargetStreams(); String[] names = new String[targetStreams.size()]; for ( int i = 0; i < names.length; i++ ) { names[i] = targetStreams.get( i ).getStepname(); } return names; } /** * Replace the info steps with the supplied source steps. * * @param infoSteps */ public void setInfoSteps( StepMeta[] infoSteps ) { // First get the info steps... // List<StreamInterface> list = new ArrayList<StreamInterface>(); synchronized ( streams ) { for ( StreamInterface stream : streams ) { if ( stream.getStreamType().equals( StreamInterface.StreamType.INFO ) ) { list.add( stream ); } } } for ( int i = 0; i < infoSteps.length; i++ ) { if ( i >= list.size() ) { throw new RuntimeException( "We expect all possible info streams to be pre-populated!" ); } streams.get( i ).setStepMeta( infoSteps[i] ); } } /** * @return the generalInfoDescription */ public String getGeneralInfoDescription() { return generalInfoDescription; } /** * @param generalInfoDescription * the generalInfoDescription to set */ public void setGeneralInfoDescription( String generalInfoDescription ) { this.generalInfoDescription = generalInfoDescription; } /** * @return the generalTargetDescription */ public String getGeneralTargetDescription() { return generalTargetDescription; } /** * @param generalTargetDescription * the generalTargetDescription to set */ public void setGeneralTargetDescription( String generalTargetDescription ) { this.generalTargetDescription = generalTargetDescription; } public void clearStreams() { streams.clear(); } /** * @return the outputDynamic */ public boolean isOutputDynamic() { return outputDynamic; } /** * @param outputDynamic * the outputDynamic to set */ public void setOutputDynamic( boolean outputDynamic ) { this.outputDynamic = outputDynamic; } /** * @return the inputDynamic */ public boolean isInputDynamic() { return inputDynamic; } /** * @param inputDynamic * the inputDynamic to set */ public void setInputDynamic( boolean inputDynamic ) { this.inputDynamic = inputDynamic; } public StreamInterface findTargetStream( StepMeta targetStep ) { for ( StreamInterface stream : getTargetStreams() ) { if ( targetStep.equals( stream.getStepMeta() ) ) { return stream; } } return null; } public StreamInterface findInfoStream( StepMeta infoStep ) { for ( StreamInterface stream : getInfoStreams() ) { if ( infoStep.equals( stream.getStepMeta() ) ) { return stream; } } return null; } }