    001/*
    002 * Copyright (c) 2016 Chris K Wensel <chris@wensel.net>. All Rights Reserved.
    003 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
    004 *
    005 * Project and contact information: http://www.cascading.org/
    006 *
    007 * This file is part of the Cascading project.
    008 *
    009 * Licensed under the Apache License, Version 2.0 (the "License");
    010 * you may not use this file except in compliance with the License.
    011 * You may obtain a copy of the License at
    012 *
    013 *     http://www.apache.org/licenses/LICENSE-2.0
    014 *
    015 * Unless required by applicable law or agreed to in writing, software
    016 * distributed under the License is distributed on an "AS IS" BASIS,
    017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    018 * See the License for the specific language governing permissions and
    019 * limitations under the License.
    020 */
    021
    022package cascading.platform.local;
    023
    024import java.io.File;
    025import java.io.IOException;
    026import java.util.Comparator;
    027import java.util.Map;
    028import java.util.Properties;
    029
    030import cascading.flow.FlowConnector;
    031import cascading.flow.FlowProcess;
    032import cascading.flow.FlowSession;
    033import cascading.flow.local.LocalFlowConnector;
    034import cascading.flow.local.LocalFlowProcess;
    035import cascading.platform.TestPlatform;
    036import cascading.property.PropertyUtil;
    037import cascading.scheme.Scheme;
    038import cascading.scheme.local.TextDelimited;
    039import cascading.scheme.local.TextLine;
    040import cascading.scheme.util.DelimitedParser;
    041import cascading.scheme.util.FieldTypeResolver;
    042import cascading.tap.SinkMode;
    043import cascading.tap.Tap;
    044import cascading.tap.local.FileTap;
    045import cascading.tap.local.PartitionTap;
    046import cascading.tap.partition.Partition;
    047import cascading.tuple.Fields;
    048import org.apache.commons.io.FileUtils;
    049
    050/**
    051 * Class LocalPlatform is automatically loaded and injected into a {@link cascading.PlatformTestCase} instance
    052 * so that all *PlatformTest classes can be tested against the Cascading local mode planner.
    053 */
    054public class LocalPlatform extends TestPlatform
    055  {
    056  private Properties properties = new Properties();
    057
    058  @Override
    059  public void setUp() throws IOException
    060    {
    061    properties.putAll( getGlobalProperties() );
    062    }
    063
    064  @Override
    065  public Map<Object, Object> getProperties()
    066    {
    067    return PropertyUtil.asFlatMap( properties );
    068    }
    069
    070  @Override
    071  public void tearDown()
    072    {
    073    }
    074
    075  @Override
    076  public void copyFromLocal( String inputFile ) throws IOException
    077    {
    078    }
    079
    080  @Override
    081  public void copyToLocal( String outputFile ) throws IOException
    082    {
    083    }
    084
    085  @Override
    086  public boolean remoteExists( String outputFile ) throws IOException
    087    {
    088    return new File( outputFile ).exists();
    089    }
    090
    091  @Override
    092  public boolean remoteRemove( String outputFile, boolean recursive ) throws IOException
    093    {
    094    if( !remoteExists( outputFile ) )
    095      return true;
    096
    097    File file = new File( outputFile );
    098
    099    if( !recursive || !file.isDirectory() )
    100      return file.delete();
    101
    102    try
    103      {
    104      FileUtils.deleteDirectory( file );
    105      }
    106    catch( IOException exception )
    107      {
    108      return false;
    109      }
    110
    111    return !file.exists();
    112    }
    113
    114  @Override
    115  public FlowProcess getFlowProcess()
    116    {
    117    return new LocalFlowProcess( FlowSession.NULL, PropertyUtil.createProperties( getProperties(), null ) );
    118    }
    119
    120  @Override
    121  public FlowConnector getFlowConnector( Map<Object, Object> properties )
    122    {
    123    return new LocalFlowConnector( properties );
    124    }
    125
    126  @Override
    127  public Tap getTap( Scheme scheme, String filename, SinkMode mode )
    128    {
    129    return new FileTap( scheme, filename, mode );
    130    }
    131
    132  @Override
    133  public Tap getTextFile( Fields sourceFields, Fields sinkFields, String filename, SinkMode mode )
    134    {
    135    if( sourceFields == null )
    136      return new FileTap( new TextLine(), filename, mode );
    137
    138    return new FileTap( new TextLine( sourceFields, sinkFields ), filename, mode );
    139    }
    140
    141  @Override
    142  public Tap getDelimitedFile( Fields fields, boolean hasHeader, String delimiter, String quote, Class[] types, String filename, SinkMode mode )
    143    {
    144    return new FileTap( new TextDelimited( fields, hasHeader, delimiter, quote, types ), filename, mode );
    145    }
    146
    147  @Override
    148  public Tap getDelimitedFile( Fields fields, boolean skipHeader, boolean writeHeader, String delimiter, String quote, Class[] types, String filename, SinkMode mode )
    149    {
    150    return new FileTap( new TextDelimited( fields, skipHeader, writeHeader, delimiter, quote, types ), filename, mode );
    151    }
    152
    153  @Override
    154  public Tap getDelimitedFile( String delimiter, String quote, FieldTypeResolver fieldTypeResolver, String filename, SinkMode mode )
    155    {
    156    return new FileTap( new TextDelimited( true, new DelimitedParser( delimiter, quote, fieldTypeResolver ) ), filename, mode );
    157    }
    158
    159  @Override
    160  public Tap getPartitionTap( Tap sink, Partition partition, int openThreshold )
    161    {
    162    return new PartitionTap( (FileTap) sink, partition, openThreshold );
    163    }
    164
    165  @Override
    166  public Scheme getTestConfigDefScheme()
    167    {
    168    return new LocalConfigDefScheme( new Fields( "line" ) );
    169    }
    170
    171  @Override
    172  public Scheme getTestFailScheme()
    173    {
    174    return new LocalFailScheme( new Fields( "line" ) );
    175    }
    176
    177  @Override
    178  public Comparator getLongComparator( boolean reverseSort )
    179    {
    180    return new TestLongComparator( reverseSort );
    181    }
    182
    183  @Override
    184  public Comparator getStringComparator( boolean reverseSort )
    185    {
    186    return new TestStringComparator( reverseSort );
    187    }
    188
    189  @Override
    190  public String getHiddenTemporaryPath()
    191    {
    192    return null;
    193    }
    194  }