001    /*
002     * Copyright (c) 2007-2015 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.flow.planner;
022    
023    import cascading.flow.FlowElement;
024    import cascading.flow.FlowException;
025    import cascading.pipe.Pipe;
026    import cascading.util.TraceUtil;
027    import org.jgrapht.graph.SimpleDirectedGraph;
028    
029    /**
030     * Class PlannerException is thrown when a job planner fails.
031     * <p/>
032     * For debugging purposes, the PlannerException holds a copy of the internal job representation which can be
033     * written out to disk and visualized with tools that support the
034     * <a href="http://en.wikipedia.org/wiki/DOT_language">DOT file format</a> using the {@link #writeDOT(String)}
035     * method.
036     */
037    public class PlannerException extends FlowException
038      {
039      /** Field pipeGraph */
040      ElementGraph elementGraph;
041    
042      /** Constructor PlannerException creates a new PlannerException instance. */
043      public PlannerException()
044        {
045        }
046    
047      /**
048       * Constructor PlannerException creates a new PlannerException instance.
049       *
050       * @param pipe    of type Pipe
051       * @param message of type String
052       */
053      public PlannerException( Pipe pipe, String message )
054        {
055        super( TraceUtil.formatTrace( pipe, message ) );
056        }
057    
058      /**
059       * Constructor PlannerException creates a new PlannerException instance.
060       *
061       * @param pipe      of type Pipe
062       * @param message   of type String
063       * @param throwable of type Throwable
064       */
065      public PlannerException( Pipe pipe, String message, Throwable throwable )
066        {
067        super( TraceUtil.formatTrace( pipe, message ), throwable );
068        }
069    
070      /**
071       * Constructor PlannerException creates a new PlannerException instance.
072       *
073       * @param pipe         of type Pipe
074       * @param message      of type String
075       * @param throwable    of type Throwable
076       * @param elementGraph of type ElementGraph
077       */
078      public PlannerException( Pipe pipe, String message, Throwable throwable, ElementGraph elementGraph )
079        {
080        super( TraceUtil.formatTrace( pipe, message ), throwable );
081        this.elementGraph = elementGraph;
082        }
083    
084      /**
085       * Constructor PlannerException creates a new PlannerException instance.
086       *
087       * @param string of type String
088       */
089      public PlannerException( String string )
090        {
091        super( string );
092        }
093    
094      /**
095       * Constructor PlannerException creates a new PlannerException instance.
096       *
097       * @param string    of type String
098       * @param throwable of type Throwable
099       */
100      public PlannerException( String string, Throwable throwable )
101        {
102        super( string, throwable );
103        }
104    
105      /**
106       * Constructor PlannerException creates a new PlannerException instance.
107       *
108       * @param throwable of type Throwable
109       */
110      public PlannerException( Throwable throwable )
111        {
112        super( throwable );
113        }
114    
115      /**
116       * Constructor PlannerException creates a new PlannerException instance.
117       *
118       * @param string       of type String
119       * @param throwable    of type Throwable
120       * @param elementGraph of type SimpleDirectedGraph<FlowElement, Scope>
121       */
122      public PlannerException( String string, Throwable throwable, ElementGraph elementGraph )
123        {
124        super( string, throwable );
125        this.elementGraph = elementGraph;
126        }
127    
128      /**
129       * Method getPipeGraph returns the pipeGraph of this PlannerException object.
130       *
131       * @return the pipeGraph (type SimpleDirectedGraph<FlowElement, Scope>) of this PlannerException object.
132       */
133      SimpleDirectedGraph<FlowElement, Scope> getElementGraph()
134        {
135        return elementGraph;
136        }
137    
138      /**
139       * Method writeDOT writes the failed Flow instance to the given filename as a DOT file for import into a graphics package.
140       *
141       * @param filename of type String
142       */
143      public void writeDOT( String filename )
144        {
145        if( elementGraph == null )
146          return;
147    
148        elementGraph.writeDOT( filename );
149        }
150      }