blob: 8285594e85b513018bc2341f2df1dd6ea7461b51 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.sling.scripting.core.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.felix.webconsole.AbstractWebConsolePlugin;
import org.apache.felix.webconsole.WebConsoleConstants;
import org.apache.sling.scripting.api.ScriptCache;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(
property = {
Constants.SERVICE_DESCRIPTION + "=Script Cache",
Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
WebConsoleConstants.PLUGIN_LABEL + "=" + ScriptCacheConsolePlugin.CONSOLE_LABEL,
WebConsoleConstants.PLUGIN_TITLE + "=" + ScriptCacheConsolePlugin.CONSOLE_TITLE,
"felix.webconsole.category=Sling"
},
service = { Servlet.class }
)
public class ScriptCacheConsolePlugin extends AbstractWebConsolePlugin {
private static final long serialVersionUID = 8073398598702884758L;
public static final String CONSOLE_LABEL = "scriptcache";
public static final String CONSOLE_TITLE = "Script Cache Status";
public static final String RESOURCES = CONSOLE_LABEL + "/ui";
private static final String SCRIPTCACHE_JS = "scriptcache.js";
private static final String CTYPE_JAVASCRIPT = "application/javascript";
private static final String POST_SCRIPT = "script";
@Reference
private ScriptCache scriptCache = null;
public ScriptCacheConsolePlugin() {
super();
}
@Override
public String getTitle() {
return CONSOLE_TITLE;
}
@Override
public String getLabel() {
return CONSOLE_LABEL;
}
@Override
protected void renderContent(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
throws ServletException, IOException {
if (scriptCache instanceof ScriptCacheImpl) {
ScriptCacheImpl scriptCacheImpl = (ScriptCacheImpl) scriptCache;
List<String> scripts = new ArrayList<>(scriptCacheImpl.getCachedScripts());
StringBuilder sb = new StringBuilder();
sb.append("<script type='text/javascript' src='").append(RESOURCES).append("/").append(SCRIPTCACHE_JS).append("'></script>");
sb.append("<div id='cached-scripts' class='ui-widget statline'>");
if (!scripts.isEmpty()) {
Collections.sort(scripts);
sb.append("<p class='ui-widget-header'>Cached Scripts</p>");
sb.append("<table class='nicetable ui-widget-content'>");
int i = 0;
for (String script : scripts) {
sb.append("<tr class='").append(i % 2 == 0 ? "even" : "odd").append(" ui-state-default'><td>").append(++i).append
("<td><code>").append(script).append("</code></td><td><button type='button' " +
"data-script='").append(script).append("'>Remove</button></td></tr>");
}
sb.append("<tr><td colspan='3'><button type='button' id='clearcache'>Clear Cache</button></td></tr>");
sb.append("</table>");
} else {
sb.append("<p class='ui-state-highlight'>The Script Cache doesn't contain any scripts.</p>");
}
sb.append("</div>");
httpServletResponse.getWriter().write(sb.toString());
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getRequestURI().endsWith(RESOURCES + "/" + SCRIPTCACHE_JS)) {
response.setContentType(CTYPE_JAVASCRIPT);
IOUtils.copy(getClass().getResourceAsStream("/" + RESOURCES + "/" + SCRIPTCACHE_JS), response.getOutputStream());
} else {
super.doGet(request, response);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String script = req.getParameter(POST_SCRIPT);
if (script != null && !script.isEmpty()) {
if ("all".equals(script)) {
scriptCache.clear();
renderContent(req, resp);
} else {
boolean success = scriptCache.removeScript(script);
if (success) {
renderContent(req, resp);
}
}
resp.setStatus(HttpServletResponse.SC_OK);
} else {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
}