package org.ovirt.engine.ui.frontend.server.gwt; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.ObjectNode; import org.ovirt.engine.core.common.config.ConfigCommon; import org.ovirt.engine.core.common.queries.ConfigurationValues; import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.ui.frontend.server.gwt.plugin.PluginData; import org.ovirt.engine.ui.frontend.server.gwt.plugin.PluginDataManager; /** * WebAdmin GWT application host page servlet. * <p> * Note that this servlet <em>does</em> {@linkplain PluginDataManager#reloadData reload} UI plugin * descriptor/configuration data as part of its request handling. */ public class WebAdminHostPageServlet extends GwtDynamicHostPageServlet { private static final long serialVersionUID = -6393009825835028397L; protected static final String ATTR_APPLICATION_MODE = "applicationMode"; //$NON-NLS-1$ protected static final String ATTR_PLUGIN_DEFS = "pluginDefinitions"; //$NON-NLS-1$ @Override protected String getSelectorScriptName() { return "webadmin.nocache.js"; //$NON-NLS-1$ } @Override protected boolean filterQueries() { return false; } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Set attribute for applicationMode object Integer applicationMode = getApplicationMode(getEngineSessionId(request)); request.setAttribute(ATTR_APPLICATION_MODE, getApplicationModeObject(applicationMode)); // Set attribute for pluginDefinitions array List<PluginData> pluginData = getPluginData(); request.setAttribute(ATTR_PLUGIN_DEFS, getPluginDefinitionsArray(pluginData)); super.doGet(request, response); } @Override protected MessageDigest getMd5Digest(HttpServletRequest request) throws NoSuchAlgorithmException, UnsupportedEncodingException { MessageDigest digest = super.getMd5Digest(request); // Update based on applicationMode object digest.update(request.getAttribute(ATTR_APPLICATION_MODE).toString().getBytes(StandardCharsets.UTF_8)); // Update based on pluginDefinitions array digest.update(request.getAttribute(ATTR_PLUGIN_DEFS).toString().getBytes(StandardCharsets.UTF_8)); return digest; } protected Integer getApplicationMode(String sessionId) { return (Integer) runPublicQuery(VdcQueryType.GetConfigurationValue, new GetConfigurationValueParameters(ConfigurationValues.ApplicationMode, ConfigCommon.defaultConfigurationVersion), sessionId); } protected ObjectNode getApplicationModeObject(Integer applicationMode) { ObjectNode obj = createObjectNode(); obj.put("value", String.valueOf(applicationMode)); //$NON-NLS-1$ return obj; } protected List<PluginData> getPluginData() { List<PluginData> currentData = new ArrayList<>(PluginDataManager.getInstance().reloadAndGetCurrentData()); Collections.sort(currentData); return currentData; } protected ArrayNode getPluginDefinitionsArray(List<PluginData> pluginData) { ArrayNode arr = createArrayNode(); for (PluginData data : pluginData) { ObjectNode dataObj = createObjectNode(); dataObj.put("name", data.getName()); //$NON-NLS-1$ dataObj.put("url", data.getUrl()); //$NON-NLS-1$ dataObj.put("config", data.mergeConfiguration()); //$NON-NLS-1$ dataObj.put("lazyLoad", data.isLazyLoad()); //$NON-NLS-1$ dataObj.put("enabled", data.isEnabled()); //$NON-NLS-1$ arr.add(dataObj); } return arr; } }