/*******************************************************************************
* Copyright (c) 2015 Jeff Martin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public
* License v3.0 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* Contributors:
* Jeff Martin - initial API and implementation
******************************************************************************/
package cuchaz.enigma.convert;
import com.google.common.collect.*;
import cuchaz.enigma.mapping.ClassEntry;
import cuchaz.enigma.mapping.FieldEntry;
import java.util.Collection;
import java.util.Set;
public class FieldMatches {
private BiMap matches;
private Multimap matchedSourceFields;
private Multimap unmatchedSourceFields;
private Multimap unmatchedDestFields;
private Multimap unmatchableSourceFields;
public FieldMatches() {
matches = HashBiMap.create();
matchedSourceFields = HashMultimap.create();
unmatchedSourceFields = HashMultimap.create();
unmatchedDestFields = HashMultimap.create();
unmatchableSourceFields = HashMultimap.create();
}
public void addMatch(FieldEntry srcField, FieldEntry destField) {
boolean wasAdded = matches.put(srcField, destField) == null;
assert (wasAdded);
wasAdded = matchedSourceFields.put(srcField.getClassEntry(), srcField);
assert (wasAdded);
}
public void addUnmatchedSourceField(FieldEntry fieldEntry) {
boolean wasAdded = unmatchedSourceFields.put(fieldEntry.getClassEntry(), fieldEntry);
assert (wasAdded);
}
public void addUnmatchedSourceFields(Iterable fieldEntries) {
for (FieldEntry fieldEntry : fieldEntries) {
addUnmatchedSourceField(fieldEntry);
}
}
public void addUnmatchedDestField(FieldEntry fieldEntry) {
boolean wasAdded = unmatchedDestFields.put(fieldEntry.getClassEntry(), fieldEntry);
assert (wasAdded);
}
public void addUnmatchedDestFields(Iterable fieldEntries) {
for (FieldEntry fieldEntry : fieldEntries) {
addUnmatchedDestField(fieldEntry);
}
}
public void addUnmatchableSourceField(FieldEntry sourceField) {
boolean wasAdded = unmatchableSourceFields.put(sourceField.getClassEntry(), sourceField);
assert (wasAdded);
}
public Set getSourceClassesWithUnmatchedFields() {
return unmatchedSourceFields.keySet();
}
public Collection getSourceClassesWithoutUnmatchedFields() {
Set out = Sets.newHashSet();
out.addAll(matchedSourceFields.keySet());
out.removeAll(unmatchedSourceFields.keySet());
return out;
}
public Collection getUnmatchedSourceFields() {
return unmatchedSourceFields.values();
}
public Collection getUnmatchedSourceFields(ClassEntry sourceClass) {
return unmatchedSourceFields.get(sourceClass);
}
public Collection getUnmatchedDestFields() {
return unmatchedDestFields.values();
}
public Collection getUnmatchedDestFields(ClassEntry destClass) {
return unmatchedDestFields.get(destClass);
}
public Collection getUnmatchableSourceFields() {
return unmatchableSourceFields.values();
}
public boolean hasSource(FieldEntry fieldEntry) {
return matches.containsKey(fieldEntry) || unmatchedSourceFields.containsValue(fieldEntry);
}
public boolean hasDest(FieldEntry fieldEntry) {
return matches.containsValue(fieldEntry) || unmatchedDestFields.containsValue(fieldEntry);
}
public BiMap matches() {
return matches;
}
public boolean isMatchedSourceField(FieldEntry sourceField) {
return matches.containsKey(sourceField);
}
public boolean isMatchedDestField(FieldEntry destField) {
return matches.containsValue(destField);
}
public void makeMatch(FieldEntry sourceField, FieldEntry destField) {
boolean wasRemoved = unmatchedSourceFields.remove(sourceField.getClassEntry(), sourceField);
assert (wasRemoved);
wasRemoved = unmatchedDestFields.remove(destField.getClassEntry(), destField);
assert (wasRemoved);
addMatch(sourceField, destField);
}
public boolean isMatched(FieldEntry sourceField, FieldEntry destField) {
FieldEntry match = matches.get(sourceField);
return match != null && match.equals(destField);
}
public void unmakeMatch(FieldEntry sourceField, FieldEntry destField) {
boolean wasRemoved = matches.remove(sourceField) != null;
assert (wasRemoved);
wasRemoved = matchedSourceFields.remove(sourceField.getClassEntry(), sourceField);
assert (wasRemoved);
addUnmatchedSourceField(sourceField);
addUnmatchedDestField(destField);
}
public void makeSourceUnmatchable(FieldEntry sourceField) {
assert (!isMatchedSourceField(sourceField));
boolean wasRemoved = unmatchedSourceFields.remove(sourceField.getClassEntry(), sourceField);
assert (wasRemoved);
addUnmatchableSourceField(sourceField);
}
}