package com.intellij.flex.uiDesigner.libraries;
import com.intellij.flex.uiDesigner.DebugPathManager;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.xml.NanoXmlUtil;
import gnu.trove.THashMap;
import gnu.trove.THashSet;
import java.io.ByteArrayInputStream;
import java.io.CharArrayReader;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Set;
import static com.intellij.flex.uiDesigner.libraries.FlexLibsNames.*;
class FlexDefinitionMapProcessor implements DefinitionMapProcessor {
private final String version;
private final Condition<String> globalContains;
FlexDefinitionMapProcessor(String version, Condition<String> globalContains) {
this.version = version;
this.globalContains = globalContains;
}
@SuppressWarnings("unchecked")
final static Pair<String, String>[] FLEX_LIBS_PATTERNS = new Pair[]{
Pair.create(FRAMEWORK, "FrameworkClasses"),
Pair.create(AIRFRAMEWORK, "AIRFrameworkClasses"),
Pair.create(SPARK, "SparkClasses"),
Pair.create(AIRSPARK, "AIRSparkClasses"),
Pair.create("mobile.swc", "MobileThemeClasses"),
Pair.create(MX, "MxClasses"),
Pair.create(RPC, "RPCClasses"),
Pair.create(MOBILECOMPONENTS, "MobileComponentsClasses"),
Pair.create("charts", "ChartsClasses"),
Pair.create("sparkskins", "SparkSkinsClasses")};
@Override
public void process(THashMap<CharSequence, Definition> definitionMap, AbcMerger abcMerger) throws IOException {
for (Pair<String, String> pair : FLEX_LIBS_PATTERNS) {
definitionMap.remove(pair.second);
}
definitionMap.remove("SparkDmvClasses");
abcMerger.setDefinitionProcessor(null);
inject(definitionMap, abcMerger);
}
private void inject(THashMap<CharSequence, Definition> definitionMap, AbcMerger abcMerger) throws IOException {
final THashSet<String> overloadedMasked = new THashSet<>(FlexDefinitionProcessor.OVERLOADED.length);
for (String origin : FlexDefinitionProcessor.OVERLOADED) {
int index = origin.indexOf(':') + 1;
overloadedMasked.add(origin.substring(0, index) + FlexDefinitionProcessor.OVERLOADED_AND_BACKED_CLASS_MARK + origin.substring(index + 1));
}
Pair<CharArrayReader, ByteArrayInputStream> data = getInjection();
final Set<CharSequence> ownDefinitions = LibraryUtil.getDefinitions(data.first);
NanoXmlUtil.parse(data.first, new CatalogXmlBuilder(definitionMap, name -> globalContains.value(name) || (name.startsWith("com.intellij.") && !ownDefinitions.contains(name)), name -> globalContains.value(name) || overloadedMasked.contains(name)
));
abcMerger.process(data.second);
}
private Pair<CharArrayReader, ByteArrayInputStream> getInjection() throws IOException {
String injectionName = "flex-injection-" + (StringUtil.compareVersionNumbers(version, "4.6") < 0 ? version : "4.6") + ".swc";
if (DebugPathManager.IS_DEV) {
// maven build
File file = new File(DebugPathManager.getFudHome() + "/flex-injection/target", injectionName);
if (!file.exists()) {
// gant build
file = new File(DebugPathManager.getFudHome(), injectionName);
}
if (file.exists()) {
return LibraryUtil.openSwc(file);
}
}
URL resource = getClass().getClassLoader().getResource(injectionName);
assert resource != null;
return LibraryUtil.openSwc(resource.openStream());
}
}