diff --git a/src/com/magento/idea/magento2plugin/actions/generation/PluginGenerateMethodHandlerBase.java b/src/com/magento/idea/magento2plugin/actions/generation/PluginGenerateMethodHandlerBase.java index 5fd1810fa..996f244f1 100644 --- a/src/com/magento/idea/magento2plugin/actions/generation/PluginGenerateMethodHandlerBase.java +++ b/src/com/magento/idea/magento2plugin/actions/generation/PluginGenerateMethodHandlerBase.java @@ -42,7 +42,6 @@ import com.magento.idea.magento2plugin.util.magento.plugin.GetTargetClassNamesByPluginClassName; import com.magento.idea.magento2plugin.util.magento.plugin.IsPluginAllowedForMethodUtil; import gnu.trove.THashSet; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -88,9 +87,9 @@ public boolean isValidFor(final Editor editor, final PsiFile file) { return false; } final GetTargetClassNamesByPluginClassName targetClassesService - = GetTargetClassNamesByPluginClassName.getInstance(editor.getProject()); + = new GetTargetClassNamesByPluginClassName(editor.getProject()); final String currentClass = phpClass.getFQN().substring(1); - final ArrayList targetClassNames = targetClassesService.execute(currentClass); + final List targetClassNames = targetClassesService.execute(currentClass); return !targetClassNames.isEmpty(); } @@ -241,9 +240,9 @@ protected PhpNamedElementNode[] targetMethods( final TreeMap nodes = new TreeMap(); final GetTargetClassNamesByPluginClassName targetClassesService = - GetTargetClassNamesByPluginClassName.getInstance(phpClass.getProject()); + new GetTargetClassNamesByPluginClassName(phpClass.getProject()); final String currentClass = phpClass.getFQN().substring(1); - final ArrayList targetClassNames = targetClassesService.execute(currentClass); + final List targetClassNames = targetClassesService.execute(currentClass); for (final String targetClassName : targetClassNames) { final PhpClass targetClass = GetPhpClassByFQN.getInstance( phpClass.getProject() diff --git a/src/com/magento/idea/magento2plugin/inspections/php/PluginInspection.java b/src/com/magento/idea/magento2plugin/inspections/php/PluginInspection.java index c5e4dd744..cbc06b229 100644 --- a/src/com/magento/idea/magento2plugin/inspections/php/PluginInspection.java +++ b/src/com/magento/idea/magento2plugin/inspections/php/PluginInspection.java @@ -27,7 +27,7 @@ import com.magento.idea.magento2plugin.magento.packages.Package; import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; import com.magento.idea.magento2plugin.util.magento.plugin.GetTargetClassNamesByPluginClassName; -import java.util.ArrayList; +import java.util.List; import org.jetbrains.annotations.NotNull; @SuppressWarnings({"PMD.ExcessiveMethodLength", "PMD.NPathComplexity", "PMD.CognitiveComplexity"}) @@ -75,10 +75,8 @@ public void visitPhpMethod(final Method pluginMethod) { ((PhpClass) parentClass).getNameIdentifier(); final String currentClass = ((PhpClass) parentClass).getFQN().substring(1); final GetTargetClassNamesByPluginClassName targetClassesService = - GetTargetClassNamesByPluginClassName.getInstance( - problemsHolder.getProject() - ); - final ArrayList targetClassNames = + new GetTargetClassNamesByPluginClassName(problemsHolder.getProject()); + final List targetClassNames = targetClassesService.execute(currentClass); for (final String targetClassName : targetClassNames) { diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java b/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java index 5d4500d65..ff3a7af95 100644 --- a/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java +++ b/src/com/magento/idea/magento2plugin/linemarker/php/PluginLineMarkerProvider.java @@ -15,12 +15,13 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.indexing.FileBasedIndex; -import com.jetbrains.php.PhpIndex; import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.lang.psi.elements.PhpClass; import com.magento.idea.magento2plugin.linemarker.SearchGutterIconNavigationHandler; +import com.magento.idea.magento2plugin.linemarker.php.data.PluginMethodData; import com.magento.idea.magento2plugin.project.Settings; import com.magento.idea.magento2plugin.stubs.indexes.PluginIndex; +import com.magento.idea.magento2plugin.stubs.indexes.data.PluginData; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -94,12 +95,13 @@ public void collectSlowLineMarkers( } } + @SuppressWarnings("checkstyle:LineLength") private static class PluginClassCache { - private final Map> classPluginsMap = new HashMap<>(); + private final Map> classPluginsMap = new HashMap<>(); - public List getPluginsForClass(final @NotNull PhpClass phpClass) { - final List pluginsForClass = getPluginsForClass( + public List getPluginsForClass(final @NotNull PhpClass phpClass) { + final List pluginsForClass = getPluginsForClass( phpClass, phpClass.getPresentableFQN() ); @@ -114,7 +116,7 @@ public List getPluginsForClass(final @NotNull PhpClass phpClass) { return pluginsForClass; } - public List getPluginsForClass( + public List getPluginsForClass( final @NotNull PhpClass phpClass, final @NotNull String classFQN ) { @@ -122,24 +124,24 @@ public List getPluginsForClass( return classPluginsMap.get(classFQN); } - final List> plugins = FileBasedIndex.getInstance() + final List> plugins = FileBasedIndex.getInstance() .getValues( PluginIndex.KEY, classFQN, GlobalSearchScope.allScope(phpClass.getProject()) ); - final List results = new ArrayList<>(); + final List results = new ArrayList<>(); if (plugins.isEmpty()) { classPluginsMap.put(classFQN, results); return results; } - final PhpIndex phpIndex = PhpIndex.getInstance(phpClass.getProject()); - for (final Set pluginClassNames : plugins) { - for (final String pluginClassName: pluginClassNames) { - results.addAll(phpIndex.getClassesByFQN(pluginClassName)); + for (final Set pluginDataList : plugins) { + for (final PluginData pluginData: pluginDataList) { + pluginData.setPhpClass(phpClass); + results.add(pluginData); } } classPluginsMap.put(classFQN, results); @@ -147,31 +149,40 @@ public List getPluginsForClass( return results; } - public List getPluginMethods(final List plugins) { - final List methodList = new ArrayList<>(); + public List getPluginMethods(final List pluginDataList) { + final List result = new ArrayList<>(); - for (final PhpClass plugin: plugins) { - methodList.addAll(getPluginMethods(plugin)); + for (final PluginData pluginData: pluginDataList) { + for (final PhpClass plugin: pluginData.getPhpClassCollection()) { + //@todo add module sequence ID if sortOrder equal zero. It should be negative value. + result.addAll(getPluginMethods(plugin, pluginData.getSortOrder())); + } } - return methodList; + return result; } - public List getPluginMethods(final @NotNull PhpClass pluginClass) { - final List methodList = new ArrayList<>(); + public List getPluginMethods(final @NotNull PhpClass pluginClass, final int sortOrder) { + final List methodList = new ArrayList<>(); for (final Method method : pluginClass.getMethods()) { if (method.getAccess().isPublic()) { final String pluginMethodName = method.getName(); if (pluginMethodName.length() > MIN_PLUGIN_METHOD_NAME_LENGTH) { - methodList.add(method); + //@todo module sequence value should be set here instead of zero. + methodList.add(getPluginMethodDataObject(method, sortOrder, 0)); } } } return methodList; } + + @NotNull + private PluginMethodData getPluginMethodDataObject(final Method method, final int sortOrder, final int moduleSequence) { + return new PluginMethodData(method, sortOrder, moduleSequence); + } } private static class ClassPluginCollector implements Collector { @@ -186,41 +197,134 @@ public ClassPluginCollector( @Override public List collect(final @NotNull PhpClass psiElement) { - return pluginClassCache.getPluginsForClass(psiElement); + final List pluginDataList = pluginClassCache.getPluginsForClass(psiElement); + final List phpClassList = new ArrayList<>(); + + for (final PluginData pluginData: pluginDataList) { + phpClassList.addAll(pluginData.getPhpClassCollection()); + } + + return phpClassList; } } private static class MethodPluginCollector implements Collector { private final PluginLineMarkerProvider.PluginClassCache pluginClassCache; + private final Map pluginMethodsSortOrder; + private static final String AFTER_PLUGIN_PREFIX = "after"; public MethodPluginCollector( final PluginLineMarkerProvider.PluginClassCache pluginClassCache ) { this.pluginClassCache = pluginClassCache; + pluginMethodsSortOrder = new HashMap<>(); + pluginMethodsSortOrder.put("before", 1); + pluginMethodsSortOrder.put("around", 2); + pluginMethodsSortOrder.put(AFTER_PLUGIN_PREFIX, 3); } + @SuppressWarnings("checkstyle:LineLength") @Override public List collect(final @NotNull Method psiElement) { final List results = new ArrayList<>(); - final PhpClass methodClass = psiElement.getContainingClass(); if (methodClass == null) { return results; } - final List pluginsList = pluginClassCache.getPluginsForClass(methodClass); - final List pluginMethods = pluginClassCache.getPluginMethods(pluginsList); + final List pluginDataList = pluginClassCache.getPluginsForClass(methodClass); + final List pluginMethods = pluginClassCache.getPluginMethods(pluginDataList); final String classMethodName = WordUtils.capitalize(psiElement.getName()); - for (final Method pluginMethod: pluginMethods) { - if (isPluginMethodName(pluginMethod.getName(), classMethodName)) { - results.add(pluginMethod); + pluginMethods.removeIf(pluginMethod -> !isPluginMethodName(pluginMethod.getMethodName(), classMethodName)); + sortMethods(pluginMethods, results); + + return results; + } + + @SuppressWarnings({"checkstyle:Indentation", "checkstyle:OperatorWrap", "checkstyle:LineLength", "PMD.NPathComplexity"}) + private void sortMethods(final @NotNull List methodDataList, final List results) { + final List bufferSortOrderList = new ArrayList<>(); + int biggestSortOrder = 0; + + for (final PluginMethodData pluginMethodData: methodDataList) { + final String methodName = pluginMethodData.getMethodName(); + + if (methodName.startsWith("around")) { + bufferSortOrderList.add(pluginMethodData.getSortOrder()); + } + + if (pluginMethodData.getSortOrder() > biggestSortOrder) { + biggestSortOrder = pluginMethodData.getSortOrder(); } } - return results; + final int biggestSortOrderValue = biggestSortOrder; + + methodDataList.sort( + (PluginMethodData method1, PluginMethodData method2) -> { + final String firstMethodName = method1.getMethodName(); + final String secondMethodName = method2.getMethodName(); + final int firstIndexEnd = firstMethodName.startsWith(AFTER_PLUGIN_PREFIX) ? 5 : 6; + final int secondIndexEnd = secondMethodName.startsWith(AFTER_PLUGIN_PREFIX) ? 5 : 6; + final String firstMethodPrefix = firstMethodName.substring(0,firstIndexEnd); + final String secondMethodPrefix = secondMethodName.substring(0,secondIndexEnd); + + if (!pluginMethodsSortOrder.containsKey(firstMethodPrefix) + || !pluginMethodsSortOrder.containsKey(secondMethodPrefix)) { + return firstMethodName.compareTo(secondMethodName); + } + + final Integer firstNameSortOrder = pluginMethodsSortOrder.get(firstMethodPrefix); + final Integer secondNameSortOrder = pluginMethodsSortOrder.get(secondMethodPrefix); + + if (firstNameSortOrder.compareTo(secondNameSortOrder) != 0) { + return firstNameSortOrder.compareTo(secondNameSortOrder); + } + + Integer firstBuffer = 0; + Integer secondBuffer = 0; + final Integer firstModuleSequence = (method1.getModuleSequence() + biggestSortOrderValue) * -1; + final Integer secondModuleSequence = (method2.getModuleSequence() + biggestSortOrderValue) * -1; + final Integer firstSortOrder = method1.getSortOrder() == 0 ? + firstModuleSequence : + method1.getSortOrder(); + final Integer secondSortOrder = method2.getSortOrder() == 0 ? + secondModuleSequence : + method2.getSortOrder(); + + if (!bufferSortOrderList.isEmpty() && firstMethodPrefix.equals(AFTER_PLUGIN_PREFIX)) { + for (final Integer bufferSortOrder : bufferSortOrderList) { + if (bufferSortOrder < firstSortOrder && firstBuffer < bufferSortOrder + 1) { + firstBuffer = bufferSortOrder + 1; + } + + if (bufferSortOrder < secondSortOrder && secondBuffer < bufferSortOrder + 1) { + secondBuffer = bufferSortOrder + 1; + } + } + } + + firstBuffer = firstBuffer.equals(0) ? firstSortOrder : firstBuffer * -1; + secondBuffer = secondBuffer.equals(0) ? secondSortOrder : secondBuffer * -1; + + if (firstBuffer.compareTo(secondBuffer) == 0 && firstSortOrder.compareTo(secondSortOrder) != 0) { + return firstSortOrder.compareTo(secondSortOrder); + } + + if (firstBuffer.compareTo(secondBuffer) == 0 && firstSortOrder.compareTo(secondSortOrder) == 0) { + return firstModuleSequence.compareTo(secondModuleSequence); + } + + return firstBuffer.compareTo(secondBuffer); + } + ); + + for (final PluginMethodData pluginMethodData: methodDataList) { + results.add(pluginMethodData.getMethod()); + } } private boolean isPluginMethodName( diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLineMarkerProvider.java b/src/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLineMarkerProvider.java index 5f63c8620..5e8c06af2 100644 --- a/src/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLineMarkerProvider.java +++ b/src/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLineMarkerProvider.java @@ -97,8 +97,8 @@ private List getTargetClassesForPlugin( } final GetTargetClassNamesByPluginClassName targetClassesService = - GetTargetClassNamesByPluginClassName.getInstance(phpClass.getProject()); - final ArrayList targetClassNames = targetClassesService.execute(classFQN); + new GetTargetClassNamesByPluginClassName(phpClass.getProject()); + final List targetClassNames = targetClassesService.execute(classFQN); final List results = new ArrayList<>(); diff --git a/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java b/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java new file mode 100644 index 000000000..33fea91ec --- /dev/null +++ b/src/com/magento/idea/magento2plugin/linemarker/php/data/PluginMethodData.java @@ -0,0 +1,44 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php.data; + +import com.jetbrains.php.lang.psi.elements.Method; + +public class PluginMethodData { + + private final Method method; + private final int sortOrder; + private final int moduleSequence; + + /** + * Plugin method data class. + * + * @param method Plugin method + * @param sortOrder Plugin SortOrder integer value + * @param moduleSequence PHP class placed module sequence integer value + */ + public PluginMethodData(final Method method, final int sortOrder, final int moduleSequence) { + this.method = method; + this.sortOrder = sortOrder; + this.moduleSequence = moduleSequence; + } + + public Method getMethod() { + return method; + } + + public int getSortOrder() { + return sortOrder; + } + + public int getModuleSequence() { + return moduleSequence; + } + + public String getMethodName() { + return method.getName(); + } +} diff --git a/src/com/magento/idea/magento2plugin/magento/files/ModuleDiXml.java b/src/com/magento/idea/magento2plugin/magento/files/ModuleDiXml.java index 7db65c0cd..2d8f55e71 100644 --- a/src/com/magento/idea/magento2plugin/magento/files/ModuleDiXml.java +++ b/src/com/magento/idea/magento2plugin/magento/files/ModuleDiXml.java @@ -46,6 +46,7 @@ public class ModuleDiXml implements ModuleFileInterface { // attributes public static String NAME_ATTR = "name"; + public static String SORT_ORDER_ATTR = "sortOrder"; public static String TYPE_ATTR = "type"; public static String PREFERENCE_ATTR_FOR = "for"; public static String CLI_COMMAND_ATTR_COMMANDS = "commands"; diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java b/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java index 145ac6f1a..8e630b889 100644 --- a/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/PluginIndex.java @@ -1,7 +1,8 @@ -/** +/* * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ + package com.magento.idea.magento2plugin.stubs.indexes; import com.intellij.ide.highlighter.XmlFileType; @@ -10,41 +11,48 @@ import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.indexing.*; +import com.intellij.util.indexing.DataIndexer; +import com.intellij.util.indexing.FileBasedIndex; +import com.intellij.util.indexing.FileBasedIndexExtension; +import com.intellij.util.indexing.FileContent; +import com.intellij.util.indexing.ID; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; import com.jetbrains.php.lang.PhpLangUtil; -import com.jetbrains.php.lang.psi.stubs.indexes.StringSetDataExternalizer; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; import com.magento.idea.magento2plugin.project.Settings; -import org.jetbrains.annotations.NotNull; - +import com.magento.idea.magento2plugin.stubs.indexes.data.PluginData; +import com.magento.idea.magento2plugin.stubs.indexes.data.PluginSetDataExternalizer; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.jetbrains.annotations.NotNull; -public class PluginIndex extends FileBasedIndexExtension> { - public static final ID> KEY +public class PluginIndex extends FileBasedIndexExtension> { + public static final ID> KEY = ID.create("com.magento.idea.magento2plugin.stubs.indexes.plugin_to_type"); private final KeyDescriptor myKeyDescriptor = new EnumeratorStringDescriptor(); @NotNull @Override - public ID> getName() { + public ID> getName() { return KEY; } @NotNull @Override - public DataIndexer, FileContent> getIndexer() { - return new DataIndexer, FileContent>() { + @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) + public DataIndexer, FileContent> getIndexer() { + return new DataIndexer<>() { + @SuppressWarnings("checkstyle:LineLength") @NotNull @Override - public Map> map(@NotNull FileContent fileContent) { - Map> map = new HashMap<>(); + public Map> map(final @NotNull FileContent fileContent) { + final Map> map = new HashMap<>(); - PsiFile psiFile = fileContent.getPsiFile(); + final PsiFile psiFile = fileContent.getPsiFile(); if (!Settings.isEnabled(psiFile.getProject())) { return map; } @@ -52,26 +60,27 @@ public Map> map(@NotNull FileContent fileContent) { if (!(psiFile instanceof XmlFile)) { return map; } - XmlDocument document = ((XmlFile) psiFile).getDocument(); - if(document == null) { + final XmlDocument document = ((XmlFile) psiFile).getDocument(); + if (document == null) { return map; } - XmlTag xmlTags[] = PsiTreeUtil.getChildrenOfType(psiFile.getFirstChild(), XmlTag.class); + final XmlTag[] xmlTags = PsiTreeUtil.getChildrenOfType(psiFile.getFirstChild(), XmlTag.class); if (xmlTags == null) { return map; } - for (XmlTag xmlTag: xmlTags) { + for (final XmlTag xmlTag: xmlTags) { if (xmlTag.getName().equals("config")) { - for (XmlTag typeNode: xmlTag.findSubTags("type")) { - String typeName = typeNode.getAttributeValue("name"); - if (typeName != null) { - Set plugins = getPluginsForType(typeNode); - if (plugins.size() > 0) { - map.put(PhpLangUtil.toPresentableFQN(typeName), plugins); - } + for (final XmlTag typeNode: xmlTag.findSubTags("type")) { + final String typeName = typeNode.getAttributeValue("name"); + final Set plugins = getPluginsForType(typeNode); + + if (typeName == null || plugins.isEmpty()) { + continue; } + + map.put(PhpLangUtil.toPresentableFQN(typeName), plugins); } } } @@ -79,17 +88,27 @@ public Map> map(@NotNull FileContent fileContent) { return map; } - private Set getPluginsForType(XmlTag typeNode) { - Set results = new HashSet(); + @SuppressWarnings("checkstyle:LineLength") + private Set getPluginsForType(final XmlTag typeNode) { + final Set results = new HashSet<>(); + + for (final XmlTag pluginTag: typeNode.findSubTags(ModuleDiXml.PLUGIN_TAG_NAME)) { + final String pluginType = pluginTag.getAttributeValue(ModuleDiXml.TYPE_ATTR); + String pluginSortOrder = pluginTag.getAttributeValue(ModuleDiXml.SORT_ORDER_ATTR); - for (XmlTag pluginTag: typeNode.findSubTags("plugin")) { - String pluginType = pluginTag.getAttributeValue("type"); if (pluginType != null) { - results.add(PhpLangUtil.toPresentableFQN(pluginType)); + pluginSortOrder = pluginSortOrder == null ? "0" : pluginSortOrder; + final PluginData pluginData = getPluginDataObject(pluginType, Integer.parseInt(pluginSortOrder)); + results.add(pluginData); } } + return results; } + + private PluginData getPluginDataObject(final String pluginType, final Integer sortOrder) { + return new PluginData(pluginType, sortOrder); + } }; } @@ -101,15 +120,15 @@ public KeyDescriptor getKeyDescriptor() { @NotNull @Override - public DataExternalizer> getValueExternalizer() { - return new StringSetDataExternalizer(); + public DataExternalizer> getValueExternalizer() { + return PluginSetDataExternalizer.INSTANCE; } @NotNull @Override + @SuppressWarnings("checkstyle:LineLength") public FileBasedIndex.InputFilter getInputFilter() { - return virtualFile -> (virtualFile.getFileType() == XmlFileType.INSTANCE - && virtualFile.getNameWithoutExtension().equals("di")); + return virtualFile -> virtualFile.getFileType().equals(XmlFileType.INSTANCE) && "di".equals(virtualFile.getNameWithoutExtension()); } @Override diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java new file mode 100644 index 000000000..cc10cd897 --- /dev/null +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginData.java @@ -0,0 +1,83 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.stubs.indexes.data; + +import com.jetbrains.php.PhpIndex; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import java.util.Collection; +import org.jetbrains.annotations.NotNull; + +public class PluginData { + + private final String type; + private final int sortOrder; + private Collection phpClassCollection; + + /** + * Plugin data class. + * + * @param type Type class + * @param sortOrder Sort order value. + */ + public PluginData(final String type, final int sortOrder) { + this.type = type; + this.sortOrder = sortOrder; + } + + public String getType() { + return type; + } + + public int getSortOrder() { + return sortOrder; + } + + public Collection getPhpClassCollection() { + return phpClassCollection; + } + + /** + * Setting PHP plugin class. + * + * @param phpClass collection PHP plugin class + */ + public void setPhpClass(final @NotNull PhpClass phpClass) { + final PhpIndex phpIndex = PhpIndex.getInstance(phpClass.getProject()); + + phpClassCollection = phpIndex.getClassesByFQN(getType()); + } + + /** + * Overridden hashCode check. + * + * @return boolean + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + this.sortOrder; + + return prime * result + ((this.getType() == null) ? 0 : this.getType().hashCode()); + } + + /** + * Overridden quality check. + * + * @param object PluginData + * + * @return boolean + */ + @Override + public boolean equals(final Object object) { + if (!(object instanceof PluginData)) { + return false; + } + final PluginData compareTo = (PluginData) object; + + return type.equals(compareTo.getType()) && sortOrder == compareTo.getSortOrder(); + } +} diff --git a/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java new file mode 100644 index 000000000..94f67b58a --- /dev/null +++ b/src/com/magento/idea/magento2plugin/stubs/indexes/data/PluginSetDataExternalizer.java @@ -0,0 +1,45 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.stubs.indexes.data; + +import com.intellij.util.io.DataExternalizer; +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import org.jetbrains.annotations.NotNull; + +public class PluginSetDataExternalizer implements DataExternalizer> { + public static final PluginSetDataExternalizer INSTANCE = new PluginSetDataExternalizer(); + + @SuppressWarnings("checkstyle:LineLength") + @Override + public void save(final @NotNull DataOutput out, final Set value) throws IOException { + out.writeInt(value.size()); + + for (final PluginData plugin : value) { + out.writeUTF(plugin.getType()); + out.writeInt(plugin.getSortOrder()); + } + } + + @Override + public Set read(final @NotNull DataInput income) throws IOException { + final int size = income.readInt(); + final HashSet result = new HashSet<>(size); + + for (int r = size; r > 0; --r) { + result.add(getPluginDataObject(income.readUTF(), income.readInt())); + } + + return result; + } + + private PluginData getPluginDataObject(final String pluginType, final Integer sortOrder) { + return new PluginData(pluginType, sortOrder); + } +} diff --git a/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java b/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java index da70223b7..599de1607 100644 --- a/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java +++ b/src/com/magento/idea/magento2plugin/util/magento/plugin/GetTargetClassNamesByPluginClassName.java @@ -2,47 +2,53 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ + package com.magento.idea.magento2plugin.util.magento.plugin; import com.intellij.openapi.project.Project; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.indexing.FileBasedIndex; import com.magento.idea.magento2plugin.stubs.indexes.PluginIndex; - +import com.magento.idea.magento2plugin.stubs.indexes.data.PluginData; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; /** - * Returns all targets class names for the plugin + * Returns all targets class names for the plugin. */ public class GetTargetClassNamesByPluginClassName { - private static GetTargetClassNamesByPluginClassName INSTANCE = null; - private Project project; + private final Project project; - public static GetTargetClassNamesByPluginClassName getInstance(Project project) { - if (null == INSTANCE) { - INSTANCE = new GetTargetClassNamesByPluginClassName(); - } - INSTANCE.project = project; - return INSTANCE; + public GetTargetClassNamesByPluginClassName(final Project project) { + this.project = project; } - public ArrayList execute(String currentClassName) { - ArrayList targetClassNames = new ArrayList<>(); - Collection allKeys = FileBasedIndex.getInstance() + /** + * Get current class names for the plugin. + * + * @param currentClassName plugin class name. + * @return list of plugin classes + */ + public List execute(final String currentClassName) { + final List targetClassNames = new ArrayList<>(); + final Collection allKeys = FileBasedIndex.getInstance() .getAllKeys(PluginIndex.KEY, project); - for (String targetClassName : allKeys) { - List> pluginsList = FileBasedIndex.getInstance() - .getValues(com.magento.idea.magento2plugin.stubs.indexes.PluginIndex.KEY, targetClassName, GlobalSearchScope.allScope(project)); + for (final String targetClassName : allKeys) { + final List> pluginsList = FileBasedIndex.getInstance() + .getValues( + PluginIndex.KEY, + targetClassName, + GlobalSearchScope.allScope(project) + ); if (pluginsList.isEmpty()) { continue; } - for (Set plugins : pluginsList) { - for (String plugin : plugins) { - if (!plugin.equals(currentClassName)) { + for (final Set plugins : pluginsList) { + for (final PluginData plugin : plugins) { + if (!plugin.getType().equals(currentClassName)) { continue; } targetClassNames.add(targetClassName);