package com.intellij.flex.uiDesigner.libraries; import com.intellij.flex.uiDesigner.LogMessageUtil; import com.intellij.flex.uiDesigner.abc.AbcTranscoder; import com.intellij.ide.util.PropertiesComponent; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.PersistentHashMap; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import java.io.DataInput; import java.io.DataOutput; import java.io.File; import java.io.IOException; import static com.intellij.flex.uiDesigner.libraries.LibrarySorter.SortResult; class LibrariesData { final PersistentHashMap<String, SortResult> librarySets; private static final String ABC_FILTER_VERSION = "40"; private static final String ABC_FILTER_VERSION_VALUE_NAME = "fud_abcFilterVersion"; static final char NAME_PREFIX = '@'; LibrariesData(File cacheDir) throws IOException { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(); if (!ABC_FILTER_VERSION.equals(propertiesComponent.getValue(ABC_FILTER_VERSION_VALUE_NAME))) { clearCache(cacheDir); propertiesComponent.setValue(ABC_FILTER_VERSION_VALUE_NAME, ABC_FILTER_VERSION); } librarySets = createLibrarySetsCache(cacheDir); } public void close() { try { librarySets.close(); } catch (IOException e) { LogMessageUtil.LOG.info(e); } } private static void clearCache(File cacheDir) { for (String path : cacheDir.list()) { if (path.charAt(0) == NAME_PREFIX) { //noinspection ResultOfMethodCallIgnored new File(cacheDir, path).delete(); } } } private static PersistentHashMap<String, SortResult> createLibrarySetsCache(File cacheDir) throws IOException { final File file = new File(cacheDir, NAME_PREFIX + "librarySets"); try { return new PersistentHashMap<>(file, EnumeratorStringDescriptor.INSTANCE, new LibrarySetDataExternalizer()); } catch (IOException e) { LogMessageUtil.LOG.info(e); clearCache(cacheDir); return new PersistentHashMap<>(file, EnumeratorStringDescriptor.INSTANCE, new LibrarySetDataExternalizer()); } } private static class LibrarySetDataExternalizer implements DataExternalizer<SortResult> { @Override public void save(@NotNull final DataOutput out, SortResult value) throws IOException { out.writeShort(value.libraries.size()); for (Library library : value.libraries) { out.writeUTF(library.getFile().getPath()); } if (value.definitionMap == null) { out.writeInt(0); return; } out.writeInt(value.definitionMap.size()); value.definitionMap.forEachKey(charSequence -> { try { out.writeUTF(charSequence.toString()); } catch (IOException e) { throw new RuntimeException(e); } return true; }); } @Override public SortResult read(@NotNull DataInput in) throws IOException { int librariesSize = in.readShort(); String[] libraryPaths = new String[librariesSize]; while (librariesSize-- > 0) { libraryPaths[librariesSize] = in.readUTF(); } int size = in.readInt(); final THashMap<CharSequence, Definition> map; if (size != 0) { map = new THashMap<>(size, AbcTranscoder.HASHING_STRATEGY); while (size-- > 0) { map.put(in.readUTF(), null); } } else { map = null; } return new SortResult(map, libraryPaths); } } }