package com.smash.revolance.ui.comparator.element;
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ui-monitoring-comparator
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Copyright (C) 2012 - 2014 RevoLance
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
import com.smash.revolance.ui.comparator.NoMatchFound;
import com.smash.revolance.ui.model.element.api.ElementBean;
import org.apache.commons.lang3.ArrayUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* User: wsmash
* Date: 09/06/13
* Time: 13:01
*/
public class ElementMatchMaker implements IElementMatchMaker
{
@Override
public ElementMatch getBestMatch(Collection<ElementMatch> matches) throws NoMatchFound, IllegalArgumentException
{
if ( matches.isEmpty() )
{
throw new IllegalArgumentException( "Empty collection of matches cannot be analysed." );
}
ElementMatch bestMatch = new ElementMatch();
for ( ElementMatch match : matches )
{
if ( match.getRate() > bestMatch.getRate() )
{
bestMatch = match;
}
}
if ( bestMatch.getMatch() == null )
{
throw new NoMatchFound( "Unable to find a match." );
} else
{
return bestMatch;
}
}
@Override
public Collection<ElementMatch> findMatch(Collection<ElementBean> elements, ElementBean element, ElementSearchMethod... methods) throws NoMatchFound, IllegalArgumentException
{
if ( elements == null )
{
throw new IllegalArgumentException( "Null content cannot be parsed" );
}
if ( element == null )
{
throw new IllegalArgumentException( "Null element cannot be matched." );
}
if ( elements.isEmpty() )
{
throw new NoMatchFound( "Unable to find a single match. Empty element collection passed in." );
}
Collection<ElementBean> localElements = new ArrayList<ElementBean>();
localElements.addAll( elements );
if ( localElements.contains( element ) )
{
localElements.remove( element );
}
List<ElementMatch> matches = getElementMatches( element, localElements, methods );
if ( matches.isEmpty() )
{
throw new NoMatchFound( "Unable to find a single match." );
} else
{
return matches;
}
}
private List<ElementMatch> getElementMatches(ElementBean element, Collection<ElementBean> elements, ElementSearchMethod... methods)
{
List<ElementMatch> results = new ArrayList<ElementMatch>();
ElementBean match = null;
if ( ArrayUtils.contains( methods, ElementSearchMethod.LOOK ) )
{
match = null;
if ( ( match = findElementByLook( elements, element ) ) != null )
{
ElementMatch elementMatch = new ElementMatch( match );
elementMatch.setMatch( element, 1 );
results.add( elementMatch );
}
}
if ( ArrayUtils.contains( methods, ElementSearchMethod.VALUE ) )
{
match = null;
if ( ( match = findElementByContent( elements, element ) ) != null )
{
ElementMatch elementMatch = new ElementMatch( match );
elementMatch.setMatch( element, 1 );
results.add( elementMatch );
}
}
if ( ArrayUtils.contains( methods, ElementSearchMethod.POS ) )
{
match = null;
if ( ( match = findElementByLocation( elements, element ) ) != null )
{
ElementMatch elementMatch = new ElementMatch( match );
elementMatch.setMatch( element, 1 );
results.add( elementMatch );
}
}
if ( ArrayUtils.contains( methods, ElementSearchMethod.TARGET )
&& ( element.getImpl().contentEquals( "Button" ) || element.getImpl().contentEquals( "Link" ) ) )
{
match = null;
if ( ( match = findElementByTarget( elements, element ) ) != null )
{
ElementMatch elementMatch = new ElementMatch( match );
elementMatch.setMatch( element, 1 );
results.add( elementMatch );
}
}
return results;
}
public static ElementBean findElementByLocation(Collection<ElementBean> elements, ElementBean element)
{
for ( ElementBean elem : elements )
{
if ( ElementComparator.posEquals( element, elem ) )
{
return elem;
}
}
return null;
}
public static ElementBean findElementByTarget(Collection<ElementBean> elements, ElementBean element)
{
for ( ElementBean elem : elements )
{
if ( ElementComparator.targetEquals( element, elem ) )
{
return elem;
}
}
return null;
}
public static ElementBean findElementByContent(Collection<ElementBean> elements, ElementBean element)
{
for ( ElementBean elem : elements )
{
if ( ElementComparator.valueEquals( element, elem ) )
{
return elem;
}
}
return null;
}
public static ElementBean findElementByLook(Collection<ElementBean> elements, ElementBean element)
{
for ( ElementBean elementBean : elements )
{
if ( ElementComparator.lookEquals( element, elementBean ) )
{
return elementBean;
}
}
return null;
}
}