package com.smash.revolance.ui.comparator.page; /* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 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.element.ElementComparison; import com.smash.revolance.ui.comparator.page.content.ContentComparator; import com.smash.revolance.ui.comparator.page.content.IContentComparator; import com.smash.revolance.ui.model.diff.DiffType; import com.smash.revolance.ui.model.diff.PageDiffType; import com.smash.revolance.ui.model.element.api.ElementBean; import com.smash.revolance.ui.model.page.api.PageBean; import org.springframework.stereotype.Service; import java.awt.*; import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * User: wsmash * Date: 09/06/13 * Time: 10:53 */ @Service public class PageComparator implements IPageComparator { IContentComparator contentComparator = new ContentComparator(); @Override public PageComparison compare(PageBean page, PageBean reference) { if ( reference == null ) { throw new InvalidParameterException( "Null page reference passed in for comparison." ); } if ( page == null ) { throw new InvalidParameterException( "Null page passed in for comparison." ); } PageComparison comparison = new PageComparison( reference ); comparison.setMatch( page ); if ( page == null ) { comparison.setDiffType( DiffType.DELETED ); } else if ( reference == null ) { comparison.setDiffType( DiffType.ADDED ); } else { if ( !urlEquals( reference, page ) ) { comparison.addPageDifferency( PageDiffType.URL ); } if ( !layoutEquals( reference, page ) ) { comparison.addPageDifferency( PageDiffType.LAYOUT ); } if ( !contentEquals( reference, page ) ) { comparison.addPageDifferency( PageDiffType.CONTENT ); } if ( !lookEquals( reference, page ) ) { comparison.addPageDifferency( PageDiffType.LOOK ); } if ( !titleEquals( reference, page ) ) { comparison.addPageDifferency( PageDiffType.TITLE ); } if(comparison.getPageDifferencies().isEmpty()) { comparison.setDiffType( DiffType.BASE ); } else { comparison.setDiffType( DiffType.CHANGED ); } Collection<ElementComparison> comparisons = contentComparator.compare( reference.getContent(), page.getContent() ); for ( ElementComparison elementComparison : comparisons ) { comparison.addElementComparison( elementComparison ); } } return comparison; } private boolean titleEquals(PageBean reference, PageBean page) { return reference.getTitle().contentEquals( page.getTitle() ); } private boolean lookEquals(PageBean reference, PageBean page) { return reference.getCaption().contentEquals( page.getCaption() ); } private boolean contentEquals(PageBean reference, PageBean page) { List<String> refElementValue = PageMatchMaker.getContentValue( reference.getContent() ); for ( String contentValues : PageMatchMaker.getContentValue( page.getContent() ) ) { if ( refElementValue.contains( contentValues ) ) { refElementValue.remove( contentValues ); } } return refElementValue.isEmpty(); } private boolean layoutEquals(PageBean reference, PageBean page) { List<Rectangle> layout = getLayout( page ); for ( Rectangle refElementRect : getLayout( reference ) ) { int matchCount = 0; for ( Rectangle pageElementRect : layout ) { if ( refElementRect.getX() == pageElementRect.getX() && refElementRect.getY() == pageElementRect.getY() && refElementRect.getWidth() == pageElementRect.getWidth() && refElementRect.getHeight() == pageElementRect.getHeight() ) { matchCount++; } } if ( layout.size() == matchCount ) { return true; } } return false; } private List<Rectangle> getLayout(PageBean page) { List<Rectangle> layout = new ArrayList<Rectangle>(); for ( ElementBean element : page.getContent() ) { layout.add( element.getLocation() ); } return layout; } private boolean urlEquals(PageBean reference, PageBean page) { return reference.getUrl().contentEquals( page.getUrl() ); } }