package org.fenixedu.bennu.portal.client; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Enumeration; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import org.fenixedu.bennu.portal.model.Application; import org.fenixedu.bennu.portal.model.ApplicationRegistry; import org.fenixedu.bennu.portal.model.Functionality; import org.fenixedu.bennu.portal.servlet.PortalBackendRegistry; import org.fenixedu.commons.i18n.LocalizedString; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @WebListener public class ClientSiteBackendInitilizer implements ServletContextListener { private static final Logger logger = LoggerFactory.getLogger(ClientSiteBackendInitilizer.class); @Override public void contextInitialized(ServletContextEvent sce) { PortalBackendRegistry.registerPortalBackend(new ClientSidePortalBackend()); try { initAppsJsonFromJars(getClass().getClassLoader()); } catch (IOException e) { throw new RuntimeException(e); } } private void initAppsJsonFromJars(final ClassLoader classLoader) throws IOException { final Enumeration<URL> resources = classLoader.getResources("apps.json"); final JsonParser parser = new JsonParser(); while (resources.hasMoreElements()) { URL appsJsonURL = resources.nextElement(); final InputStreamReader appJsonReader = new InputStreamReader(appsJsonURL.openStream(), StandardCharsets.UTF_8); logger.debug("parsing apps.json for {}", appsJsonURL.toExternalForm()); JsonArray appsJson = parser.parse(appJsonReader).getAsJsonObject().get("apps").getAsJsonArray(); for (JsonElement appJson : appsJson) { parseApplicationInfo(appJson.getAsJsonObject()); } } } private void parseApplicationInfo(JsonObject appJson) { final String accessExpression = appJson.get("accessExpression").getAsString(); final String path = appJson.get("path").getAsString(); final LocalizedString title = LocalizedString.fromJson(appJson.get("title")); final LocalizedString description = LocalizedString.fromJson(appJson.get("description")); final String group = appJson.has("group") ? appJson.get("group").getAsString() : "client-side"; Application app = new Application(path, path, accessExpression, title, description, group); if (appJson.has("functionalities")) { for (JsonElement functionality : appJson.get("functionalities").getAsJsonArray()) { parseFunctionality(app, functionality.getAsJsonObject()); } } ApplicationRegistry.registerApplication(app); } private void parseFunctionality(Application application, JsonObject funcJson) { final String accessExpression = funcJson.get("accessExpression").getAsString(); final String path = funcJson.get("path").getAsString(); final LocalizedString title = LocalizedString.fromJson(funcJson.get("title")); final LocalizedString description = LocalizedString.fromJson(funcJson.get("description")); Functionality functionality = new Functionality(ClientSidePortalBackend.BACKEND_KEY, path, path, accessExpression, title, description); application.addFunctionality(functionality); } @Override public void contextDestroyed(ServletContextEvent sce) { } }