001    /*
002     * Copyright (c) 2007-2014 Concurrent, Inc. All Rights Reserved.
003     *
004     * Project and contact information: http://www.cascading.org/
005     *
006     * This file is part of the Cascading project.
007     *
008     * Licensed under the Apache License, Version 2.0 (the "License");
009     * you may not use this file except in compliance with the License.
010     * You may obtain a copy of the License at
011     *
012     *     http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing, software
015     * distributed under the License is distributed on an "AS IS" BASIS,
016     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017     * See the License for the specific language governing permissions and
018     * limitations under the License.
019     */
020    
021    package cascading.operation.state;
022    
023    import java.beans.ConstructorProperties;
024    
025    import cascading.flow.FlowProcess;
026    import cascading.operation.BaseOperation;
027    import cascading.operation.Filter;
028    import cascading.operation.FilterCall;
029    import cascading.operation.OperationCall;
030    
031    /**
032     * Class Status is a {@link cascading.operation.Filter} that sets the current {@link FlowProcess} 'status' on
033     * the first {@link cascading.tuple.Tuple} it sees.
034     * <p/>
035     * Internally, the {@link #isRemove(cascading.flow.FlowProcess, cascading.operation.FilterCall)} method calls
036     * {@link cascading.flow.FlowProcess#setStatus(String)}.
037     * <p/>
038     * No {@link cascading.tuple.Tuple} instances are ever discarded.
039     *
040     * @see FlowProcess
041     * @see Filter
042     */
043    public class Status extends BaseOperation<Boolean> implements Filter<Boolean>
044      {
045      /** Field status */
046      private final String status;
047    
048      /**
049       * Constructor Status creates a new Status instance.
050       *
051       * @param status of type String
052       */
053      @ConstructorProperties({"status"})
054      public Status( String status )
055        {
056        this.status = status;
057        }
058    
059      public String getStatus()
060        {
061        return status;
062        }
063    
064      @Override
065      public void prepare( FlowProcess flowProcess, OperationCall<Boolean> operationCall )
066        {
067        operationCall.setContext( false );
068        }
069    
070      @Override
071      public boolean isRemove( FlowProcess flowProcess, FilterCall<Boolean> filterCall )
072        {
073        if( !filterCall.getContext() )
074          {
075          filterCall.setContext( true );
076          flowProcess.setStatus( status );
077          }
078    
079        return false;
080        }
081    
082      @Override
083      public boolean equals( Object object )
084        {
085        if( this == object )
086          return true;
087        if( !( object instanceof Status ) )
088          return false;
089        if( !super.equals( object ) )
090          return false;
091    
092        Status status1 = (Status) object;
093    
094        if( status != null ? !status.equals( status1.status ) : status1.status != null )
095          return false;
096    
097        return true;
098        }
099    
100      @Override
101      public int hashCode()
102        {
103        int result = super.hashCode();
104        result = 31 * result + ( status != null ? status.hashCode() : 0 );
105        return result;
106        }
107      }