/*******************************************************************************
* Copyright (c) 2012 OpenLegacy Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* OpenLegacy Inc. - initial API and implementation
*******************************************************************************/
package org.openlegacy.designtime.analyzer.support;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openlegacy.Snapshot;
import org.openlegacy.designtime.analyzer.SnapshotsOrganizer;
import org.openlegacy.designtime.analyzer.SnapshotsSimilarityChecker;
import org.openlegacy.designtime.terminal.analyzer.SnapshotPickerStrategy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
public abstract class AbstractSnapshotsOrganizer<S extends Snapshot> implements SnapshotsOrganizer<S> {
@Inject
private SnapshotsSimilarityChecker<S> snapshotsSimilarityChecker;
private Collection<Set<S>> snapshotGroups = new ArrayList<Set<S>>();
private int matchingPercent = 99;
private final static Log logger = LogFactory.getLog(AbstractSnapshotsOrganizer.class);
public Collection<Set<S>> getGroups() {
return Collections.unmodifiableCollection(snapshotGroups);
}
public Collection<S> getGroupsRepresenters(SnapshotPickerStrategy<S> snapshotPickerStrategy) {
Collection<Set<S>> groups = getGroups();
List<S> result = new ArrayList<S>();
for (Set<S> group : groups) {
S snapshot = snapshotPickerStrategy.pickRepresenter(group);
if (snapshot != null) {
result.add(snapshot);
}
}
return result;
}
public void add(Collection<S> snapshots) {
for (S snapshot : snapshots) {
addSnapshotToGroup(snapshot);
}
}
private void addSnapshotToGroup(S snapshot) {
Collection<Set<S>> groups = getGroups();
boolean found = false;
for (Set<S> group : groups) {
S groupFirstSnapshot = group.iterator().next();
int snapshotsSimilarityPercent = snapshotsSimilarityChecker.similarityPercent(snapshot, groupFirstSnapshot);
if (snapshotsSimilarityPercent > matchingPercent) {
if (logger.isTraceEnabled() && snapshotsSimilarityPercent < 100) {
logger.trace("\n*************************************************************************************");
logger.trace("Matched snapshot to group by " + snapshotsSimilarityPercent);
logger.trace("Snapshot:\n" + snapshot);
logger.trace("Group representive snapshot:\n" + groupFirstSnapshot);
}
group.add(snapshot);
found = true;
}
}
if (!found) {
Set<S> group = new HashSet<S>();
group.add(snapshot);
snapshotGroups.add(group);
}
}
public void setMatchingPercent(int matchingPercent) {
this.matchingPercent = matchingPercent;
}
public void clear() {
snapshotGroups.clear();
}
}