package org.projectusus.ui.internal; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.projectusus.core.basis.FileHotspot; import org.projectusus.core.basis.Hotspot; import org.projectusus.core.basis.PackageHotspot; import org.projectusus.core.basis.SinglePackageHotspot; import com.google.common.collect.Sets; class DisplayHotspotCreator { private final Set<Hotspot> oldHotspots; private final Set<Hotspot> currentHotspots; public DisplayHotspotCreator( List<Hotspot> oldHotspots, List<Hotspot> currentHotspots ) { super(); this.oldHotspots = new HashSet<Hotspot>( oldHotspots ); this.currentHotspots = new HashSet<Hotspot>( currentHotspots ); } public List<DisplayHotspot<?>> hotspots() { Set<DisplayHotspot<?>> result = new HashSet<DisplayHotspot<?>>(); Set<Hotspot> oldNotInNew = Sets.difference( oldHotspots, currentHotspots ); for( Hotspot hotspot : oldNotInNew ) { result.add( createDisplayHotspot( hotspot, null ) ); } Set<Hotspot> newNotInOld = Sets.difference( currentHotspots, oldHotspots ); for( Hotspot hotspot : newNotInOld ) { result.add( createDisplayHotspot( null, hotspot ) ); } Set<Hotspot> oldAlsoInNew = Sets.difference( oldHotspots, oldNotInNew ); Set<Hotspot> newAlsoInOld = Sets.difference( currentHotspots, newNotInOld ); List<Hotspot> oldInNewSorted = new ArrayList<Hotspot>( oldAlsoInNew ); List<Hotspot> newInOldSorted = new ArrayList<Hotspot>( newAlsoInOld ); Collections.sort( oldInNewSorted ); Collections.sort( newInOldSorted ); for( int i = 0; i < oldInNewSorted.size(); i++ ) { Hotspot oldHotspot = oldInNewSorted.get( i ); Hotspot newHotspot = newInOldSorted.get( i ); if( !oldHotspot.getName().equals( newHotspot.getName() ) ) { continue; // TODO throw Exception? } result.add( createDisplayHotspot( oldHotspot, newHotspot ) ); } List<DisplayHotspot<?>> resultList = new ArrayList<DisplayHotspot<?>>( result ); Collections.sort( resultList ); return resultList; } private DisplayHotspot<?> createDisplayHotspot( Hotspot oldHotspot, Hotspot newHotspot ) { if( oldHotspot instanceof FileHotspot || newHotspot instanceof FileHotspot ) { return new FileDisplayHotspot( (FileHotspot)oldHotspot, (FileHotspot)newHotspot ); } if( oldHotspot instanceof SinglePackageHotspot || newHotspot instanceof SinglePackageHotspot ) { return new SinglePackageDisplayHotspot( (SinglePackageHotspot)oldHotspot, (SinglePackageHotspot)newHotspot ); } return new PackageDisplayHotspot( (PackageHotspot)oldHotspot, (PackageHotspot)newHotspot ); } }