package Exports; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map.Entry; import Bricklink.BricklinkAPI; import Bricklink.org.kleini.bricklink.api.BrickLinkClient; import Bricklink.org.kleini.bricklink.api.Color.ColorsRequest; import Bricklink.org.kleini.bricklink.api.Color.ColorsResponse; import Bricklink.org.kleini.bricklink.data.ColorDT; import Builder.BuilderConfigurationManager; import Color.BricklinkColorT; import Command.LDrawColorT; import LDraw.Support.LDrawUtilities; import LDraw.Support.PartCache; public class CompatiblePartManager { private static CompatiblePartManager _instance = null; private HashMap<PartDomainT, HashMap<String, PartIds>> partIdMapPerDomain; private HashMap<String, PartIds> ldrawPartIdMap; private HashMap<String, PartIds> lddPartIdMap; private HashMap<String, PartIds> bricklinkPartIdMap; private HashMap<PartDomainT, HashMap<Integer, PartColors>> partColorMapPerDomain; private HashMap<Integer, PartColors> ldrawPartColorMap; private HashMap<Integer, PartColors> lddPartColorMap; private HashMap<Integer, PartColors> bricklinkPartColorMap; public static void main(String args[]) { CompatiblePartManager manager = CompatiblePartManager.getInstance(); HashMap<String, PartIds> partIdMap = manager .getAllPartsInDomain(PartDomainT.BRICKLINK); for (Entry<String, PartIds> partId : partIdMap.entrySet()) { ArrayList<String> ldrawIdList = partId.getValue().getId( PartDomainT.LDRAW); if (ldrawIdList == null) continue; for (String ldrawId : ldrawIdList) { if (ldrawId == null) continue; ldrawId += ".dat"; String partName = PartCache.getInstance().getPartName(ldrawId); if (partName == null) continue; if (partName.contains("=")) { System.out.println(partId.getKey() + "->" + ldrawId + ": " + PartCache.getInstance().getRepresentPartName( ldrawId)); partId.getValue().setId( PartDomainT.LDRAW, LDrawUtilities .excludeExtensionFromPartName(PartCache .getInstance() .getRepresentPartName(ldrawId))); } } } manager.writeMappingListToFileCache(); } private CompatiblePartManager() { partIdMapPerDomain = new HashMap<PartDomainT, HashMap<String, PartIds>>(); ldrawPartIdMap = new HashMap<String, PartIds>(); lddPartIdMap = new HashMap<String, PartIds>(); bricklinkPartIdMap = new HashMap<String, PartIds>(); partIdMapPerDomain.put(PartDomainT.BRICKLINK, bricklinkPartIdMap); partIdMapPerDomain.put(PartDomainT.LDD, lddPartIdMap); partIdMapPerDomain.put(PartDomainT.LDRAW, ldrawPartIdMap); partColorMapPerDomain = new HashMap<PartDomainT, HashMap<Integer, PartColors>>(); ldrawPartColorMap = new HashMap<Integer, PartColors>(); lddPartColorMap = new HashMap<Integer, PartColors>(); bricklinkPartColorMap = new HashMap<Integer, PartColors>(); partColorMapPerDomain.put(PartDomainT.BRICKLINK, bricklinkPartColorMap); partColorMapPerDomain.put(PartDomainT.LDD, lddPartColorMap); partColorMapPerDomain.put(PartDomainT.LDRAW, ldrawPartColorMap); loadLDrawIdInfo(); loadLDrawColorInfo(); loadBricklinkInfo(); // loadMappingInfo_CompatibleJS(); loadIdMappingInfoFromLDraw(); loadIdMappingInfoFromBricklink(); loadColorMappingInfoFromBricklink(); loadColorMappingInfoFromLDraw(); System.out.println("Num Of Compatible Item From compatible.js:" + bricklinkPartIdMap.size()); // loadMappingInfo_BrickLink(); System.out.println("Accumulated Num Of Compatible Item From Bricklink:" + bricklinkPartIdMap.size()); } public void loadMappingInfo_BrickLink() { loadIdMappingInfo_BrickLink(); loadColorMappingInfo_BrickLink(); } public void loadColorMappingInfo_BrickLink() { for (Entry<Integer, Integer> entry : UpdateManager.getInstance() .getColorMappingInfoMapFromLDraw().entrySet()) updateColorMappingInfoFromLDraw(entry.getKey(), entry.getValue()); for (Entry<Integer, Integer> entry : UpdateManager.getInstance() .getColorMappingInfoMapFromBricklink().entrySet()) updateColorMappingInfoFromBricklink(entry.getKey(), entry.getValue()); } public void loadIdMappingInfo_BrickLink() { for (Entry<String, String> entry : UpdateManager.getInstance() .getIdMappingInfoMapFromLDraw().entrySet()) updateIdMappingInfoFromLDraw(entry.getKey(), entry.getValue()); for (Entry<String, String> entry : UpdateManager.getInstance() .getIdMappingInfoMapFromBricklink().entrySet()) updateIdMappingInfoFromBricklink(entry.getKey(), entry.getValue()); } private void loadLDrawColorInfo() { for (LDrawColorT colorT : LDrawColorT.values()) { PartColors partColor = new PartColors(); partColor.setColorId(PartDomainT.LDRAW, colorT.getValue()); ldrawPartColorMap.put(colorT.getValue(), partColor); } } public void updateColorMappingInfoFromBricklink(Integer bricklinkColorId, Integer ldrawColorId) { if (ldrawColorId == null) { bricklinkPartColorMap.remove(bricklinkColorId); return; } PartColors bricklinkColor = bricklinkPartColorMap.get(bricklinkColorId); PartColors partColor; if (bricklinkColor == null) { partColor = new PartColors(); partColor.setColorId(PartDomainT.BRICKLINK, bricklinkColorId); partColor.setColorId(PartDomainT.LDRAW, ldrawColorId); bricklinkPartColorMap.put(bricklinkColorId, partColor); } else if (bricklinkColor.getColorId(PartDomainT.LDRAW) == null) { bricklinkColor.setColorId(PartDomainT.LDRAW, ldrawColorId); } else { // System.out.println("################################"); // System.out // .println("updateColorMappingInfoFromBricklink: 1 to n Mapping "); // System.out.println("previous mapping:" // + bricklinkColor.getColorId(PartDomainT.BRICKLINK) + "<->" // + bricklinkColor.getColorId(PartDomainT.LDRAW)); // System.out.println("new mapping: " + bricklinkColorId + "<->" // + ldrawColorId); bricklinkColor.setColorId(PartDomainT.LDRAW, ldrawColorId); } PartColors colorsInLDraw = ldrawPartColorMap.get(ldrawColorId); if (colorsInLDraw == null) { partColor = new PartColors(); partColor.setColorId(PartDomainT.BRICKLINK, bricklinkColorId); partColor.setColorId(PartDomainT.LDRAW, ldrawColorId); ldrawPartColorMap.put(ldrawColorId, partColor); } else if (colorsInLDraw.getColorId(PartDomainT.BRICKLINK) == null) { colorsInLDraw.setColorId(PartDomainT.BRICKLINK, bricklinkColorId); } } public void updateColorMappingInfoFromLDraw(Integer ldrawColorId, Integer bricklinkColorId) { if (bricklinkColorId == null) { ldrawPartColorMap.remove(ldrawColorId); return; } PartColors ldrawColor = ldrawPartColorMap.get(ldrawColorId); PartColors partColor; if (ldrawColor == null) { partColor = new PartColors(); partColor.setColorId(PartDomainT.BRICKLINK, bricklinkColorId); partColor.setColorId(PartDomainT.LDRAW, ldrawColorId); ldrawPartColorMap.put(ldrawColorId, partColor); } else if (ldrawColor.getColorId(PartDomainT.BRICKLINK) == null) { ldrawColor.setColorId(PartDomainT.BRICKLINK, bricklinkColorId); } else { // System.out.println("################################"); // System.out // .println("updateColorMappingInfoFromLDraw: 1 to n Mapping "); // System.out.println("previous mapping:" // + ldrawColor.getColorId(PartDomainT.LDRAW) + "<->" // + ldrawColor.getColorId(PartDomainT.BRICKLINK)); // System.out.println("new mapping: " + ldrawColorId + "<->" // + bricklinkColorId); ldrawColor.setColorId(PartDomainT.BRICKLINK, bricklinkColorId); } PartColors colorsInBricklink = bricklinkPartColorMap .get(bricklinkColorId); if (colorsInBricklink == null) { partColor = new PartColors(); partColor.setColorId(PartDomainT.BRICKLINK, bricklinkColorId); partColor.setColorId(PartDomainT.LDRAW, ldrawColorId); bricklinkPartColorMap.put(ldrawColorId, partColor); } else if (colorsInBricklink.getColorId(PartDomainT.LDRAW) == null) { colorsInBricklink.setColorId(PartDomainT.LDRAW, ldrawColorId); } } public void updateIdMappingInfoFromBricklink(String bricklinkId, String ldrawId) { if (ldrawId == null || ldrawId.equals("")) { bricklinkPartIdMap.remove(bricklinkId); return; } PartIds newPartIds; PartIds partIdsByBricklik = bricklinkPartIdMap.get(bricklinkId); ArrayList<String> newIdList = new ArrayList<String>(); if (ldrawId.contains("+")) { for (String id : ldrawId.split("\\+")) newIdList.add(id); } else if (ldrawId.contains(",")) { for (String id : ldrawId.split(",")) newIdList.add(id); } else newIdList.add(ldrawId); if (partIdsByBricklik == null) { newPartIds = new PartIds(); newPartIds.setId(PartDomainT.BRICKLINK, bricklinkId); newPartIds.setId(PartDomainT.LDRAW, newIdList); bricklinkPartIdMap.put(bricklinkId, newPartIds); } else if (partIdsByBricklik.getId(PartDomainT.LDRAW) == null) { partIdsByBricklik.setId(PartDomainT.LDRAW, newIdList); } else if (partIdsByBricklik.getId(PartDomainT.LDRAW).equals(ldrawId) == false) { partIdsByBricklik.setId(PartDomainT.LDRAW, newIdList); } if (ldrawId.contains("+") || ldrawId.contains(",")) return; PartIds idsInLDraw = ldrawPartIdMap.get(ldrawId); if (idsInLDraw == null) { newPartIds = new PartIds(); newPartIds.setId(PartDomainT.BRICKLINK, bricklinkId); newPartIds.setId(PartDomainT.LDRAW, ldrawId); ldrawPartIdMap.put(ldrawId, newPartIds); } else if (idsInLDraw.getId(PartDomainT.BRICKLINK) == null) { idsInLDraw.setId(PartDomainT.BRICKLINK, bricklinkId); } } public void updateIdMappingInfoFromLDraw(String ldrawId, String bricklinkId) { if (bricklinkId == null || bricklinkId.equals("")) { ldrawPartIdMap.remove(ldrawId); return; } PartIds newPartIds; PartIds partIdsByLDraw = ldrawPartIdMap.get(ldrawId); ArrayList<String> newIdList = new ArrayList<String>(); if (bricklinkId.contains("+")) { for (String id : bricklinkId.split("\\+")) newIdList.add(id); } else if (bricklinkId.contains(",")) { for (String id : bricklinkId.split(",")) newIdList.add(id); } else newIdList.add(bricklinkId); if (partIdsByLDraw == null) { newPartIds = new PartIds(); newPartIds.setId(PartDomainT.LDRAW, ldrawId); newPartIds.setId(PartDomainT.BRICKLINK, newIdList); ldrawPartIdMap.put(ldrawId, newPartIds); } else if (partIdsByLDraw.getId(PartDomainT.BRICKLINK) == null) { partIdsByLDraw.setId(PartDomainT.BRICKLINK, newIdList); } else if (partIdsByLDraw.getId(PartDomainT.BRICKLINK).equals( bricklinkId) == false) { partIdsByLDraw.setId(PartDomainT.BRICKLINK, newIdList); } if (bricklinkId.contains("+") || bricklinkId.contains(",")) return; PartIds idsInBricklink = bricklinkPartIdMap.get(bricklinkId); if (idsInBricklink == null) { newPartIds = new PartIds(); newPartIds.setId(PartDomainT.BRICKLINK, bricklinkId); newPartIds.setId(PartDomainT.LDRAW, ldrawId); bricklinkPartIdMap.put(bricklinkId, newPartIds); } else if (idsInBricklink.getId(PartDomainT.LDRAW) == null) { idsInBricklink.setId(PartDomainT.LDRAW, ldrawId); } } private void loadIdMappingInfoFromLDraw() { File file = new File( BuilderConfigurationManager.getDefaultDataDirectoryPath() + "MappingData" + File.separator + "IDMappingListFromLDraw.js"); try { FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String ldrawMapList = br.readLine(); if (ldrawMapList != null && ldrawMapList.length() > 2) { ldrawMapList = ldrawMapList.substring("{".length(), ldrawMapList.length() - 2).replaceAll("\"", ""); String mappingItems[] = ldrawMapList.split(","); for (String item : mappingItems) { String ldrawId = item.split(":")[0].toLowerCase(); String bricklinkId = item.split(":")[1].toLowerCase(); updateIdMappingInfoFromLDraw(ldrawId, bricklinkId); } } br.close(); fr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void loadIdMappingInfoFromBricklink() { File file = new File( BuilderConfigurationManager.getDefaultDataDirectoryPath() + "MappingData" + File.separator + "IDMappingListFromBricklink.js"); try { FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String brickMapList = br.readLine(); if (brickMapList != null && brickMapList.length() > 2) { brickMapList = brickMapList.substring("{".length(), brickMapList.length() - 2).replaceAll("\"", ""); String mappingItems[] = brickMapList.split(","); for (String item : mappingItems) { String bricklinkId = item.split(":")[0].toLowerCase(); String ldrawId = item.split(":")[1].toLowerCase(); updateIdMappingInfoFromBricklink(bricklinkId, ldrawId); } } br.close(); fr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void loadColorMappingInfoFromLDraw() { File file = new File( BuilderConfigurationManager.getDefaultDataDirectoryPath() + "MappingData" + File.separator + "ColorMappingListFromLDraw.js"); try { FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String ldrawMapList = br.readLine(); if (ldrawMapList != null && ldrawMapList.length() > 2) { ldrawMapList = ldrawMapList.substring("{".length(), ldrawMapList.length() - 2).replaceAll("\"", ""); String mappingItems[] = ldrawMapList.split(","); for (String item : mappingItems) { String bricklinkId = item.split(":")[1].toLowerCase(); String ldrawId = item.split(":")[0].toLowerCase(); updateColorMappingInfoFromLDraw(Integer.parseInt(ldrawId), Integer.parseInt(bricklinkId)); } } br.close(); fr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void loadColorMappingInfoFromBricklink() { File file = new File( BuilderConfigurationManager.getDefaultDataDirectoryPath() + "MappingData" + File.separator + "ColorMappingListFromBricklink.js"); try { FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String bricklinkMapList = br.readLine(); if (bricklinkMapList != null && bricklinkMapList.length() > 2) { bricklinkMapList = bricklinkMapList.substring("{".length(), bricklinkMapList.length() - 2).replaceAll("\"", ""); String mappingItems[] = bricklinkMapList.split(","); for (String item : mappingItems) { String bricklinkId = item.split(":")[0].toLowerCase(); String ldrawId = item.split(":")[1].toLowerCase(); updateColorMappingInfoFromBricklink( Integer.parseInt(bricklinkId), Integer.parseInt(ldrawId)); } } br.close(); fr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void loadBricklinkInfo() { ColorsRequest request = new ColorsRequest(); BrickLinkClient client = BricklinkAPI.getInstance() .getClientForOpenAPI(); try { ColorsResponse response = client.execute(request); for (ColorDT dt : response.getColors()) { PartColors newColors = new PartColors(); newColors.setColorId(PartDomainT.BRICKLINK, dt.getIdentifier()); BricklinkColorT.byValue(dt.getIdentifier()).setColorCode( dt.getCode()); bricklinkPartColorMap.put(dt.getIdentifier(), newColors); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void loadLDrawIdInfo() { PartCache cache = PartCache.getInstance(); for (String partName : cache.getAllParts()) { partName = partName.toLowerCase(); PartIds partId = new PartIds(); partId.setId(PartDomainT.LDRAW, partName); PartIds ids = ldrawPartIdMap.get(partName); if (ids == null) ldrawPartIdMap.put(partName, partId); } } public synchronized static CompatiblePartManager getInstance() { if (_instance == null) _instance = new CompatiblePartManager(); return _instance; } public PartIds getPartIds(PartDomainT fromDomain, String fromId) { return partIdMapPerDomain.get(fromDomain).get(fromId); } public PartColors getPartColors(PartDomainT fromDomain, Integer fromId) { return partColorMapPerDomain.get(fromDomain).get(fromId); } public HashMap<String, PartIds> getAllPartsInDomain(PartDomainT domain) { return partIdMapPerDomain.get(domain); } public HashMap<Integer, PartColors> getAllColorsInDomain(PartDomainT domain) { return partColorMapPerDomain.get(domain); } public void writeMappingListToFileCache() { writeIDMappingListFromLDrawToFileCache(); writeIDMappingListFromBricklinkToFileCache(); writeColorMappingListFromBricklinkToFileCache(); writeColorMappingListFromLDrawToFileCache(); } private void writeIDMappingListFromLDrawToFileCache() { File file = new File( BuilderConfigurationManager.getDefaultDataDirectoryPath() + "MappingData/IDMappingListFromLDraw.js"); try { FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); bw.write("{"); StringBuilder builder = new StringBuilder(); for (PartIds ids : ldrawPartIdMap.values()) { if (ids.getId(PartDomainT.BRICKLINK) == null) continue; builder.append("\""); String id = null; for (String tempId : ids.getId(PartDomainT.LDRAW)) if (id == null) id = tempId; else id += "+" + tempId; builder.append(id); builder.append("\":\""); id = null; for (String tempId : ids.getId(PartDomainT.BRICKLINK)) if (id == null) id = tempId; else id += "+" + tempId; builder.append(id); builder.append("\","); } if (builder.length() > 0) builder.deleteCharAt(builder.length() - 1); bw.write(builder.toString()); bw.write("}\r\n"); bw.close(); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void writeIDMappingListFromBricklinkToFileCache() { File file = new File( BuilderConfigurationManager.getDefaultDataDirectoryPath() + "MappingData/IDMappingListFromBricklink.js"); try { FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); bw.write("{"); StringBuilder builder = new StringBuilder(); for (PartIds ids : bricklinkPartIdMap.values()) { if (ids.getId(PartDomainT.LDRAW) == null) continue; builder.append("\""); String id = null; for (String tempId : ids.getId(PartDomainT.BRICKLINK)) if (id == null) id = tempId; else id += "+" + tempId; builder.append(id); builder.append("\":\""); id = null; for (String tempId : ids.getId(PartDomainT.LDRAW)) if (id == null) id = tempId; else id += "+" + tempId; builder.append(id); builder.append("\","); } if (builder.length() > 0) builder.deleteCharAt(builder.length() - 1); bw.write(builder.toString()); bw.write("}\r\n"); bw.close(); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void writeColorMappingListFromBricklinkToFileCache() { File file = new File( BuilderConfigurationManager.getDefaultDataDirectoryPath() + "MappingData/ColorMappingListFromBricklink.js"); try { FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); bw.write("{"); StringBuilder builder = new StringBuilder(); for (PartColors colors : bricklinkPartColorMap.values()) { if (colors.getColorId(PartDomainT.LDRAW) == null) continue; builder.append("\""); builder.append(colors.getColorId(PartDomainT.BRICKLINK)); builder.append("\":\""); builder.append(colors.getColorId(PartDomainT.LDRAW)); builder.append("\","); } if (builder.length() > 0) builder.deleteCharAt(builder.length() - 1); bw.write(builder.toString()); bw.write("}\r\n"); bw.close(); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void writeColorMappingListFromLDrawToFileCache() { File file = new File( BuilderConfigurationManager.getDefaultDataDirectoryPath() + "MappingData/ColorMappingListFromLDraw.js"); try { FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); bw.write("{"); StringBuilder builder = new StringBuilder(); for (PartColors colors : ldrawPartColorMap.values()) { if (colors.getColorId(PartDomainT.BRICKLINK) == null) continue; builder.append("\""); builder.append(colors.getColorId(PartDomainT.LDRAW)); builder.append("\":\""); builder.append(colors.getColorId(PartDomainT.BRICKLINK)); builder.append("\","); } if (builder.length() > 0) builder.deleteCharAt(builder.length() - 1); bw.write(builder.toString()); bw.write("}\r\n"); bw.close(); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }