/* * Copyright 2003-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.ide.findusages.findalgorithm.resultproviders.treenodes; import jetbrains.mps.ide.findusages.CantLoadSomethingException; import jetbrains.mps.ide.findusages.CantSaveSomethingException; import jetbrains.mps.ide.findusages.findalgorithm.finders.Finder; import jetbrains.mps.ide.findusages.findalgorithm.finders.FinderUtils; import jetbrains.mps.ide.findusages.findalgorithm.finders.IFinder; import jetbrains.mps.ide.findusages.findalgorithm.finders.ReloadableFinder; import jetbrains.mps.ide.findusages.model.SearchQuery; import jetbrains.mps.ide.findusages.model.SearchResults; import jetbrains.mps.project.Project; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.module.SearchScope; import org.jetbrains.mps.openapi.util.ProgressMonitor; import org.jetbrains.mps.openapi.util.SubProgressKind; public class FinderNode extends BaseLeaf { private static final Logger LOG = LogManager.getLogger(FinderNode.class); private static final String FINDER = "finder"; private static final String GENERATED_FINDER = "generated_finder"; private static final String CLASS_NAME = "class_name"; private IFinder myFinder; public FinderNode() { } public FinderNode(IFinder finder) { myFinder = finder; } public String getTaskName() { if (myFinder instanceof Finder) { return ((Finder) myFinder).getDescription(); } else { LOG.warn("IFinder is deprecated and will be removed after 3.4. Please change " + myFinder.getClass().getName() + " accordingly"); return myFinder.getClass().getName(); } } @Override public SearchResults doGetResults(final SearchQuery query, @NotNull final ProgressMonitor monitor) { monitor.start(getTaskName(), 2); try { SearchResults results = myFinder.find(query, monitor.subTask(1, SubProgressKind.REPLACING)); //todo [MM] move sorting from here to code building the actual tree. Otherwise, at least results produced by different finders may remain unsorted if (FinderUtils.isAllResultsIsNodes(results)) { FinderUtils.sortNodeResultsByEditorPosition(results); monitor.advance(1); } return results; } catch (Throwable t) { Logger.getLogger(getClass()).error(t.getMessage(), t); return new SearchResults(); } finally { monitor.done(); } } @Override public long getEstimatedTime(SearchScope scope) { return 2; } @Override public void write(Element element, Project project) throws CantSaveSomethingException { super.write(element, project); Element finderXML; if (myFinder instanceof ReloadableFinder) { finderXML = new Element(GENERATED_FINDER); String finderIdentity = ((ReloadableFinder) myFinder).getPersistenceIdentity(); finderXML.setAttribute(CLASS_NAME, finderIdentity); } else { finderXML = new Element(FINDER); finderXML.setAttribute(CLASS_NAME, myFinder.getClass().getName()); } element.addContent(finderXML); } @Override public void read(Element element, Project project) throws CantLoadSomethingException { super.read(element, project); if (element.getChild(FINDER) != null) { Element finderXML = element.getChild(FINDER); String finderName = finderXML.getAttribute(CLASS_NAME).getValue(); try { Class finderClass = Class.forName(finderName); myFinder = (IFinder) finderClass.newInstance(); } catch (Throwable t) { throw new CantLoadSomethingException("Can't instantiate finder " + finderName, t); } } else { Element finderXML = element.getChild(GENERATED_FINDER); String finderName = finderXML.getAttribute(CLASS_NAME).getValue(); myFinder = new ReloadableFinder(finderName); } } }