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.tap; 022 023 import cascading.CascadingException; 024 import cascading.tuple.Fields; 025 import cascading.tuple.Tuple; 026 import cascading.util.Util; 027 028 /** 029 * Class TapException is thrown from {@link Tap} and {@link cascading.scheme.Scheme} subclasses. 030 * <p/> 031 * Use the payload {@link Tuple} constructor if being thrown from inside a Scheme and which for specific data 032 * to be trapped by a failure trap Tap. If the payload is not null, and there is a trap covering the source or sink 033 * Tap in question, it will be written to the trap Tap. 034 */ 035 public class TapException extends CascadingException 036 { 037 Tuple payload; 038 039 /** Constructor TapException creates a new TapException instance. */ 040 public TapException() 041 { 042 } 043 044 /** 045 * Constructor TapException creates a new TapException instance. 046 * 047 * @param string of type String 048 */ 049 public TapException( String string ) 050 { 051 super( string ); 052 } 053 054 /** 055 * Constructor TapException creates a new TapException instance. 056 * 057 * @param string of type String 058 * @param throwable of type Throwable 059 */ 060 public TapException( String string, Throwable throwable ) 061 { 062 super( string, throwable ); 063 } 064 065 /** 066 * Constructor TapException creates a new TapException instance. 067 * 068 * @param string of type String 069 * @param throwable of type Throwable 070 * @param payload of type Tuple 071 */ 072 public TapException( String string, Throwable throwable, Tuple payload ) 073 { 074 super( string, throwable ); 075 this.payload = payload; 076 } 077 078 /** 079 * Constructor TapException creates a new TapException instance. 080 * 081 * @param string of type String 082 * @param payload of type Tuple 083 */ 084 public TapException( String string, Tuple payload ) 085 { 086 super( string ); 087 this.payload = payload; 088 } 089 090 /** 091 * Constructor TapException creates a new TapException instance. 092 * 093 * @param throwable of type Throwable 094 */ 095 public TapException( Throwable throwable ) 096 { 097 super( throwable ); 098 } 099 100 /** 101 * Constructor TapException creates a new TapException instance. 102 * 103 * @param tap of type Tap 104 * @param incomingFields of type Fields 105 * @param selectorFields of type Fields 106 * @param throwable of type Throwable 107 */ 108 public TapException( Tap tap, Fields incomingFields, Fields selectorFields, Throwable throwable ) 109 { 110 super( createMessage( tap, incomingFields, selectorFields ), throwable ); 111 } 112 113 public Tuple getPayload() 114 { 115 return payload; 116 } 117 118 private static String createMessage( Tap tap, Fields incomingFields, Fields selectorFields ) 119 { 120 String message = "unable to resolve scheme sink selector: " + selectorFields.printVerbose() + 121 ", with incoming: " + incomingFields.printVerbose(); 122 123 return Util.formatTrace( tap.getScheme(), message ); 124 } 125 }