package act.controller.builtin;
/*-
* #%L
* ACT Framework
* %%
* Copyright (C) 2014 - 2017 ActFramework
* %%
* Licensed 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
* #L%
*/
import act.app.ActionContext;
import act.cli.CliContext;
import act.cli.CliDispatcher;
import act.cli.CliOverHttpAuthority;
import act.cli.CliOverHttpContext;
import act.conf.AppConfig;
import act.controller.Controller;
import act.handler.CliHandler;
import org.osgl.http.H;
import org.osgl.mvc.annotation.Before;
import org.osgl.mvc.annotation.GetAction;
import org.osgl.mvc.annotation.PostAction;
import org.osgl.mvc.result.Result;
import org.osgl.util.C;
import javax.inject.Inject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import static act.controller.Controller.Util.*;
/**
* Handles CLI over http requests
*/
@Controller(port = AppConfig.PORT_CLI_OVER_HTTP)
public class CliOverHttp {
private static final int MRU_LIMIT = 8;
@Inject
CliDispatcher dispatcher;
@Inject
H.Session session;
@Inject
AppConfig config;
@Before
public void before(AppConfig config) {
CliOverHttpAuthority authority = config.cliOverHttpAuthority();
authority.authorize();
}
@GetAction
public Result home(AppConfig config) {
String title = config.cliOverHttpTitle();
boolean showSysCmd = config.cliOverHttpSysCmdEnabled();
return render(dispatcher, mru(), title, showSysCmd);
}
@GetAction("cmd")
public Result cmdPanel(String cmd) {
CliHandler handler = handler(cmd);
return render(handler, dispatcher, cmd);
}
@PostAction("cmd")
public Result run(String cmd, ActionContext context) throws IOException {
CliHandler handler = handler(cmd);
ByteArrayOutputStream os = new ByteArrayOutputStream();
CliContext cliContext = new CliOverHttpContext(context, os);
handler.handle(cliContext);
cliContext.flush();
String txt = new String(os.toByteArray(), "UTF-8");
txt = txt.replace("^J", "\n");
return text(txt);
}
private List<String> mru() {
List<String> mru = session.cached("cli_over_http_mru");
if (null == mru) {
mru = C.newList();
}
session.cache("cli_over_http_mru", mru, config.sessionTtl());
return mru;
}
private void addToMru(String cmd) {
List<String> mru = mru();
mru.remove(cmd);
mru.add(0, cmd);
if (mru.size() > MRU_LIMIT) {
mru.remove(mru.size() - 1);
}
}
private CliHandler handler(String cmd) {
CliHandler handler = dispatcher.handler(cmd);
notFoundIfNull(handler);
return handler;
}
}