Newer
Older
MagnetRON / src / org / ntlab / deltaViewer / CollaborationAliasCollector.java
package org.ntlab.deltaViewer;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import org.ntlab.deltaExtractor.Alias;
import org.ntlab.deltaExtractor.IAliasCollector;

/**
 * CollaborationAliasCollector is IAliasCollector implementation class to merge aliasList in time stamp order.
 * 
 * @author Nitta Lab.
 */
public class CollaborationAliasCollector implements IAliasCollector {
	// Execution order.
	private List<Alias> aliasList = new ArrayList<>();

	public CollaborationAliasCollector(IAliasCollector dac) {
		aliasList.addAll(dac.getAliasList());
		aliasList = sort(aliasList);
	}
	
	/*
	 * Don't write anything here.
	 */
	@Override
	public void addAlias(Alias alias) {
	}

	@Override
	public List<Alias> getAliasList() {
		return aliasList;
	}

	/**
	 * Merge other into aliasList(this) in time stamp order.
	 * @param other IAliasCollector to be merged into the aliasList.
	 */
	public void merge(IAliasCollector other) {
		List<Alias> otherAliasList = other.getAliasList();
		otherAliasList = sort(otherAliasList);
		int otherIdx = 0; // Index of otherAliasList
		int thisIdx = 0; // Index of thisAliasList
		while(otherIdx < otherAliasList.size()) {
			Alias otherAlias = otherAliasList.get(otherIdx);
			if (thisIdx >= aliasList.size()) {
				aliasList.add(otherAlias);
				otherIdx++; thisIdx++;
				continue;
			}
			
			Alias thisAlias = aliasList.get(thisIdx);
			if (otherAlias.equals(thisAlias)) {
				otherIdx++; thisIdx++;
			} else {
				long otherAliasTs = otherAlias.getTimeStamp();
				long thisAliasTs = thisAlias.getTimeStamp();
				
				if (otherAliasTs < thisAliasTs) {
					aliasList.add(thisIdx, otherAlias);
					otherIdx++; thisIdx++;
				} else if (otherAliasTs > thisAliasTs) {
					thisIdx++;
				} else {
					if (aliasList.contains(otherAlias)) {
						otherIdx++;
					} else {
						// BUGがあるかもしれません(ACTUAL_ARGUMENTとRECEIVERの出現順)
						aliasList.add(thisIdx, otherAlias);
						otherIdx++; thisIdx++;
					}
				}
			}
		}
	}
	
	/**
	 * Sort aliasList in time stamp order.
	 * @param aliasList AliasList to sort.
	 * @return Sorted AliasList.
	 */
	private List<Alias> sort(List<Alias> aliasList) {
		List<Alias> cloneAliasList = new ArrayList<>(aliasList);
		List<Alias> sortedAliasList = cloneAliasList.stream().sorted(new Comparator<Alias>() {
	                @Override
	                public int compare(Alias alias1, Alias alias2) {
	                	if (alias1.getTimeStamp() > alias2.getTimeStamp()) return 1;
	                	else if (alias1.getTimeStamp() < alias2.getTimeStamp()) return -1;
	                	return 0;
	                }
	            }
	        ).collect(Collectors.toList());
		return sortedAliasList;
	}
}