package com.buglabs.app.bugdash2.controller.software;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceReference;
import com.buglabs.app.bugdash2.Activator;
import com.buglabs.app.bugdash2.App;
import com.buglabs.app.bugdash2.AppResultManager;
import com.buglabs.app.bugdash2.LogManager;
import com.buglabs.app.bugdash2.controller.ApplicationController;
import com.buglabs.bug.dragonfly.module.IModuleControl;
import com.buglabs.osgi.sewing.pub.util.RequestParameters;
import freemarker.template.SimpleHash;
import freemarker.template.SimpleList;
import freemarker.template.SimpleNumber;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateModelRoot;
public class AppsBrowserController extends ApplicationController {
public List appsList;
private List servicesList;
public int installIndex = 0;
private String myTemplate;
public String getTemplateName() { return this.myTemplate; }
public String getInstallPath() { return App.LOCAL_PATH; }
public TemplateModelRoot get(RequestParameters params,
HttpServletRequest req, HttpServletResponse resp) {
this.myTemplate = "software_apps_from_bugnet.fml";
boolean connected = App.checkNetworkConnection();
// see which modules are attached
List modules_attached = new ArrayList();
IModuleControl[] list = Activator.getModules();
for (int i=0; i<list.length; i++) {
if (list[i] != null ) {
modules_attached.add(list[i].getModuleName());
}
}
String search = "";
String packages = "";
String filter_by_packages = "false";
int page = 1;
if (params.get("search") != null)
search = params.get("search");
if (params.get("packages") != null)
search = params.get("packages");
if (params.get("page") != null)
page = Integer.parseInt(params.get("page"));
if (params.get("filter_by_packages") != null)
filter_by_packages = params.get("filter_by_packages");
if (filter_by_packages.equals("true")) {
StringBuilder sb = new StringBuilder();
for (String pkg : getPackages()) {
sb.append(pkg);
sb.append(',');
}
packages = sb.toString();
packages = packages.substring(0, packages.length() - 2);
}
AppResultManager manager = new AppResultManager();
SimpleList apps_list = new SimpleList();
if (connected) {
manager = App.lookup(search, packages, page);
appsList = manager.getResults();
SimpleHash item;
Iterator itr = appsList.iterator();
Iterator itr_modules;
App app;
int index = 1;
String module_icons, module;
while(itr.hasNext()) {
app = (App)itr.next();
item = new SimpleHash();
/* get a list of module icons */
module_icons = "";
itr_modules = app.getModules().iterator();
while (itr_modules.hasNext()) {
module = itr_modules.next().toString();
module_icons += "<img src='" + App.getModuleIcon(module) + "' title='" + module + "' /> ";
}
/* rest of app info */
item.put("index", index+((page-1)*manager.getPageSize()));
item.put("title", app.getTitle() );
item.put("author", app.getAuthor() );
item.put("downloads", app.getDownloads() );
item.put("description", app.getDescription() );
item.put("rating", app.getRating() );
item.put("url", app.getUrl() );
item.put("thumbnail", app.getThumbnail() );
item.put("api_version", app.getApiVersion() );
item.put("category", app.getCategory());
item.put("maturity", app.getMaturity());
item.put("module_icons", module_icons);
apps_list.add(item);
index++;
}
}
SimpleHash root = new SimpleHash();
root.put("apps_list", apps_list);
root.put("modules", getModuleIconList(modules_attached));
/* paging and filter */
root.put("search", search);
root.put("result_count", new SimpleNumber(manager.getSize()) );
root.put("page", new SimpleNumber(page) );
root.put("page_size", new SimpleNumber(manager.getPageSize()) );
root.put("last_page", new SimpleNumber( (long) Math.ceil(manager.getSize()/(float)manager.getPageSize()) ));
root.put("filter_by_packages", filter_by_packages);
root.put("connected", new SimpleScalar(connected));
return root;
}
public TemplateModelRoot post(RequestParameters params,
HttpServletRequest req, HttpServletResponse resp) {
LogManager.logDebug("App to install: " + params.get("install"));
this.myTemplate = "message.fml";
String msg = "";
App app = new App(params.get("install"));
try {
app.install(getInstallPath());
LogManager.logDebug("App installed ok");
msg = "{status: 'OK', message: 'Installed successfully'}";
} catch (IOException e) {
LogManager.logWarning("App installed error: " + e.getMessage());
msg = "{status: 'ERROR', message: '" + e.getMessage() + "'}";
}
SimpleHash root = new SimpleHash();
root.put("message", msg);
return root;
}
private List<String> getPackages() {
Bundle[] bundles = Activator.getContext().getBundles();
String[] ps;
String p;
List<String> packages = new ArrayList<String>();
for(int i=0; i<bundles.length; i++) {
p = (String)bundles[i].getHeaders().get("Export-Package");
if (p != null) {
ps = p.split(",");
for (int j=0; j<ps.length; j++) {
if (!omitPackage(ps[j])) {
packages.add(stripName(ps[j]).trim());
}
}
}
}
return packages;
}
// These private methods are used to retrieve a list of packages in com.buglabs.bug.module namespace;
// copied from com.buglabs.bug.module/com/buglabs/bug/module/PackageServlet.java
private List populateServiceList() {
Bundle[] bundles = Activator.getContext().getBundles();
List services = new ArrayList();
ServiceReference[] sr;
for (int i = 0; i < bundles.length; ++i) {
Bundle b = bundles[i];
sr = b.getRegisteredServices();
if (b != null && sr != null) {
services.addAll(getServiceRoots(sr));
}
}
return services;
}
private boolean omitPackage(String packageName) {
if (!packageName.startsWith("com.buglabs.bug.module.")) {
return false;
}
servicesList = populateServiceList();
return !servicesList.contains(packageName);
}
private List getServiceRoots(ServiceReference[] registeredServices) {
List s = new ArrayList();
for (int i = 0; i < registeredServices.length; ++i) {
Object props = registeredServices[i].getProperty("objectClass");
String svcName = ((String[]) props)[0];
s.add(stripServiceName(svcName));
}
return s;
}
private String stripServiceName(String svcName) {
return svcName.substring(0, svcName.lastIndexOf('.'));
}
private String stripName(String headerValue) {
return headerValue.split(";")[0];
}
private String getModuleIconList(List list) {
String result = "";
for (int i=0; i <list.size(); i++) {
if (Activator.getContext().getBundle().getResource("images/module_" + list.get(i).toString().toLowerCase() + ".jpg") != null)
result += "<img src=\"/admin.images/module_" + list.get(i).toString().toLowerCase() + ".jpg\" title=\"" + list.get(i) + "\" /> ";
else
result += "<img src=\"/admin.images/module_generic.jpg\" title=\"" + list.get(i) + "\" /> ";
}
return result;
}
}