package com.intrbiz.bergamot.ui.router.command;
import java.io.StringReader;
import org.apache.log4j.Logger;
import com.intrbiz.balsa.engine.route.Router;
import com.intrbiz.balsa.metadata.WithDataAdapter;
import com.intrbiz.bergamot.config.model.BergamotCfg;
import com.intrbiz.bergamot.config.model.CommandCfg;
import com.intrbiz.bergamot.config.validator.ValidatedBergamotConfiguration;
import com.intrbiz.bergamot.data.BergamotDB;
import com.intrbiz.bergamot.metadata.GetBergamotSite;
import com.intrbiz.bergamot.model.Site;
import com.intrbiz.bergamot.model.message.api.APIResponse;
import com.intrbiz.bergamot.model.message.api.APIResponse.Stat;
import com.intrbiz.bergamot.model.message.api.call.VerifiedCommand;
import com.intrbiz.bergamot.model.message.api.error.APIError;
import com.intrbiz.bergamot.model.message.check.ExecuteCheck;
import com.intrbiz.bergamot.model.message.config.BergamotValidationReportMO;
import com.intrbiz.bergamot.ui.BergamotApp;
import com.intrbiz.configuration.Configuration;
import com.intrbiz.metadata.Any;
import com.intrbiz.metadata.JSON;
import com.intrbiz.metadata.Param;
import com.intrbiz.metadata.Prefix;
import com.intrbiz.metadata.RequirePermission;
import com.intrbiz.metadata.RequireValidPrincipal;
import com.intrbiz.metadata.Template;
@Prefix("/command/editor")
@Template("layout/main")
@RequireValidPrincipal()
@RequirePermission("ui.admin")
public class CommandEditorRouter extends Router<BergamotApp>
{
private Logger logger = Logger.getLogger(CommandEditorRouter.class);
@Any("/")
@WithDataAdapter(BergamotDB.class)
public void index(BergamotDB db, @GetBergamotSite() Site site)
{
encode("command/editor");
}
@Any("/verify")
@JSON()
@WithDataAdapter(BergamotDB.class)
public APIResponse verifyCommand(BergamotDB db, @GetBergamotSite() Site site, @Param("command") String commandDef)
{
try
{
// parse the command
CommandCfg command = Configuration.read(CommandCfg.class, new StringReader(commandDef));
// wrap the config
BergamotCfg config = new BergamotCfg();
config.addObject(command);
// validate the config
ValidatedBergamotConfiguration validated = config.validate(db.getObjectLocator(site.getId()));
if (validated.getReport().isValid())
{
// we need the fully resolved command
CommandCfg resolved = command.resolve();
// render the parameters view
var("command", resolved);
String view = this.encodeOnlyBuffered("command/parameters");
// build the check skeleton
ExecuteCheck skeleton = new ExecuteCheck();
skeleton.setEngine(resolved.getEngine());
skeleton.setExecutor(resolved.getExecutor());
skeleton.setName(resolved.getName());
skeleton.setScript(resolved.getScript());
skeleton.setTimeout(60_000L);
// all verified
return new VerifiedCommand(Stat.OK, new BergamotValidationReportMO(validated.getReport().getSite(), validated.getReport().isValid(), validated.getReport().getWarnings(), validated.getReport().getErrors()), view, skeleton);
}
else
{
return new VerifiedCommand(Stat.ERROR, new BergamotValidationReportMO(validated.getReport().getSite(), validated.getReport().isValid(), validated.getReport().getWarnings(), validated.getReport().getErrors()), null, null);
}
}
catch (Exception e)
{
logger.error("Error verifing command", e);
return new APIError(e.getMessage());
}
}
}