package org.dcache.webadmin.view.pages.celladmin; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.basic.MultiLineLabel; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.protocol.https.RequireHttps; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import org.dcache.webadmin.controller.CellAdminService; import org.dcache.webadmin.controller.exceptions.CellAdminServiceException; import org.dcache.webadmin.view.pages.AuthenticatedWebPage; import org.dcache.webadmin.view.pages.basepage.BasePage; import org.dcache.webadmin.view.util.DefaultFocusBehaviour; /** * The cellAdmin Webpage * @author jans */ @RequireHttps public class CellAdmin extends BasePage implements AuthenticatedWebPage { private static final String EMPTY_STRING = ""; private static final Logger _log = LoggerFactory.getLogger(CellAdmin.class); private static final long serialVersionUID = -61395248592530110L; private String _selectedDomain; private String _selectedCell; private String _command = ""; private String _lastCommand = ""; private String _response = ""; public CellAdmin() { addMarkup(); } private Map<String, List<String>> getDomainMap() { try { return getCellAdminService().getDomainMap(); } catch (CellAdminServiceException e) { error(getStringResource("error.noCells")); _log.error("could not retrieve cells: {}", e.getMessage()); return Collections.emptyMap(); } } private void addMarkup() { Form cellAdminForm = new Form("cellAdminForm"); final DropDownChoice<String> domains = new DropDownChoice<>("cellAdminDomain", new PropertyModel<String>(this, "_selectedDomain"), new DomainsModel()); cellAdminForm.add(domains); final DropDownChoice<String> cells = new DropDownChoice<>("cellAdminCell", new PropertyModel<String>(this, "_selectedCell"), new CellsModel()); cells.setRequired(true); cells.setOutputMarkupId(true); cellAdminForm.add(cells); domains.add(new AjaxFormComponentUpdatingBehavior("change") { private static final long serialVersionUID = 7202016450667815788L; @Override protected void onUpdate(AjaxRequestTarget target) { if (target != null) { target.add(cells); } else { // implement fallback for non javascript clients cells.updateModel(); } } }); cellAdminForm.add(new FeedbackPanel("feedback")); TextField commandInput = new TextField("commandText", new PropertyModel(this, "_command")); commandInput.add(new DefaultFocusBehaviour()); commandInput.setRequired(true); cellAdminForm.add(commandInput); cellAdminForm.add(new SubmitButton("submit")); cellAdminForm.add(new Label("lastCommand", new PropertyModel(this, "_lastCommand")) { private static final long serialVersionUID = 4773251450645556487L; @Override protected void onConfigure() { setVisibilityAllowed(!_lastCommand.isEmpty()); } }); cellAdminForm.add(new Label("cellAdmin.receiver", new ReceiverModel())); cellAdminForm.add(new MultiLineLabel("cellAdmin.cellresponsevalue", new PropertyModel(this, "_response")) { private static final long serialVersionUID = 4018965991481863398L; @Override protected void onConfigure() { setVisibilityAllowed(!_response.isEmpty()); } }); add(cellAdminForm); } private void clearResponse() { _response = EMPTY_STRING; } private CellAdminService getCellAdminService() { return getWebadminApplication().getCellAdminService(); } private class SubmitButton extends Button { private static final long serialVersionUID = 8440840991844087035L; public SubmitButton(String id) { super(id); } @Override public void onSubmit() { try { String target = _selectedCell + "@" + _selectedDomain; _log.debug("submit pressed with cell {} and command {}", target, _command); _lastCommand = getStringResource("cellAdmin.lastCommand") +" "+ _command; clearResponse(); _response = getCellAdminService().sendCommand(target, _command); } catch (CellAdminServiceException e) { _log.error("couldn't send CellCommand, {}", e.getMessage()); error(getStringResource("error.failure")); } } } private class DomainsModel extends AbstractReadOnlyModel<List<String>> { private static final long serialVersionUID = 1232126026333463479L; @Override public List<String> getObject() { List<String> domains = new ArrayList<>(getDomainMap().keySet()); Collections.sort(domains); return domains; } } private class CellsModel extends AbstractReadOnlyModel<List<String>> { private static final long serialVersionUID = -5346050077644898205L; @Override public List<String> getObject() { List<String> cells = getDomainMap().get(_selectedDomain); if (cells == null) { cells = Collections.emptyList(); } Collections.sort(cells); return cells; } } private class ReceiverModel extends AbstractReadOnlyModel<String> { private static final long serialVersionUID = 1297395223042861665L; @Override public String getObject() { if (_selectedCell != null && _selectedDomain != null) { return getStringResource("header2") + _selectedCell + "@" + _selectedDomain; } return ""; } } }