// Path: src/main/java/com/neva/felix/webconsole/plugins/search/plugin/AbstractPlugin.java
// public abstract class AbstractPlugin extends AbstractWebConsolePlugin {
// 
// 	public static final String CATEGORY = "OSGi";
// 
// 	protected final BundleContext bundleContext;
// 
// 	public AbstractPlugin(BundleContext bundleContext) {
// 		this.bundleContext = bundleContext;
// 	}
// 
// 	@Override
// 	protected void renderContent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 		final String common = readTemplateFile("/search/common.html");
// 		final String specific = readTemplateFile("/" + getLabel() + "/plugin.html");
// 		final String content = StrSubstitutor.replace(specific, ImmutableMap.of("common", common));
// 
// 		response.getWriter().write(content);
// 	}
// 
// 	protected Dictionary<String, Object> createProps() {
// 		final Dictionary<String, Object> props = new Hashtable<>();
// 
// 		props.put("felix.webconsole.label", getLabel());
// 		props.put("felix.webconsole.category", CATEGORY);
// 
// 		return props;
// 	}
// 
// 	public void register() {
// 		bundleContext.registerService(Servlet.class.getName(), this, createProps());
// 	}
// 
// 	public URL getResource(final String path) {
// 		String prefix = "/" + getLabel() + "/";
// 		if (path.startsWith(prefix)) {
// 			return this.getClass().getResource(path);
// 		}
// 
// 		return null;
// 	}
// 
// }
// 
// Path: src/main/java/com/neva/felix/webconsole/plugins/search/plugin/SearchPlugin.java
// public class SearchPlugin extends AbstractPlugin {
// 
// 	public static final String LABEL = "search";
// 
// 	public static final String TITLE = "Search";
// 
// 	public SearchPlugin(BundleContext bundleContext) {
// 		super(bundleContext);
// 	}
// 
// 	@Override
// 	public String getLabel() {
// 		return LABEL;
// 	}
// 
// 	@Override
// 	public String getTitle() {
// 		return TITLE;
// 	}
// 
// }


import com.neva.felix.webconsole.plugins.search.plugin.AbstractPlugin;
import com.neva.felix.webconsole.plugins.search.plugin.SearchPlugin;
import com.google.common.collect.ImmutableSet;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import java.util.Set;
package com.neva.felix.webconsole.plugins.search;



public class SearchActivator implements BundleActivator {

	private SearchHttpTracker httpTracker;

	@Override
	public void start(BundleContext bundleContext) throws Exception {
		for (AbstractPlugin plugin : getPlugins(bundleContext)) {
			plugin.register();
		}

		httpTracker = new SearchHttpTracker(bundleContext);
		httpTracker.open();
	}

	@Override
	public void stop(BundleContext bundleContext) throws Exception {
		httpTracker.close();
		httpTracker = null;
	}

	private Set<AbstractPlugin> getPlugins(BundleContext bundleContext) {
// Path: src/main/java/com/neva/felix/webconsole/plugins/search/plugin/AbstractPlugin.java
// public abstract class AbstractPlugin extends AbstractWebConsolePlugin {
// 
// 	public static final String CATEGORY = "OSGi";
// 
// 	protected final BundleContext bundleContext;
// 
// 	public AbstractPlugin(BundleContext bundleContext) {
// 		this.bundleContext = bundleContext;
// 	}
// 
// 	@Override
// 	protected void renderContent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 		final String common = readTemplateFile("/search/common.html");
// 		final String specific = readTemplateFile("/" + getLabel() + "/plugin.html");
// 		final String content = StrSubstitutor.replace(specific, ImmutableMap.of("common", common));
// 
// 		response.getWriter().write(content);
// 	}
// 
// 	protected Dictionary<String, Object> createProps() {
// 		final Dictionary<String, Object> props = new Hashtable<>();
// 
// 		props.put("felix.webconsole.label", getLabel());
// 		props.put("felix.webconsole.category", CATEGORY);
// 
// 		return props;
// 	}
// 
// 	public void register() {
// 		bundleContext.registerService(Servlet.class.getName(), this, createProps());
// 	}
// 
// 	public URL getResource(final String path) {
// 		String prefix = "/" + getLabel() + "/";
// 		if (path.startsWith(prefix)) {
// 			return this.getClass().getResource(path);
// 		}
// 
// 		return null;
// 	}
// 
// }
// 
// Path: src/main/java/com/neva/felix/webconsole/plugins/search/plugin/SearchPlugin.java
// public class SearchPlugin extends AbstractPlugin {
// 
// 	public static final String LABEL = "search";
// 
// 	public static final String TITLE = "Search";
// 
// 	public SearchPlugin(BundleContext bundleContext) {
// 		super(bundleContext);
// 	}
// 
// 	@Override
// 	public String getLabel() {
// 		return LABEL;
// 	}
// 
// 	@Override
// 	public String getTitle() {
// 		return TITLE;
// 	}
// 
// }


// Path: src/main/java/com/neva/felix/webconsole/plugins/search/SearchActivator.java
import com.neva.felix.webconsole.plugins.search.plugin.AbstractPlugin;
import com.neva.felix.webconsole.plugins.search.plugin.SearchPlugin;
import com.google.common.collect.ImmutableSet;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import java.util.Set;

package com.neva.felix.webconsole.plugins.search;



public class SearchActivator implements BundleActivator {

	private SearchHttpTracker httpTracker;

	@Override
	public void start(BundleContext bundleContext) throws Exception {
		for (AbstractPlugin plugin : getPlugins(bundleContext)) {
			plugin.register();
		}

		httpTracker = new SearchHttpTracker(bundleContext);
		httpTracker.open();
	}

	@Override
	public void stop(BundleContext bundleContext) throws Exception {
		httpTracker.close();
		httpTracker = null;
	}

	private Set<AbstractPlugin> getPlugins(BundleContext bundleContext) {
		return ImmutableSet.<AbstractPlugin>of(