/*******************************************************************************
* 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 java.util.Collection;
import java.util.Set;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import cuchaz.enigma.mapping.ClassEntry;
import cuchaz.enigma.mapping.FieldEntry;
public class FieldMatches
{
private BiMap<FieldEntry, FieldEntry> m_matches;
private Multimap<ClassEntry, FieldEntry> m_matchedSourceFields;
private Multimap<ClassEntry, FieldEntry> m_unmatchedSourceFields;
private Multimap<ClassEntry, FieldEntry> m_unmatchedDestFields;
private Multimap<ClassEntry, FieldEntry> m_unmatchableSourceFields;
public FieldMatches()
{
m_matches = HashBiMap.create();
m_matchedSourceFields = HashMultimap.create();
m_unmatchedSourceFields = HashMultimap.create();
m_unmatchedDestFields = HashMultimap.create();
m_unmatchableSourceFields = HashMultimap.create();
}
public void addMatch(FieldEntry srcField, FieldEntry destField)
{
boolean wasAdded = m_matches.put(srcField, destField) == null;
assert wasAdded;
wasAdded =
m_matchedSourceFields.put(srcField.getClassEntry(), srcField);
assert wasAdded;
}
public void addUnmatchedSourceField(FieldEntry fieldEntry)
{
boolean wasAdded =
m_unmatchedSourceFields.put(fieldEntry.getClassEntry(), fieldEntry);
assert wasAdded;
}
public void addUnmatchedSourceFields(Iterable<FieldEntry> fieldEntries)
{
for(FieldEntry fieldEntry : fieldEntries)
addUnmatchedSourceField(fieldEntry);
}
public void addUnmatchedDestField(FieldEntry fieldEntry)
{
boolean wasAdded =
m_unmatchedDestFields.put(fieldEntry.getClassEntry(), fieldEntry);
assert wasAdded;
}
public void addUnmatchedDestFields(Iterable<FieldEntry> fieldEntries)
{
for(FieldEntry fieldEntry : fieldEntries)
addUnmatchedDestField(fieldEntry);
}
public void addUnmatchableSourceField(FieldEntry sourceField)
{
boolean wasAdded =
m_unmatchableSourceFields.put(sourceField.getClassEntry(),
sourceField);
assert wasAdded;
}
public Set<ClassEntry> getSourceClassesWithUnmatchedFields()
{
return m_unmatchedSourceFields.keySet();
}
public Collection<ClassEntry> getSourceClassesWithoutUnmatchedFields()
{
Set<ClassEntry> out = Sets.newHashSet();
out.addAll(m_matchedSourceFields.keySet());
out.removeAll(m_unmatchedSourceFields.keySet());
return out;
}
public Collection<FieldEntry> getUnmatchedSourceFields()
{
return m_unmatchedSourceFields.values();
}
public Collection<FieldEntry> getUnmatchedSourceFields(
ClassEntry sourceClass)
{
return m_unmatchedSourceFields.get(sourceClass);
}
public Collection<FieldEntry> getUnmatchedDestFields()
{
return m_unmatchedDestFields.values();
}
public Collection<FieldEntry> getUnmatchedDestFields(ClassEntry destClass)
{
return m_unmatchedDestFields.get(destClass);
}
public Collection<FieldEntry> getUnmatchableSourceFields()
{
return m_unmatchableSourceFields.values();
}
public boolean hasSource(FieldEntry fieldEntry)
{
return m_matches.containsKey(fieldEntry)
|| m_unmatchedSourceFields.containsValue(fieldEntry);
}
public boolean hasDest(FieldEntry fieldEntry)
{
return m_matches.containsValue(fieldEntry)
|| m_unmatchedDestFields.containsValue(fieldEntry);
}
public BiMap<FieldEntry, FieldEntry> matches()
{
return m_matches;
}
public boolean isMatchedSourceField(FieldEntry sourceField)
{
return m_matches.containsKey(sourceField);
}
public boolean isMatchedDestField(FieldEntry destField)
{
return m_matches.containsValue(destField);
}
public void makeMatch(FieldEntry sourceField, FieldEntry destField)
{
boolean wasRemoved =
m_unmatchedSourceFields.remove(sourceField.getClassEntry(),
sourceField);
assert wasRemoved;
wasRemoved =
m_unmatchedDestFields.remove(destField.getClassEntry(), destField);
assert wasRemoved;
addMatch(sourceField, destField);
}
public boolean isMatched(FieldEntry sourceField, FieldEntry destField)
{
FieldEntry match = m_matches.get(sourceField);
return match != null && match.equals(destField);
}
public void unmakeMatch(FieldEntry sourceField, FieldEntry destField)
{
boolean wasRemoved = m_matches.remove(sourceField) != null;
assert wasRemoved;
wasRemoved =
m_matchedSourceFields.remove(sourceField.getClassEntry(),
sourceField);
assert wasRemoved;
addUnmatchedSourceField(sourceField);
addUnmatchedDestField(destField);
}
public void makeSourceUnmatchable(FieldEntry sourceField)
{
assert !isMatchedSourceField(sourceField);
boolean wasRemoved =
m_unmatchedSourceFields.remove(sourceField.getClassEntry(),
sourceField);
assert wasRemoved;
addUnmatchableSourceField(sourceField);
}
}