    001/*
    002 * Copyright (c) 2007-2016 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
    021package cascading.flow.planner.iso.expression;
    022
    023import cascading.flow.planner.PlannerContext;
    024import cascading.flow.planner.Scope;
    025import cascading.flow.planner.graph.ElementGraph;
    026
    027/**
    028 * All is a special case allowing allowing a node-node match with any number of edges
    029 */
    030public class PathScopeExpression extends ScopeExpression
    031  {
    032  public static final PathScopeExpression BLOCKING = new PathScopeExpression( Mode.Blocking );
    033  public static final PathScopeExpression NON_BLOCKING = new PathScopeExpression( Mode.NonBlocking );
    034
    035  public static final PathScopeExpression ALL_BLOCKING = new PathScopeExpression( Applies.All, Mode.Blocking );
    036  public static final PathScopeExpression ALL_NON_BLOCKING = new PathScopeExpression( Applies.All, Mode.NonBlocking );
    037
    038  public static final PathScopeExpression ANY_BLOCKING = new PathScopeExpression( Applies.Any, Mode.Blocking );
    039  public static final PathScopeExpression ANY_NON_BLOCKING = new PathScopeExpression( Applies.Any, Mode.NonBlocking );
    040
    041  public enum Mode
    042    {
    043      Ignore, Blocking, NonBlocking
    044    }
    045
    046  private Mode mode = Mode.Ignore;
    047
    048  public PathScopeExpression()
    049    {
    050    }
    051
    052  public PathScopeExpression( Applies applies )
    053    {
    054    this.applies = applies;
    055    }
    056
    057  public PathScopeExpression( Mode mode )
    058    {
    059    this.mode = mode;
    060    }
    061
    062  public PathScopeExpression( Applies applies, Mode mode )
    063    {
    064    super( applies );
    065    this.mode = mode;
    066    }
    067
    068  @Override
    069  public boolean acceptsAll()
    070    {
    071    return appliesToAllPaths() && isIgnoreMode();
    072    }
    073
    074  public boolean isIgnoreMode()
    075    {
    076    return mode == Mode.Ignore;
    077    }
    078
    079  public Mode getMode()
    080    {
    081    return mode;
    082    }
    083
    084  @Override
    085  public boolean applies( PlannerContext plannerContext, ElementGraph elementGraph, Scope scope )
    086    {
    087    switch( mode )
    088      {
    089      case Ignore:
    090        return true;
    091      case Blocking:
    092        return !scope.isNonBlocking();
    093      case NonBlocking:
    094        return scope.isNonBlocking();
    095      default:
    096        throw new IllegalStateException( "should never reach here" );
    097      }
    098    }
    099
    100  @Override
    101  public String toString()
    102    {
    103    final StringBuilder sb = new StringBuilder( "PathScopeExpression{" );
    104    sb.append( "path=" ).append( applies );
    105    sb.append( ", mode=" ).append( mode );
    106    sb.append( '}' );
    107    return sb.toString();
    108    }
    109  }