    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;
    022
    023import java.util.HashMap;
    024import java.util.Map;
    025import java.util.Properties;
    026
    027import cascading.flow.Flow;
    028import cascading.flow.FlowDef;
    029import cascading.flow.planner.iso.transformer.ElementFactory;
    030import cascading.flow.planner.rule.RuleRegistry;
    031import cascading.operation.PlannerLevel;
    032import cascading.property.PropertyUtil;
    033import cascading.util.ProcessLogger;
    034
    035/**
    036 *
    037 */
    038public class PlannerContext
    039  {
    040  public static final PlannerContext NULL = new PlannerContext();
    041
    042  RuleRegistry ruleRegistry;
    043  FlowPlanner flowPlanner;
    044  FlowDef flowDef;
    045  Flow flow;
    046  boolean isTransformTracingEnabled = false;
    047  private Map properties;
    048
    049  public PlannerContext()
    050    {
    051    this.properties = new Properties();
    052    }
    053
    054  public PlannerContext( RuleRegistry ruleRegistry )
    055    {
    056    this.ruleRegistry = ruleRegistry;
    057    }
    058
    059  public PlannerContext( RuleRegistry ruleRegistry, FlowPlanner flowPlanner, FlowDef flowDef, Flow flow, boolean isTransformTracingEnabled )
    060    {
    061    this.ruleRegistry = ruleRegistry;
    062    this.flowPlanner = flowPlanner;
    063    this.flowDef = flowDef;
    064    this.flow = flow;
    065    this.isTransformTracingEnabled = isTransformTracingEnabled;
    066
    067    if( flowPlanner != null )
    068      this.properties = flowPlanner.getDefaultProperties();
    069    else
    070      this.properties = new Properties();
    071    }
    072
    073  public String getStringProperty( String property )
    074    {
    075    return PropertyUtil.getStringProperty( System.getProperties(), properties, property );
    076    }
    077
    078  public int getIntProperty( String property, int defaultValue )
    079    {
    080    return PropertyUtil.getIntProperty( System.getProperties(), properties, property, defaultValue );
    081    }
    082
    083  public RuleRegistry getRuleRegistry()
    084    {
    085    return ruleRegistry;
    086    }
    087
    088  public FlowPlanner getFlowPlanner()
    089    {
    090    return flowPlanner;
    091    }
    092
    093  public FlowDef getFlowDef()
    094    {
    095    return flowDef;
    096    }
    097
    098  public Flow getFlow()
    099    {
    100    return flow;
    101    }
    102
    103  public ProcessLogger getLogger()
    104    {
    105    Flow flow = getFlow();
    106
    107    if( flow == null )
    108      return ProcessLogger.NULL;
    109
    110    return (ProcessLogger) flow;
    111    }
    112
    113  public boolean isTransformTracingEnabled()
    114    {
    115    return isTransformTracingEnabled;
    116    }
    117
    118  public PlannerLevel getPlannerLevelFor( Class<? extends PlannerLevel> plannerLevelClass )
    119    {
    120    Map<Class<? extends PlannerLevel>, PlannerLevel> levels = new HashMap<>();
    121
    122    addLevel( levels, flowPlanner.getDebugLevel( flowDef ) );
    123    addLevel( levels, flowPlanner.getAssertionLevel( flowDef ) );
    124
    125    return levels.get( plannerLevelClass );
    126    }
    127
    128  private void addLevel( Map<Class<? extends PlannerLevel>, PlannerLevel> levels, PlannerLevel level )
    129    {
    130    if( level != null )
    131      levels.put( level.getClass(), level );
    132    }
    133
    134  public ElementFactory getElementFactoryFor( String factoryName )
    135    {
    136    return ruleRegistry.getElementFactory( factoryName );
    137    }
    138  }