1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.client.console.panels;
20
21 import java.io.Serializable;
22 import java.util.List;
23 import java.util.stream.Collectors;
24 import org.apache.commons.lang3.StringUtils;
25 import org.apache.syncope.client.console.SyncopeConsoleSession;
26 import org.apache.syncope.client.console.rest.LoggerConf;
27 import org.apache.syncope.client.console.rest.LoggerConfOp;
28 import org.apache.syncope.client.ui.commons.Constants;
29 import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
30 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxDropDownChoicePanel;
31 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
32 import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
33 import org.apache.syncope.common.lib.SyncopeClientException;
34 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
35 import org.apache.wicket.Component;
36 import org.apache.wicket.PageReference;
37 import org.apache.wicket.ajax.AjaxRequestTarget;
38 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
39 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
40 import org.apache.wicket.event.Broadcast;
41 import org.apache.wicket.event.IEvent;
42 import org.apache.wicket.markup.html.WebMarkupContainer;
43 import org.apache.wicket.markup.html.form.Form;
44 import org.apache.wicket.markup.html.panel.Panel;
45 import org.apache.wicket.model.IModel;
46 import org.apache.wicket.model.LoadableDetachableModel;
47 import org.apache.wicket.model.Model;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50 import org.springframework.boot.logging.LogLevel;
51
52 public class LogsPanel extends Panel {
53
54 private static final long serialVersionUID = -6313532280206208227L;
55
56 private static final Logger LOG = LoggerFactory.getLogger(LogsPanel.class);
57
58 private final IModel<List<LoggerConf>> loggerConfs = new LoadableDetachableModel<>() {
59
60 private static final long serialVersionUID = 5275935387613157437L;
61
62 @Override
63 protected List<LoggerConf> load() {
64 return loggerConfOp.list();
65 }
66 };
67
68 private final LoggerConfOp loggerConfOp;
69
70 private final ListViewPanel<LoggerConf> loggerConfsView;
71
72 public LogsPanel(final String id, final LoggerConfOp loggerConfOp, final PageReference pageRef) {
73 super(id);
74 this.loggerConfOp = loggerConfOp;
75
76 WebMarkupContainer searchBoxContainer = new WebMarkupContainer("searchBox");
77 add(searchBoxContainer.setOutputMarkupId(true));
78
79 Form<?> form = new Form<>("form");
80 searchBoxContainer.add(form);
81
82 Model<String> keywordModel = new Model<>(StringUtils.EMPTY);
83
84 AjaxTextFieldPanel filter = new AjaxTextFieldPanel("filter", "filter", keywordModel, true);
85 form.add(filter.hideLabel().setOutputMarkupId(true).setRenderBodyOnly(true));
86
87 AjaxButton search = new AjaxButton("search") {
88
89 private static final long serialVersionUID = 8390605330558248736L;
90
91 @Override
92 protected void onSubmit(final AjaxRequestTarget target) {
93 send(LogsPanel.this, Broadcast.EXACT, new LoggerConfSearchEvent(target, keywordModel.getObject()));
94 }
95 };
96 form.add(search.setOutputMarkupId(true));
97 form.setDefaultButton(search);
98
99 WebMarkupContainer loggerContainer = new WebMarkupContainer("loggerContainer");
100 add(loggerContainer.setOutputMarkupId(true));
101
102 ListViewPanel.Builder<LoggerConf> builder = new ListViewPanel.Builder<>(LoggerConf.class, pageRef) {
103
104 private static final long serialVersionUID = 6957788356709885298L;
105
106 @Override
107 protected Component getValueComponent(final String key, final LoggerConf loggerConf) {
108 if ("level".equalsIgnoreCase(key)) {
109 AjaxDropDownChoicePanel<LogLevel> loggerLevel = new AjaxDropDownChoicePanel<>(
110 "field", getString("level"), Model.of(loggerConf.getLevel()), false);
111 MetaDataRoleAuthorizationStrategy.authorize(loggerLevel, ENABLE, IdRepoEntitlement.LOGGER_UPDATE);
112
113 loggerLevel.hideLabel();
114 loggerLevel.setChoices(List.of(LogLevel.values()));
115 loggerLevel.setNullValid(false);
116 loggerLevel.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
117
118 private static final long serialVersionUID = -1107858522700306810L;
119
120 @Override
121 protected void onUpdate(final AjaxRequestTarget target) {
122 try {
123 loggerConf.setLevel(loggerLevel.getModelObject());
124 loggerConfOp.setLevel(loggerConf.getKey(), loggerConf.getLevel());
125
126 SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
127 target.add(loggerLevel);
128 } catch (SyncopeClientException e) {
129 LOG.error("Error updating the logger level", e);
130 SyncopeConsoleSession.get().onException(e);
131 }
132 ((BaseWebPage) pageRef.getPage()).getNotificationPanel().refresh(target);
133 }
134 });
135 return loggerLevel;
136 } else {
137 return super.getValueComponent(key, loggerConf);
138 }
139 }
140 };
141
142 builder.setItems(loggerConfs.getObject()).
143 setModel(loggerConfs).
144 includes(Constants.KEY_FIELD_NAME, "level").
145 withChecks(ListViewPanel.CheckAvailability.NONE).
146 setCaptionVisible(false).
147 setReuseItem(false);
148
149 loggerConfsView = (ListViewPanel<LoggerConf>) builder.build("logger");
150 loggerContainer.add(loggerConfsView);
151 }
152
153 @Override
154 public void onEvent(final IEvent<?> event) {
155 if (event.getPayload() instanceof LoggerConfSearchEvent) {
156 LoggerConfSearchEvent payload = LoggerConfSearchEvent.class.cast(event.getPayload());
157 AjaxRequestTarget target = payload.getTarget();
158
159 String keyword = payload.getKeyword();
160 if (StringUtils.isBlank(keyword)) {
161 loggerConfsView.refreshList(loggerConfs.getObject());
162 } else {
163 loggerConfsView.refreshList(loggerConfs.getObject().stream().
164 filter(l -> l.getKey().contains(keyword)).collect(Collectors.toList()));
165 }
166 target.add(loggerConfsView);
167 } else {
168 super.onEvent(event);
169 }
170 }
171
172 private static class LoggerConfSearchEvent implements Serializable {
173
174 private static final long serialVersionUID = -282052400565266028L;
175
176 private final AjaxRequestTarget target;
177
178 private final String keyword;
179
180 LoggerConfSearchEvent(final AjaxRequestTarget target, final String keyword) {
181 this.target = target;
182 this.keyword = keyword;
183 }
184
185 public AjaxRequestTarget getTarget() {
186 return target;
187 }
188
189 public String getKeyword() {
190 return keyword;
191 }
192 }
193 }