package com.atlassian.labs.speakeasy.manager;
import com.atlassian.labs.speakeasy.model.SearchResult;
import com.atlassian.labs.speakeasy.model.SearchResults;
import com.atlassian.labs.speakeasy.util.BundleUtil;
import com.atlassian.plugin.Plugin;
import com.atlassian.plugin.osgi.util.OsgiHeaderUtil;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.google.common.collect.Lists.newArrayList;
/**
* Searches an extension for a regular expression
*/
@Component
public class SearchManager
{
private final ExtensionManager extensionManager;
private final BundleContext bundleContext;
private static final Logger log = LoggerFactory.getLogger(SearchManager.class);
@Autowired
public SearchManager(ExtensionManager extensionManager, BundleContext bundleContext)
{
this.extensionManager = extensionManager;
this.bundleContext = bundleContext;
}
public SearchResults search(String searchQuery)
{
Pattern pattern = Pattern.compile(searchQuery);
List<SearchResult> results = newArrayList();
for (Plugin plugin : extensionManager.getAllExtensionPlugins())
{
Bundle bundle = BundleUtil.findBundleForPlugin(bundleContext, plugin.getKey());
SearchResult result = new SearchResult();
result.setName(plugin.getName());
result.setKey(plugin.getKey());
if (isMatch(pattern, bundle))
{
results.add(result);
}
}
SearchResults sr = new SearchResults();
sr.setResults(results);
return sr;
}
private boolean isMatch(Pattern pattern, Bundle bundle)
{
for (String path : BundleUtil.scanForPaths(bundle, "/"))
{
if (!path.endsWith("/"))
{
try
{
String content = BundleUtil.readEntryToString(path, bundle);
Matcher m = pattern.matcher(content);
if (m.find())
{
return true;
}
}
catch (IOException ex)
{
log.warn("Cannot search path '{}' in plugin '{}', skipping", path, OsgiHeaderUtil.getPluginKey(bundle));
}
}
}
return false;
}
}