    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.operation.assertion;
    022
    023    import java.beans.ConstructorProperties;
    024    import java.util.regex.Matcher;
    025
    026    import cascading.flow.FlowProcess;
    027    import cascading.operation.AssertionLevel;
    028    import cascading.operation.PlannerLevel;
    029    import cascading.operation.ValueAssertion;
    030    import cascading.operation.ValueAssertionCall;
    031    import cascading.operation.regex.RegexMatcher;
    032    import cascading.tuple.Tuple;
    033
    034    /**
    035     * Class AssertMatches matches the given regular expression patternString against the whole argument
    036     * {@link cascading.tuple.Tuple} by joining each individual element of the Tuple with a tab character (\t).
    037     * See {@link AssertMatchesAll} if you need to match the patternString regex against each individual tuple element.
    038     * <p/>
    039     * This operation uses {@link java.util.regex.Matcher} internally, specifically the method {@link java.util.regex.Matcher#find()}.
    040     *
    041     * @see java.util.regex.Matcher
    042     * @see java.util.regex.Pattern
    043     */
    044    public class AssertMatches extends RegexMatcher implements ValueAssertion<Matcher>
    045      {
    046      /** Field message */
    047      private final static String message = "argument tuple: %s did not match: %s";
    048
    049      /**
    050       * Constructor AssertMatches creates a new AssertMatches instance.
    051       *
    052       * @param patternString of type String
    053       */
    054      @ConstructorProperties({"patternString"})
    055      public AssertMatches( String patternString )
    056        {
    057        super( patternString, false );
    058        }
    059
    060      /**
    061       * Constructor AssertMatches creates a new AssertMatches instance.
    062       *
    063       * @param patternString of type String
    064       * @param negateMatch   of type boolean
    065       */
    066      @ConstructorProperties({"patternString", "negateMatch"})
    067      public AssertMatches( String patternString, boolean negateMatch )
    068        {
    069        super( patternString, negateMatch );
    070        }
    071
    072      @Override
    073      public boolean supportsPlannerLevel( PlannerLevel plannerLevel )
    074        {
    075        return plannerLevel instanceof AssertionLevel;
    076        }
    077
    078      @Override
    079      public void doAssert( FlowProcess flowProcess, ValueAssertionCall<Matcher> assertionCall )
    080        {
    081        Tuple tuple = assertionCall.getArguments().getTuple();
    082
    083        if( matchWholeTuple( assertionCall.getContext(), tuple ) )
    084          BaseAssertion.throwFail( message, tuple.print(), patternString );
    085        }
    086      }