    001/*
    002 * Copyright (c) 2007-2017 Xplenty, 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.pipe;
    022
    023import cascading.CascadingException;
    024import cascading.tuple.Fields;
    025import cascading.util.TraceUtil;
    026
    027/** Class OperatorException is thrown during field name resolution during planning */
    028public class OperatorException extends CascadingException
    029  {
    030  enum Kind
    031    {
    032      argument, grouping, sorting, joining
    033    }
    034
    035  private Fields incomingFields;
    036  private Fields argumentSelector;
    037  private Fields groupingSelector;
    038  private Fields sortingSelector;
    039  private Fields declaredFields;
    040  private Fields outputSelector;
    041
    042  /** @see cascading.CascadingException#CascadingException() */
    043  public OperatorException()
    044    {
    045    }
    046
    047  /**
    048   * Constructor OperatorException creates a new OperatorException instance.
    049   *
    050   * @param pipe   of type Pipe
    051   * @param string of type String
    052   */
    053  public OperatorException( Pipe pipe, String string )
    054    {
    055    super( TraceUtil.formatTrace( pipe, string ) );
    056    }
    057
    058  /**
    059   * Constructor OperatorException creates a new OperatorException instance.
    060   *
    061   * @param pipe      of type Pipe
    062   * @param string    of type String
    063   * @param throwable of type Throwable
    064   */
    065  public OperatorException( Pipe pipe, String string, Throwable throwable )
    066    {
    067    super( TraceUtil.formatTrace( pipe, string ), throwable );
    068    }
    069
    070  /** @see cascading.CascadingException#CascadingException(String) */
    071  protected OperatorException( String string )
    072    {
    073    super( string );
    074    }
    075
    076  /** @see cascading.CascadingException#CascadingException(String, Throwable) */
    077  protected OperatorException( String string, Throwable throwable )
    078    {
    079    super( string, throwable );
    080    }
    081
    082  /** @see cascading.CascadingException#CascadingException(Throwable) */
    083  protected OperatorException( Throwable throwable )
    084    {
    085    super( throwable );
    086    }
    087
    088  /**
    089   * Constructor OperatorException creates a new OperatorException instance.
    090   *
    091   * @param pipe           of type Pipe
    092   * @param incomingFields of type Fields
    093   * @param declaredFields of type Fields
    094   * @param outputSelector of type Fields
    095   * @param throwable      of type Throwable
    096   */
    097  public OperatorException( Pipe pipe, Fields incomingFields, Fields declaredFields, Fields outputSelector, Throwable throwable )
    098    {
    099    super( createMessage( pipe, incomingFields, declaredFields, outputSelector ), throwable );
    100
    101    this.incomingFields = incomingFields;
    102    this.declaredFields = declaredFields;
    103    this.outputSelector = outputSelector;
    104    }
    105
    106  /**
    107   * Constructor OperatorException creates a new OperatorException instance.
    108   *
    109   * @param pipe           of type Pipe
    110   * @param kind           of type Kind
    111   * @param incomingFields of type Fields
    112   * @param selectorFields of type Fields
    113   * @param throwable      of type Throwable
    114   */
    115  public OperatorException( Pipe pipe, Kind kind, Fields incomingFields, Fields selectorFields, Throwable throwable )
    116    {
    117    super( createMessage( pipe, kind, incomingFields, selectorFields ), throwable );
    118
    119    this.incomingFields = incomingFields;
    120
    121    if( kind == Kind.argument )
    122      this.argumentSelector = selectorFields;
    123    else if( kind == Kind.grouping )
    124      this.groupingSelector = selectorFields;
    125    else
    126      this.sortingSelector = selectorFields;
    127    }
    128
    129  /**
    130   * Method getIncomingFields returns the incomingFields of this OperatorException object.
    131   *
    132   * @return the incomingFields (type Fields) of this OperatorException object.
    133   */
    134  public Fields getIncomingFields()
    135    {
    136    return incomingFields;
    137    }
    138
    139  /**
    140   * Method getArgumentSelector returns the argumentSelector of this OperatorException object.
    141   *
    142   * @return the argumentSelector (type Fields) of this OperatorException object.
    143   */
    144  public Fields getArgumentSelector()
    145    {
    146    return argumentSelector;
    147    }
    148
    149  /**
    150   * Method getGroupingSelector returns the groupingSelector of this OperatorException object.
    151   *
    152   * @return the groupingSelector (type Fields) of this OperatorException object.
    153   */
    154  public Fields getGroupingSelector()
    155    {
    156    return groupingSelector;
    157    }
    158
    159  /**
    160   * Method getSortingSelector returns the sortingSelector of this OperatorException object.
    161   *
    162   * @return the sortingSelector (type Fields) of this OperatorException object.
    163   */
    164  public Fields getSortingSelector()
    165    {
    166    return sortingSelector;
    167    }
    168
    169  /**
    170   * Method getDeclaredFields returns the declaredFields of this OperatorException object.
    171   *
    172   * @return the declaredFields (type Fields) of this OperatorException object.
    173   */
    174  public Fields getDeclaredFields()
    175    {
    176    return declaredFields;
    177    }
    178
    179  /**
    180   * Method getOutputSelector returns the outputSelector of this OperatorException object.
    181   *
    182   * @return the outputSelector (type Fields) of this OperatorException object.
    183   */
    184  public Fields getOutputSelector()
    185    {
    186    return outputSelector;
    187    }
    188
    189  private static String createMessage( Pipe pipe, Fields incomingFields, Fields declaredFields, Fields outputSelector )
    190    {
    191    String message = "unable to resolve output selector: " + outputSelector.printVerbose() +
    192      ", with incoming: " + incomingFields.printVerbose() + " and declared: " + declaredFields.printVerbose();
    193
    194    return TraceUtil.formatTrace( pipe, message );
    195    }
    196
    197  private static String createMessage( Pipe pipe, Kind kind, Fields incomingFields, Fields argumentSelector )
    198    {
    199    String message = "unable to resolve " + kind + " selector: " + argumentSelector.printVerbose() +
    200      ", with incoming: " + incomingFields.printVerbose();
    201
    202    return TraceUtil.formatTrace( pipe, message );
    203    }
    204
    205  }