/** * AppsServlet * Copyright 08.01.2016 by Michael Peter Christen, @0rb1t3r * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program in the file lgpl21.txt * If not, see <http://www.gnu.org/licenses/>. */ package org.loklak.api.cms; import java.io.File; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.HashSet; import java.util.Set; import org.eclipse.jetty.util.log.Log; import org.json.JSONArray; import org.json.JSONObject; import org.loklak.data.DAO; import org.loklak.server.APIException; import org.loklak.server.APIHandler; import org.loklak.server.AbstractAPIHandler; import org.loklak.server.Authorization; import org.loklak.server.BaseUserRole; import org.loklak.server.Query; import org.loklak.tools.storage.JSONObjectWithDefault; import javax.servlet.http.HttpServletResponse; public class AppsService extends AbstractAPIHandler implements APIHandler { private static final long serialVersionUID = -2577184683745091648L; @Override public String getAPIPath() { return "/api/apps.json"; } @Override public BaseUserRole getMinimalBaseUserRole() { return BaseUserRole.ANONYMOUS; } @Override public JSONObject getDefaultPermissions(BaseUserRole baseUserRole) { return null; } @Override public JSONObject serviceImpl(Query query, HttpServletResponse response, Authorization auth, final JSONObjectWithDefault permissions) throws APIException { String categorySelection = query.get("category", ""); // generate json File apps = new File(DAO.html_dir, "apps"); JSONObject json = new JSONObject(true); JSONArray app_array = new JSONArray(); json.put("apps", app_array); JSONObject categories = new JSONObject(true); for (String appname: apps.list()) try { // read app and verify the structure of the app File apppath = new File(apps, appname); if (!apppath.isDirectory()) continue; Set<String> files = new HashSet<>(); for (String f: apppath.list()) files.add(f); if (!files.contains("index.html")) continue; if (!files.contains("app.json")) continue; File json_ld_file = new File(apppath, "app.json"); String jsonString = new String(Files.readAllBytes(json_ld_file.toPath()), StandardCharsets.UTF_8); JSONObject json_ld = new JSONObject(jsonString); // translate permissions if (json_ld.has("permissions")) { String p = json_ld.getString("permissions"); String[] ps = p.split(","); JSONArray a = new JSONArray(); for (String s: ps) a.put(s); json_ld.put("permissions", a); } // check category if (json_ld.has("applicationCategory") && json_ld.has("name")) { String cname = json_ld.getString("applicationCategory"); if (categorySelection.length() == 0 || categorySelection.equals(cname)) app_array.put(json_ld); String aname = json_ld.getString("name"); if (!categories.has(cname)) categories.put(cname, new JSONArray()); JSONArray appnames = categories.getJSONArray(cname); appnames.put(aname); } } catch (Throwable e) { Log.getLog().warn(e); } // write categories json.put("categories", categories.keySet().toArray(new String[categories.length()])); json.put("category", categories); return json; } }