From 1ad33bfe0a96b1b4a1f3c02cf2c054e8a101dfd8 Mon Sep 17 00:00:00 2001 From: jeff Date: Mon, 9 Mar 2015 20:08:15 -0400 Subject: field matcher is starting to be useful --- src/cuchaz/enigma/convert/FieldMatches.java | 69 ++++++++++++++++++++++++---- src/cuchaz/enigma/convert/MatchesReader.java | 40 ++++++++++++++++ src/cuchaz/enigma/convert/MatchesWriter.java | 38 +++++++++++++++ 3 files changed, 137 insertions(+), 10 deletions(-) (limited to 'src/cuchaz/enigma/convert') diff --git a/src/cuchaz/enigma/convert/FieldMatches.java b/src/cuchaz/enigma/convert/FieldMatches.java index f78a8f5..6335974 100644 --- a/src/cuchaz/enigma/convert/FieldMatches.java +++ b/src/cuchaz/enigma/convert/FieldMatches.java @@ -5,7 +5,8 @@ import java.util.Set; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; -import com.google.common.collect.Sets; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import cuchaz.enigma.mapping.ClassEntry; import cuchaz.enigma.mapping.FieldEntry; @@ -14,22 +15,70 @@ import cuchaz.enigma.mapping.FieldEntry; public class FieldMatches { private BiMap m_matches; - private Set m_unmatchedSourceFields; + private Multimap m_unmatchedSourceFields; + private Multimap m_unmatchedDestFields; public FieldMatches() { m_matches = HashBiMap.create(); - m_unmatchedSourceFields = Sets.newHashSet(); + m_unmatchedSourceFields = HashMultimap.create(); + m_unmatchedDestFields = HashMultimap.create(); } - public void addUnmatchedSourceFields(Set fieldEntries) { - m_unmatchedSourceFields.addAll(fieldEntries); + public void addMatch(FieldEntry srcField, FieldEntry destField) { + m_matches.put(srcField, destField); } - public Collection getSourceClassesWithUnmatchedFields() { - Set classEntries = Sets.newHashSet(); - for (FieldEntry fieldEntry : m_unmatchedSourceFields) { - classEntries.add(fieldEntry.getClassEntry()); + public void addUnmatchedSourceField(FieldEntry fieldEntry) { + m_unmatchedSourceFields.put(fieldEntry.getClassEntry(), fieldEntry); + } + + public void addUnmatchedSourceFields(Iterable fieldEntries) { + for (FieldEntry fieldEntry : fieldEntries) { + addUnmatchedSourceField(fieldEntry); + } + } + + public void addUnmatchedDestField(FieldEntry fieldEntry) { + m_unmatchedDestFields.put(fieldEntry.getClassEntry(), fieldEntry); + } + + public void addUnmatchedDestFields(Iterable fieldEntries) { + for (FieldEntry fieldEntry : fieldEntries) { + addUnmatchedDestField(fieldEntry); } - return classEntries; + } + + public Set getSourceClassesWithUnmatchedFields() { + return m_unmatchedSourceFields.keySet(); + } + + public Collection getUnmatchedSourceFields() { + return m_unmatchedSourceFields.values(); + } + + public Collection getUnmatchedSourceFields(ClassEntry sourceClass) { + return m_unmatchedSourceFields.get(sourceClass); + } + + public Collection getUnmatchedDestFields() { + return m_unmatchedDestFields.values(); + } + + public Collection getUnmatchedDestFields(ClassEntry sourceClass) { + return m_unmatchedDestFields.get(sourceClass); + } + + public BiMap matches() { + return m_matches; + } + + public boolean isDestMatched(FieldEntry destFieldEntry) { + return m_matches.containsValue(destFieldEntry); + } + + public void makeMatch(FieldEntry sourceField, FieldEntry destField) { + m_unmatchedSourceFields.remove(sourceField.getClassEntry(), sourceField); + m_unmatchedDestFields.remove(destField.getClassEntry(), destField); + m_matches.put(sourceField, destField); } } diff --git a/src/cuchaz/enigma/convert/MatchesReader.java b/src/cuchaz/enigma/convert/MatchesReader.java index b43535c..1dd042d 100644 --- a/src/cuchaz/enigma/convert/MatchesReader.java +++ b/src/cuchaz/enigma/convert/MatchesReader.java @@ -10,6 +10,8 @@ import java.util.List; import com.beust.jcommander.internal.Lists; import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.FieldEntry; +import cuchaz.enigma.mapping.Type; public class MatchesReader { @@ -42,4 +44,42 @@ public class MatchesReader { } return entries; } + + public static FieldMatches readFields(File file) + throws IOException { + try (BufferedReader in = new BufferedReader(new FileReader(file))) { + FieldMatches matches = new FieldMatches(); + String line = null; + while ((line = in.readLine()) != null) { + readFieldMatch(matches, line); + } + return matches; + } + } + + private static void readFieldMatch(FieldMatches matches, String line) { + String[] parts = line.split(":", 2); + FieldEntry source = readField(parts[0]); + FieldEntry dest = readField(parts[1]); + if (source != null && dest != null) { + matches.addMatch(source, dest); + } else if (source != null) { + matches.addUnmatchedSourceField(source); + } else if (dest != null) { + matches.addUnmatchedDestField(dest); + } + } + + private static FieldEntry readField(String in) { + if (in.length() <= 0) { + return null; + } + String[] parts = in.split(" "); + assert(parts.length == 3); + return new FieldEntry( + new ClassEntry(parts[0]), + parts[1], + new Type(parts[2]) + ); + } } diff --git a/src/cuchaz/enigma/convert/MatchesWriter.java b/src/cuchaz/enigma/convert/MatchesWriter.java index 6658e2a..6e371bc 100644 --- a/src/cuchaz/enigma/convert/MatchesWriter.java +++ b/src/cuchaz/enigma/convert/MatchesWriter.java @@ -3,8 +3,10 @@ package cuchaz.enigma.convert; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.Map; import cuchaz.enigma.mapping.ClassEntry; +import cuchaz.enigma.mapping.FieldEntry; public class MatchesWriter { @@ -38,4 +40,40 @@ public class MatchesWriter { out.write(entry.toString()); } } + + public static void writeFields(FieldMatches fieldMatches, File file) + throws IOException { + try (FileWriter out = new FileWriter(file)) { + for (Map.Entry match : fieldMatches.matches().entrySet()) { + writeFieldMatch(out, match.getKey(), match.getValue()); + } + for (FieldEntry fieldEntry : fieldMatches.getUnmatchedSourceFields()) { + writeFieldMatch(out, fieldEntry, null); + } + for (FieldEntry fieldEntry : fieldMatches.getUnmatchedDestFields()) { + writeFieldMatch(out, null, fieldEntry); + } + } + } + + private static void writeFieldMatch(FileWriter out, FieldEntry source, FieldEntry dest) + throws IOException { + if (source != null) { + writeField(out, source); + } + out.write(":"); + if (dest != null) { + writeField(out, dest); + } + out.write("\n"); + } + + private static void writeField(FileWriter out, FieldEntry fieldEntry) + throws IOException { + out.write(fieldEntry.getClassName()); + out.write(" "); + out.write(fieldEntry.getName()); + out.write(" "); + out.write(fieldEntry.getType().toString()); + } } -- cgit v1.2.3