diff --git a/agent/src/main/java/org/openremote/agent/protocol/timer/CronScheduler.java b/agent/src/main/java/org/openremote/agent/protocol/timer/CronScheduler.java index 8a9a361d31..5465c4a5b6 100644 --- a/agent/src/main/java/org/openremote/agent/protocol/timer/CronScheduler.java +++ b/agent/src/main/java/org/openremote/agent/protocol/timer/CronScheduler.java @@ -86,7 +86,7 @@ protected void addOrReplaceJob(String id, CronExpression expression, Runnable ex scheduler.scheduleJob(cronTrigger.key, cronTrigger.value); if (!scheduler.isStarted()) { - LOG.info("Starting the cron cronScheduler"); + LOG.info("Starting the cron scheduler"); scheduler.start(); } diff --git a/container/src/main/java/org/openremote/container/persistence/PersistenceService.java b/container/src/main/java/org/openremote/container/persistence/PersistenceService.java index f7ffb65b1d..40a2fd5e1e 100644 --- a/container/src/main/java/org/openremote/container/persistence/PersistenceService.java +++ b/container/src/main/java/org/openremote/container/persistence/PersistenceService.java @@ -117,6 +117,7 @@ public void stop(Container container) throws Exception { } } + public EntityManager createEntityManager() { EntityManager entityManager = getEntityManagerFactory().createEntityManager(); @@ -171,7 +172,7 @@ public R doReturningTransaction(Function entityManagerFunc } } - protected EntityManagerFactory getEntityManagerFactory() { + public EntityManagerFactory getEntityManagerFactory() { return entityManagerFactory; } diff --git a/manager/client/src/main/java/org/openremote/manager/client/ManagerActivityMapper.java b/manager/client/src/main/java/org/openremote/manager/client/ManagerActivityMapper.java index 14584f86f4..99cff430ae 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/ManagerActivityMapper.java +++ b/manager/client/src/main/java/org/openremote/manager/client/ManagerActivityMapper.java @@ -22,8 +22,8 @@ import com.google.gwt.place.shared.Place; import com.google.inject.Inject; import com.google.inject.Provider; -import org.openremote.manager.client.admin.overview.AdminOverviewActivity; -import org.openremote.manager.client.admin.overview.AdminOverviewPlace; +import org.openremote.manager.client.admin.syslog.AdminSyslogActivity; +import org.openremote.manager.client.admin.syslog.AdminSyslogPlace; import org.openremote.manager.client.admin.tenant.AdminTenantActivity; import org.openremote.manager.client.admin.tenant.AdminTenantPlace; import org.openremote.manager.client.admin.tenant.AdminTenantsActivity; @@ -43,7 +43,6 @@ import org.openremote.manager.client.assets.tenant.AssetsTenantActivity; import org.openremote.manager.client.assets.tenant.AssetsTenantPlace; import org.openremote.manager.client.event.ShowFailureEvent; -import org.openremote.model.event.bus.EventBus; import org.openremote.manager.client.i18n.ManagerMessages; import org.openremote.manager.client.map.MapActivity; import org.openremote.manager.client.map.MapPlace; @@ -65,6 +64,7 @@ import org.openremote.manager.client.service.SecurityService; import org.openremote.manager.client.user.UserAccountActivity; import org.openremote.manager.client.user.UserAccountPlace; +import org.openremote.model.event.bus.EventBus; import java.util.logging.Logger; @@ -87,7 +87,7 @@ public class ManagerActivityMapper implements AppActivityMapper { protected final Provider assetRulesListActivityProvider; protected final Provider assetRulesEditorActivityProvider; protected final Provider appsActivityProvider; - protected final Provider adminOverviewActivityProvider; + protected final Provider adminSyslogActivityProvider; protected final Provider adminTenantsActivityProvider; protected final Provider adminTenantActivityProvider; protected final Provider adminUsersActivityProvider; @@ -110,7 +110,7 @@ public ManagerActivityMapper(SecurityService securityService, Provider assetRulesListActivityProvider, Provider assetRulesEditorActivityProvider, Provider appsActivityProvider, - Provider adminOverviewActivityProvider, + Provider adminSyslogActivityProvider, Provider adminTenantsActivityProvider, Provider adminTenantActivityProvider, Provider adminUsersActivityProvider, @@ -131,7 +131,7 @@ public ManagerActivityMapper(SecurityService securityService, this.assetRulesListActivityProvider = assetRulesListActivityProvider; this.assetRulesEditorActivityProvider = assetRulesEditorActivityProvider; this.appsActivityProvider = appsActivityProvider; - this.adminOverviewActivityProvider = adminOverviewActivityProvider; + this.adminSyslogActivityProvider = adminSyslogActivityProvider; this.adminTenantsActivityProvider = adminTenantsActivityProvider; this.adminTenantActivityProvider = adminTenantActivityProvider; this.adminUsersActivityProvider = adminUsersActivityProvider; @@ -177,8 +177,8 @@ public AppActivity getActivity(Place place) { if (place instanceof AppsPlace) { return appsActivityProvider.get().init(securityService, (AppsPlace) place); } - if (place instanceof AdminOverviewPlace) { - return adminOverviewActivityProvider.get().init(securityService, (AdminOverviewPlace) place); + if (place instanceof AdminSyslogPlace) { + return adminSyslogActivityProvider.get().init(securityService, (AdminSyslogPlace) place); } if (place instanceof AdminTenantsPlace) { return adminTenantsActivityProvider.get().init(securityService, (AdminTenantsPlace) place); diff --git a/manager/client/src/main/java/org/openremote/manager/client/ManagerHistoryMapper.java b/manager/client/src/main/java/org/openremote/manager/client/ManagerHistoryMapper.java index ab52b445bc..efd6613e1b 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/ManagerHistoryMapper.java +++ b/manager/client/src/main/java/org/openremote/manager/client/ManagerHistoryMapper.java @@ -21,7 +21,7 @@ import com.google.gwt.place.shared.PlaceHistoryMapper; import com.google.gwt.place.shared.WithTokenizers; -import org.openremote.manager.client.admin.overview.AdminOverviewPlace; +import org.openremote.manager.client.admin.syslog.AdminSyslogPlace; import org.openremote.manager.client.admin.tenant.AdminTenantPlace; import org.openremote.manager.client.admin.tenant.AdminTenantsPlace; import org.openremote.manager.client.admin.users.AdminUserPlace; @@ -56,7 +56,7 @@ AssetRulesListPlace.Tokenizer.class, AssetRulesEditorPlace.Tokenizer.class, AppsPlace.Tokenizer.class, - AdminOverviewPlace.Tokenizer.class, + AdminSyslogPlace.Tokenizer.class, AdminTenantsPlace.Tokenizer.class, AdminTenantPlace.Tokenizer.class, AdminUsersPlace.Tokenizer.class, diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/AdminModule.java b/manager/client/src/main/java/org/openremote/manager/client/admin/AdminModule.java index d0ac32f994..689ebec0ef 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/AdminModule.java +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/AdminModule.java @@ -25,15 +25,11 @@ import org.openremote.manager.client.admin.navigation.AdminNavigation; import org.openremote.manager.client.admin.navigation.AdminNavigationImpl; import org.openremote.manager.client.admin.navigation.AdminNavigationPresenter; -import org.openremote.manager.client.admin.overview.AdminOverview; -import org.openremote.manager.client.admin.overview.AdminOverviewActivity; -import org.openremote.manager.client.admin.overview.AdminOverviewImpl; -import org.openremote.manager.client.admin.syslog.QuickSyslog; -import org.openremote.manager.client.admin.syslog.QuickSyslogImpl; -import org.openremote.manager.client.admin.syslog.QuickSyslogPresenter; +import org.openremote.manager.client.admin.syslog.*; import org.openremote.manager.client.admin.tenant.*; import org.openremote.manager.client.admin.users.*; import org.openremote.manager.shared.security.UserResource; +import org.openremote.manager.shared.syslog.SyslogResource; public class AdminModule extends AbstractGinModule { @@ -44,8 +40,8 @@ protected void configure() { bind(AdminNavigation.class).to(AdminNavigationImpl.class).in(Singleton.class); bind(AdminNavigation.Presenter.class).to(AdminNavigationPresenter.class); - bind(AdminOverview.class).to(AdminOverviewImpl.class).in(Singleton.class); - bind(AdminOverviewActivity.class); + bind(AdminSyslog.class).to(AdminSyslogImpl.class).in(Singleton.class); + bind(AdminSyslogActivity.class); bind(AdminTenants.class).to(AdminTenantsImpl.class).in(Singleton.class); bind(AdminTenantsActivity.class); @@ -56,11 +52,14 @@ protected void configure() { bind(AdminUsersActivity.class); bind(AdminUser.class).to(AdminUserImpl.class).in(Singleton.class); bind(AdminUserActivity.class); - - bind(QuickSyslog.class).to(QuickSyslogImpl.class).in(Singleton.class); - bind(QuickSyslog.Presenter.class).to(QuickSyslogPresenter.class).in(Singleton.class); } + @Provides + @Singleton + public native SyslogResource getSyslogResource() /*-{ + return $wnd.SyslogResource; + }-*/; + @Provides @Singleton public native UserResource getUserResource() /*-{ diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/AdminViewImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/admin/AdminViewImpl.ui.xml index 13db4797b0..42a6b2cc1e 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/AdminViewImpl.ui.xml +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/AdminViewImpl.ui.xml @@ -6,12 +6,18 @@ + + .adminContentContainer { + overflow: hidden; + } + + + styleName="flex layout vertical {style.adminContentContainer}"> diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/navigation/AdminNavigationImpl.java b/manager/client/src/main/java/org/openremote/manager/client/admin/navigation/AdminNavigationImpl.java index 33c4cd19a3..c066e05ac1 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/navigation/AdminNavigationImpl.java +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/navigation/AdminNavigationImpl.java @@ -41,7 +41,7 @@ interface UI extends UiBinder { Presenter presenter; @UiField - Hyperlink overviewLink; + Hyperlink syslogLink; @UiField Hyperlink tenantsLink; @@ -59,14 +59,14 @@ public AdminNavigationImpl() { public void setPresenter(Presenter presenter) { this.presenter = presenter; - overviewLink.setTargetHistoryToken(presenter.getAdminOverviewPlaceToken()); + syslogLink.setTargetHistoryToken(presenter.getAdminOverviewPlaceToken()); tenantsLink.setTargetHistoryToken(presenter.getAdminTenantsPlaceToken()); usersLink.setTargetHistoryToken(presenter.getAdminUsersPlaceToken()); } @Override public void onPlaceChange(AdminPlace adminPlace) { - overviewLink.removeStyleName("active"); + syslogLink.removeStyleName("active"); tenantsLink.removeStyleName("active"); usersLink.removeStyleName("active"); @@ -79,7 +79,7 @@ public void onPlaceChange(AdminPlace adminPlace) { } else if (adminPlace instanceof AdminUserPlace) { usersLink.addStyleName("active"); } else { - overviewLink.addStyleName("active"); + syslogLink.addStyleName("active"); } } diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/navigation/AdminNavigationImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/admin/navigation/AdminNavigationImpl.ui.xml index 22395fa978..b1e3d0e8f5 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/navigation/AdminNavigationImpl.ui.xml +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/navigation/AdminNavigationImpl.ui.xml @@ -17,10 +17,10 @@ - + icon="list-alt" + text="{managerMessages.syslog}"/> . - */ -package org.openremote.manager.client.admin.overview; - -import com.google.gwt.user.client.ui.AcceptsOneWidget; -import org.openremote.manager.client.admin.AbstractAdminActivity; -import org.openremote.manager.client.admin.AdminView; -import org.openremote.manager.client.admin.navigation.AdminNavigation; -import org.openremote.model.event.bus.EventBus; -import org.openremote.model.event.bus.EventRegistration; - -import javax.inject.Inject; -import java.util.Collection; - -public class AdminOverviewActivity - extends AbstractAdminActivity - implements AdminOverview.Presenter { - - @Inject - public AdminOverviewActivity(AdminView adminView, - AdminNavigation.Presenter adminNavigationPresenter, - AdminOverview view) { - super(adminView, adminNavigationPresenter, view); - } - - @Override - protected String[] getRequiredRoles() { - return new String[]{"read:admin"}; - } - - @Override - public void start(AcceptsOneWidget container, EventBus eventBus, Collection registrations) { - super.start(container, eventBus, registrations); - adminContent.setPresenter(this); - } - -} diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewImpl.java b/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewImpl.java deleted file mode 100644 index 593362cfea..0000000000 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016, OpenRemote Inc. - * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package org.openremote.manager.client.admin.overview; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.HTMLPanel; - -import javax.inject.Inject; - -public class AdminOverviewImpl extends Composite implements AdminOverview { - - interface UI extends UiBinder { - } - - private UI ui = GWT.create(UI.class); - - Presenter presenter; - - @Inject - public AdminOverviewImpl() { - initWidget(ui.createAndBindUi(this)); - } - - @Override - public void setPresenter(Presenter presenter) { - this.presenter = presenter; - } -} diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewImpl.ui.xml deleted file mode 100644 index c6d28e1549..0000000000 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewImpl.ui.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - -
- TODO Implement some general admin actions, logs display, etc. -
-
- -
- -
\ No newline at end of file diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslog.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslog.java similarity index 58% rename from manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslog.java rename to manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslog.java index 7fc630e549..898a444b12 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslog.java +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslog.java @@ -1,5 +1,5 @@ /* - * Copyright 2017, OpenRemote Inc. + * Copyright 2016, OpenRemote Inc. * * See the CONTRIBUTORS.txt file in the distribution for a * full listing of individual contributors. @@ -19,28 +19,46 @@ */ package org.openremote.manager.client.admin.syslog; -import com.google.gwt.user.client.ui.UIObject; +import org.openremote.manager.client.admin.AdminContent; +import org.openremote.manager.client.widget.FormView; import org.openremote.model.syslog.SyslogEvent; import org.openremote.model.syslog.SyslogLevel; -public interface QuickSyslog { +public interface AdminSyslog extends AdminContent, FormView { interface Presenter { - QuickSyslog getView(); - void onOpen(); + void onClearLog(); - void onClose(); + void onContinueLog(); - void onLogLevelChanged(SyslogLevel level); + void onPauseLog(); + + void onFilterLimitChanged(int limit); + + void onFilterLevelChanged(SyslogLevel level); + + void saveSettings(); + + void removeAll(); } void setPresenter(Presenter presenter); - void toggleRelativeTo(UIObject target); + void setStoredLevel(SyslogLevel level); + + SyslogLevel geStoredLevel(); + + void setStoredMinutes(int minutes); + + int getStoredMinutes(); + + SyslogLevel getFilterLevel(); + + int getFilterLimit(); - SyslogLevel getLogLevel(); + void showEvents(SyslogEvent... events); - void addEvent(SyslogEvent event); + void clearEvents(); } diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogActivity.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogActivity.java new file mode 100644 index 0000000000..9907d92802 --- /dev/null +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogActivity.java @@ -0,0 +1,217 @@ +/* + * Copyright 2016, OpenRemote Inc. + * + * See the CONTRIBUTORS.txt file in the distribution for a + * full listing of individual contributors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.openremote.manager.client.admin.syslog; + +import com.google.gwt.user.client.ui.AcceptsOneWidget; +import org.openremote.manager.client.Environment; +import org.openremote.manager.client.admin.AbstractAdminActivity; +import org.openremote.manager.client.admin.AdminView; +import org.openremote.manager.client.admin.navigation.AdminNavigation; +import org.openremote.manager.client.event.SharedEventArrayMapper; +import org.openremote.manager.client.event.ShowSuccessEvent; +import org.openremote.manager.shared.syslog.SyslogConfig; +import org.openremote.manager.shared.syslog.SyslogResource; +import org.openremote.model.event.bus.EventBus; +import org.openremote.model.event.bus.EventRegistration; +import org.openremote.model.event.shared.SharedEvent; +import org.openremote.model.syslog.SyslogEvent; +import org.openremote.model.syslog.SyslogLevel; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static org.openremote.manager.client.http.RequestExceptionHandler.handleRequestException; +import static org.openremote.manager.shared.syslog.SyslogConfig.DEFAULT_LEVEL; +import static org.openremote.manager.shared.syslog.SyslogConfig.DEFAULT_LIMIT; + +public class AdminSyslogActivity + extends AbstractAdminActivity + implements AdminSyslog.Presenter { + + final Environment environment; + final SyslogResource syslogResource; + final SyslogConfigMapper syslogConfigMapper; + final SharedEventArrayMapper sharedEventArrayMapper; + + protected SyslogConfig config; + protected SyslogLevel filterLevel; + protected int filterLimit; + + @Inject + public AdminSyslogActivity(Environment environment, + AdminView adminView, + AdminNavigation.Presenter adminNavigationPresenter, + AdminSyslog view, + SyslogResource syslogResource, + SyslogConfigMapper syslogConfigMapper, + SharedEventArrayMapper sharedEventArrayMapper) { + super(adminView, adminNavigationPresenter, view); + this.environment = environment; + this.syslogResource = syslogResource; + this.syslogConfigMapper = syslogConfigMapper; + this.sharedEventArrayMapper = sharedEventArrayMapper; + } + + @Override + protected String[] getRequiredRoles() { + return new String[]{"read:admin"}; + } + + @Override + public void start(AcceptsOneWidget container, EventBus eventBus, Collection registrations) { + super.start(container, eventBus, registrations); + adminContent.setPresenter(this); + + registrations.add( + eventBus.register(SyslogEvent.class, adminContent::showEvents) + ); + + filterLevel = adminContent.getFilterLevel(); + filterLimit = adminContent.getFilterLimit(); + fetchEvents(); + loadConfig(); + } + + @Override + public void onStop() { + super.onStop(); + adminContent.setPresenter(null); + environment.getEventService().unsubscribe(SyslogEvent.class); + } + + @Override + public void onClearLog() { + adminContent.clearEvents(); + } + + @Override + public void onContinueLog() { + environment.getEventService().subscribe( + SyslogEvent.class, + new SyslogEvent.LevelCategoryFilter(filterLevel) + ); + } + + @Override + public void onPauseLog() { + environment.getEventService().unsubscribe(SyslogEvent.class); + } + + @Override + public void onFilterLimitChanged(int limit) { + adminContent.clearEvents(); + this.filterLimit = limit; + fetchEvents(); + } + + @Override + public void onFilterLevelChanged(SyslogLevel level) { + adminContent.clearEvents(); + this.filterLevel = level; + fetchEvents(); + } + + @Override + public void saveSettings() { + // TODO Client-side validation error handling? + adminContent.setFormBusy(true); + readFromView(); + environment.getRequestService().execute( + syslogConfigMapper, + requestParams -> { + syslogResource.updateConfig(requestParams, config); + }, + 204, + () -> { + environment.getEventBus().dispatch(new ShowSuccessEvent( + environment.getMessages().settingsSaved() + )); + adminContent.setFormBusy(false); + }, + ex -> handleRequestException(ex, environment.getEventBus(), environment.getMessages()) + ); + } + + @Override + public void removeAll() { + adminContent.setFormBusy(true); + environment.getRequestService().execute( + syslogResource::clearEvents, + 204, + () -> { + adminContent.clearEvents(); + adminContent.setFormBusy(false); + environment.getEventBus().dispatch(new ShowSuccessEvent( + environment.getMessages().eventsRemoved() + )); + }, + ex -> handleRequestException(ex, environment.getEventBus(), environment.getMessages()) + ); + } + + protected void fetchEvents() { + adminContent.setFormBusy(true); + environment.getRequestService().execute( + sharedEventArrayMapper, + requestParams -> syslogResource.getEvents(requestParams, filterLevel, filterLimit), + 200, + events -> { + List syslogEvents = new ArrayList<>(); + for (SharedEvent event : events) { + if (event instanceof SyslogEvent) { + SyslogEvent syslogEvent = (SyslogEvent) event; + syslogEvents.add(syslogEvent); + } + } + adminContent.showEvents(syslogEvents.toArray(new SyslogEvent[syslogEvents.size()])); + adminContent.setFormBusy(false); + + environment.getEventService().subscribe( + SyslogEvent.class, + new SyslogEvent.LevelCategoryFilter(filterLevel) + ); + }, + ex -> handleRequestException(ex, environment.getEventBus(), environment.getMessages()) + ); + } + + protected void loadConfig() { + adminContent.setFormBusy(true); + environment.getRequestService().execute( + syslogConfigMapper, + syslogResource::getConfig, + 200, + config -> { + this.config = config; + adminContent.setStoredLevel(config.getStoredLevel()); + adminContent.setStoredMinutes(config.getStoredMaxAgeMinutes()); + adminContent.setFormBusy(false); + }, + ex -> handleRequestException(ex, environment.getEventBus(), environment.getMessages()) + ); + } + + protected void readFromView() { + config.setStoredLevel(adminContent.geStoredLevel()); + config.setStoredMaxAgeMinutes(adminContent.getStoredMinutes()); + } +} diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogImpl.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogImpl.java new file mode 100644 index 0000000000..76ef6e97e8 --- /dev/null +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogImpl.java @@ -0,0 +1,199 @@ +/* + * Copyright 2016, OpenRemote Inc. + * + * See the CONTRIBUTORS.txt file in the distribution for a + * full listing of individual contributors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.openremote.manager.client.admin.syslog; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.inject.Provider; +import org.openremote.manager.client.app.dialog.Confirmation; +import org.openremote.manager.client.i18n.ManagerMessages; +import org.openremote.manager.client.style.WidgetStyle; +import org.openremote.manager.client.widget.FormInputText; +import org.openremote.manager.client.widget.FormListBox; +import org.openremote.manager.client.widget.FormViewImpl; +import org.openremote.manager.shared.syslog.SyslogConfig; +import org.openremote.model.syslog.SyslogEvent; +import org.openremote.model.syslog.SyslogLevel; + +import javax.inject.Inject; +import java.util.logging.Logger; + +public class AdminSyslogImpl extends FormViewImpl implements AdminSyslog { + + private static final Logger LOG = Logger.getLogger(AdminSyslogImpl.class.getName()); + + interface UI extends UiBinder { + } + + Presenter presenter; + + @UiField + FormListBox storeLevelListBox; + + @UiField + FormInputText expirationInputText; + + @UiField + FormListBox expirationListBox; + + @UiField(provided = true) + SyslogFilter syslogFilter; + + @UiField(provided = true) + SyslogItems syslogItems; + + int limit = SyslogConfig.DEFAULT_LIMIT; + + @Inject + public AdminSyslogImpl(Provider confirmationDialogProvider, + ManagerMessages messages, WidgetStyle widgetStyle) { + super(confirmationDialogProvider); + + syslogFilter = new SyslogFilter(messages, widgetStyle) { + @Override + protected void onClearLog() { + if (presenter != null) + presenter.onClearLog(); + } + + @Override + protected void onContinueLog() { + if (presenter != null) + presenter.onContinueLog(); + } + + @Override + protected void onPauseLog() { + if (presenter != null) + presenter.onPauseLog(); + } + + @Override + protected void onLimitChanged(int limit) { + AdminSyslogImpl.this.limit = limit; + if (presenter != null) + presenter.onFilterLimitChanged(limit); + } + + @Override + protected void onLevelChanged(SyslogLevel level) { + if (presenter != null) + presenter.onFilterLevelChanged(level); + } + }; + + Label emptyLabel = new Label(messages.noLogMessagesReceived()); + emptyLabel.addStyleName(widgetStyle.FormListEmptyMessage()); + syslogItems = new SyslogItems(emptyLabel); + + UI ui = GWT.create(UI.class); + initWidget(ui.createAndBindUi(this)); + + for (SyslogLevel syslogLevel : SyslogLevel.values()) { + storeLevelListBox.addItem(syslogLevel.name()); + } + + expirationListBox.addItem(messages.minutes()); + expirationListBox.addItem(messages.hours()); + expirationListBox.addItem(messages.days()); + } + + @Override + public void setPresenter(Presenter presenter) { + this.presenter = presenter; + + if (presenter == null) { + storeLevelListBox.setSelectedIndex(SyslogLevel.INFO.ordinal()); + expirationInputText.setValue(null); + expirationListBox.setSelectedIndex(0); + syslogFilter.setPaused(false); + syslogItems.clear(); + } + } + + @Override + public void showEvents(SyslogEvent... items) { + for (SyslogEvent item : items) { + if (syslogItems.getItemCount() >= limit) + syslogItems.removeFirstItem(); + syslogItems.addItem(item); + } + } + + @Override + public void clearEvents() { + syslogItems.clear(); + } + + @Override + public void setStoredLevel(SyslogLevel level) { + storeLevelListBox.setSelectedIndex(level.ordinal()); + } + + @Override + public SyslogLevel geStoredLevel() { + return SyslogLevel.values()[storeLevelListBox.getSelectedIndex()]; + } + + @Override + public void setStoredMinutes(int minutes) { + expirationInputText.setValue(Integer.toString(minutes)); + expirationListBox.setSelectedIndex(0); + } + + @Override + public int getStoredMinutes() { + int enteredValue = expirationInputText.getValue().length() > 0 ? Integer.valueOf(expirationInputText.getValue()) : 0; + switch (expirationListBox.getSelectedIndex()) { + case 1: + return enteredValue * 60; + case 2: + return enteredValue * 60 * 24; + } + return enteredValue; + } + + @Override + public SyslogLevel getFilterLevel() { + return syslogFilter.getFilterLevel(); + } + + @Override + public int getFilterLimit() { + return syslogFilter.getFilterLimit(); + } + + @UiHandler("saveSettingsButton") + public void onSaveSettingsClicked(ClickEvent event) { + if (presenter != null) + presenter.saveSettings(); + } + + @UiHandler("removeAllButton") + public void onRemoveAllClicked(ClickEvent event) { + if (presenter != null) + presenter.removeAll(); + } +} diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogImpl.ui.xml new file mode 100644 index 0000000000..1f6749f4dc --- /dev/null +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogImpl.ui.xml @@ -0,0 +1,91 @@ + + + + + + + .formMessages { + max-width: 30em; + } + + .expirationInput { + width: 3em; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewPlace.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogPlace.java similarity index 81% rename from manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewPlace.java rename to manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogPlace.java index ec154d6d99..ef6da4cd8e 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverviewPlace.java +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/AdminSyslogPlace.java @@ -17,24 +17,24 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -package org.openremote.manager.client.admin.overview; +package org.openremote.manager.client.admin.syslog; import com.google.gwt.place.shared.PlaceTokenizer; import com.google.gwt.place.shared.Prefix; import org.openremote.manager.client.admin.AdminPlace; -public class AdminOverviewPlace extends AdminPlace { +public class AdminSyslogPlace extends AdminPlace { @Prefix("admin") - public static class Tokenizer implements PlaceTokenizer { + public static class Tokenizer implements PlaceTokenizer { @Override - public AdminOverviewPlace getPlace(String token) { - return new AdminOverviewPlace(); + public AdminSyslogPlace getPlace(String token) { + return new AdminSyslogPlace(); } @Override - public String getToken(AdminOverviewPlace place) { + public String getToken(AdminSyslogPlace place) { return ""; } } diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogImpl.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogImpl.java deleted file mode 100644 index a80a26444b..0000000000 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogImpl.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright 2017, OpenRemote Inc. - * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package org.openremote.manager.client.admin.syslog; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.resources.client.CssResource; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.Widget; -import org.openremote.manager.client.i18n.ManagerMessages; -import org.openremote.manager.client.style.WidgetStyle; -import org.openremote.manager.client.widget.*; -import org.openremote.model.syslog.SyslogEvent; -import org.openremote.model.syslog.SyslogLevel; - -import javax.inject.Inject; -import java.util.Arrays; - -public class QuickSyslogImpl extends AbstractAppPanel implements QuickSyslog { - - interface UI extends UiBinder { - } - - interface Style extends CssResource { - String popup(); - - String filterFormGroup(); - - String logItemLevelCategory(); - - String header(); - - String logPanel(); - - String filterForm(); - - String panel(); - - String filterFormLabel(); - - String filterFormField(); - - String logItem(); - } - - @UiField - ManagerMessages managerMessages; - - @UiField - WidgetStyle widgetStyle; - - @UiField - QuickSyslogImpl.Style style; - - @UiField - FlowPanel logPanel; - - @UiField - FormValueListBox levelListBox; - - @UiField - PushButton pauseButton; - @UiField - PushButton continueButton; - @UiField - PushButton clearButton; - - Presenter presenter; - - boolean empty; - boolean paused; - - @Inject - public QuickSyslogImpl() { - super(GWT.create(UI.class)); - - setOpenCloseConsumer(isOpen -> { - if (presenter == null) - return; - if (isOpen) { - presenter.onOpen(); - } else { - resetLogPanel(); - presenter.onClose(); - } - }); - - levelListBox.setValue(SyslogLevel.INFO); - levelListBox.setAcceptableValues(Arrays.asList(SyslogLevel.values())); - levelListBox.addValueChangeHandler(event -> { - if (presenter != null) { - presenter.onLogLevelChanged(event.getValue()); - } - }); - - pauseButton.addClickHandler(event -> pause(true)); - continueButton.addClickHandler(event -> pause(false)); - - resetLogPanel(); - } - - @Override - public void setPresenter(Presenter presenter) { - this.presenter = presenter; - } - - @Override - public SyslogLevel getLogLevel() { - return levelListBox.getValue(); - } - - @Override - public void addEvent(SyslogEvent event) { - if (paused) - return; - - // Remove empty message label - if (empty) - logPanel.remove(0); - empty = false; - - // Limit to 200 messages - if (logPanel.getWidgetCount() >= 200) - logPanel.remove(0); - - logPanel.add(createItem(event)); - - scrollToBottom(); - } - - @UiHandler("clearButton") - public void clearClicked(ClickEvent event) { - resetLogPanel(); - } - - protected void resetLogPanel() { - logPanel.clear(); - empty = true; - Label emptyMessage = new Label(managerMessages.noLogMessagesReceived()); - emptyMessage.addStyleName(widgetStyle.FormListEmptyMessage()); - logPanel.add(emptyMessage); - } - - protected Widget createItem(SyslogEvent event) { - FlowPanel itemPanel = new FlowPanel(); - itemPanel.addStyleName(style.logItem()); - itemPanel.addStyleName(widgetStyle.FormListItem()); - - FlowPanel levelCategoryPanel = new FlowPanel(); - levelCategoryPanel.setStyleName("layout horizontal center"); - levelCategoryPanel.addStyleName(style.logItemLevelCategory()); - - MessagesIcon levelIcon = new MessagesIcon(event.getLevel().getIcon()); - levelCategoryPanel.add(levelIcon); - - Label categoryLabel = new Label(); - categoryLabel.setText(event.getCategory().name()); - levelCategoryPanel.add(categoryLabel); - - event.getSubCategoryOptional().ifPresent(s -> { - Label subCategoryLabel= new Label(); - subCategoryLabel.setText(": " + s); - levelCategoryPanel.add(subCategoryLabel); - }); - - itemPanel.add(levelCategoryPanel); - - Label messageLabel = new Label(); - messageLabel.setText(event.getMessage()); - itemPanel.add(messageLabel); - - return itemPanel; - } - - protected void scrollToBottom() { - logPanel.getElement().setScrollTop(logPanel.getElement().getScrollHeight()); - } - - protected void pause(boolean pause) { - this.paused = pause; - pauseButton.setVisible(!pause); - continueButton.setVisible(pause); - if (!pause) - scrollToBottom(); - } -} \ No newline at end of file diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogImpl.ui.xml deleted file mode 100644 index 49182dacc1..0000000000 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogImpl.ui.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - .popup { - z-index: 10; - } - - .panel { - width: 36em; - height: 25em; - } - - .header { - font-weight: 700; - padding: 0.4em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - .filterForm { - } - - .filterFormGroup { - margin: 0 !important; - } - - .filterFormLabel { - width: inherit !important; - } - - .filterFormField { - min-width: inherit !important; - } - - .logPanel { - overflow: auto; - } - - .logItem { - font-size: x-small; - } - - .logItemLevelCategory { - font-weight: bold; - } - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
-
- -
diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogPresenter.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogPresenter.java deleted file mode 100644 index c611b642b3..0000000000 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/QuickSyslogPresenter.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2017, OpenRemote Inc. - * - * See the CONTRIBUTORS.txt file in the distribution for a - * full listing of individual contributors. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package org.openremote.manager.client.admin.syslog; - -import com.google.inject.Inject; -import org.openremote.manager.client.Environment; -import org.openremote.manager.client.ManagerHistoryMapper; -import org.openremote.model.syslog.SyslogEvent; -import org.openremote.model.syslog.SyslogLevel; - -import java.util.logging.Logger; - -public class QuickSyslogPresenter implements QuickSyslog.Presenter { - - private static final Logger LOG = Logger.getLogger(QuickSyslogPresenter.class.getName()); - - final protected Environment environment; - final protected ManagerHistoryMapper managerHistoryMapper; - final protected QuickSyslog view; - - @Inject - public QuickSyslogPresenter(Environment environment, - ManagerHistoryMapper managerHistoryMapper, - QuickSyslog view) { - this.environment = environment; - this.managerHistoryMapper = managerHistoryMapper; - this.view = view; - - view.setPresenter(this); - - environment.getEventBus().register(SyslogEvent.class, view::addEvent); - } - - @Override - public QuickSyslog getView() { - return view; - } - - @Override - public void onOpen() { - environment.getEventService().subscribe( - SyslogEvent.class, - new SyslogEvent.LevelCategoryFilter(view.getLogLevel()) - ); - } - - @Override - public void onClose() { - environment.getEventService().unsubscribe(SyslogEvent.class); - } - - @Override - public void onLogLevelChanged(SyslogLevel level) { - environment.getEventService().unsubscribe(SyslogEvent.class); - environment.getEventService().subscribe( - SyslogEvent.class, - new SyslogEvent.LevelCategoryFilter(level) - ); - } -} diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverview.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogConfigMapper.java similarity index 55% rename from manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverview.java rename to manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogConfigMapper.java index e4e4db21f9..0382020f77 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/overview/AdminOverview.java +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogConfigMapper.java @@ -17,16 +17,18 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -package org.openremote.manager.client.admin.overview; +package org.openremote.manager.client.admin.syslog; -import org.openremote.manager.client.admin.AdminContent; - -public interface AdminOverview extends AdminContent { - - interface Presenter { - - } - - void setPresenter(Presenter presenter); +import com.github.nmorel.gwtjackson.client.ObjectMapper; +import com.github.nmorel.gwtjackson.client.annotation.JsonMixIns; +import org.openremote.manager.client.interop.jackson.DefaultJsonMixin; +import org.openremote.manager.shared.http.EntityReader; +import org.openremote.manager.shared.http.EntityWriter; +import org.openremote.manager.shared.syslog.SyslogConfig; +@JsonMixIns({@JsonMixIns.JsonMixIn(target = SyslogConfig.class, mixIn = DefaultJsonMixin.class)}) +public interface SyslogConfigMapper + extends ObjectMapper, + EntityReader, + EntityWriter { } diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogFilter.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogFilter.java new file mode 100644 index 0000000000..9a12151cf3 --- /dev/null +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogFilter.java @@ -0,0 +1,130 @@ +/* + * Copyright 2017, OpenRemote Inc. + * + * See the CONTRIBUTORS.txt file in the distribution for a + * full listing of individual contributors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.openremote.manager.client.admin.syslog; + +import com.google.gwt.user.client.ui.FlowPanel; +import org.openremote.manager.client.i18n.ManagerMessages; +import org.openremote.manager.client.style.WidgetStyle; +import org.openremote.manager.client.widget.*; +import org.openremote.model.syslog.SyslogLevel; + +import static org.openremote.manager.shared.syslog.SyslogConfig.DEFAULT_LEVEL; +import static org.openremote.manager.shared.syslog.SyslogConfig.DEFAULT_LIMIT; + +public abstract class SyslogFilter extends FormGroup { + + final protected FormListBox limitListBox; + final protected FormListBox levelListBox; + final protected FormButton pauseButton; + final protected FormButton continueButton; + + public SyslogFilter(ManagerMessages messages, WidgetStyle widgetStyle) { + FormLabel showLastLabel = new FormLabel(messages.showLast()); + showLastLabel.addStyleName("inline"); + addFormLabel(showLastLabel); + + FormField field = new FormField(); + addFormField(field); + FlowPanel fieldPanel = new FlowPanel(); + field.add(fieldPanel); + + limitListBox = new FormListBox(); + fieldPanel.add(limitListBox); + limitListBox.addItem("15"); + limitListBox.addItem("50"); + limitListBox.addItem("200"); + limitListBox.addChangeHandler(event -> onLimitChanged(getFilterLimit())); + + levelListBox = new FormListBox(); + fieldPanel.add(levelListBox); + for (SyslogLevel syslogLevel : SyslogLevel.values()) { + levelListBox.addItem(syslogLevel.name()); + } + levelListBox.addChangeHandler(event -> onLevelChanged(getFilterLevel())); + FormLabel eventsLabel = new FormLabel(messages.events()); + eventsLabel.addStyleName("inline"); + fieldPanel.add(eventsLabel); + + FormGroupActions actions = new FormGroupActions(); + addFormGroupActions(actions); + + pauseButton = new FormButton(messages.pauseLog()); + pauseButton.setIcon("pause"); + actions.add(pauseButton); + continueButton = new FormButton(messages.continueLog()); + continueButton.setIcon("play"); + actions.add(continueButton); + + pauseButton.addClickHandler(event -> { + pauseButton.setVisible(false); + continueButton.setVisible(true); + onPauseLog(); + }); + + continueButton.addClickHandler(event -> { + pauseButton.setVisible(true); + continueButton.setVisible(false); + onContinueLog(); + }); + + FormButton clearButton = new FormButton(messages.clear()); + clearButton.setIcon("eraser"); + clearButton.addClickHandler(event -> onClearLog()); + actions.add(clearButton); + + switch (DEFAULT_LIMIT) { + case 15: + limitListBox.setSelectedIndex(0); + break; + case 50: + limitListBox.setSelectedIndex(1); + break; + default: + limitListBox.setSelectedIndex(2); + break; + } + levelListBox.setSelectedIndex(DEFAULT_LEVEL.ordinal()); + setPaused(false); + } + + public SyslogLevel getFilterLevel() { + return SyslogLevel.valueOf(levelListBox.getSelectedValue()); + } + + public int getFilterLimit() { + return Integer.valueOf(limitListBox.getSelectedValue()); + } + + public void setPaused(boolean paused) { + pauseButton.setVisible(!paused); + continueButton.setVisible(paused); + } + + protected abstract void onClearLog(); + + protected abstract void onContinueLog(); + + protected abstract void onPauseLog(); + + protected abstract void onLimitChanged(int limit); + + protected abstract void onLevelChanged(SyslogLevel level); + +} diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogItem.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogItem.java new file mode 100644 index 0000000000..5c4a93c907 --- /dev/null +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogItem.java @@ -0,0 +1,83 @@ +/* + * Copyright 2017, OpenRemote Inc. + * + * See the CONTRIBUTORS.txt file in the distribution for a + * full listing of individual contributors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.openremote.manager.client.admin.syslog; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Element; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.safehtml.client.SafeHtmlTemplates; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.user.client.DOM; +import org.openremote.model.Constants; +import org.openremote.model.syslog.SyslogEvent; + +import java.util.Date; + +/** + * Lightweight, not a Widget. + */ +public class SyslogItem { + + final protected Element element; + + public interface Templates extends SafeHtmlTemplates { + @Template( + "
" + + "" + + "{2}" + + "{3}" + + "
" + + "
{4}
" + ) + SafeHtml eventTemplate(String icon, String level, String category, String date, String message); + } + + private static final Templates TEMPLATES = GWT.create(Templates.class); + + + public SyslogItem(SyslogEvent event) { + element = Document.get().createElement(DivElement.TAG); + element.setClassName("flex-none layout vertical or-FormListItem"); + String level; + switch (event.getLevel()) { + case WARN: + level = "warn"; + break; + case ERROR: + level = "error"; + break; + default: + level = ""; + } + element.setInnerSafeHtml(TEMPLATES.eventTemplate( + event.getLevel().getIcon(), + level, + event.getCategoryLabel(), + DateTimeFormat.getFormat(Constants.DEFAULT_DATETIME_FORMAT_MILLIS).format(new Date(event.getTimestamp())), + event.getMessage() + )); + } + + public Element getElement() { + return element; + } +} diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogItems.java b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogItems.java new file mode 100644 index 0000000000..338e28f677 --- /dev/null +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/syslog/SyslogItems.java @@ -0,0 +1,72 @@ +/* + * Copyright 2017, OpenRemote Inc. + * + * See the CONTRIBUTORS.txt file in the distribution for a + * full listing of individual contributors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.openremote.manager.client.admin.syslog; + +import com.google.gwt.dom.client.Style; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.IsWidget; +import org.openremote.model.syslog.SyslogEvent; + +public class SyslogItems extends FlowPanel { + + final protected IsWidget emptyLabel; + boolean empty = true; + + public SyslogItems(IsWidget emptyLabel) { + this.emptyLabel = emptyLabel; + setStyleName("flex layout vertical or-FormList"); + getElement().getStyle().setOverflow(Style.Overflow.AUTO); + add(emptyLabel); + } + + public void addItem(SyslogEvent event) { + if (empty) + remove(emptyLabel); + empty = false; + getElement().appendChild(new SyslogItem(event).getElement()); + scrollToBottom(); + } + + public int getItemCount() { + return getElement().getChildCount(); + } + + public void removeFirstItem() { + if (getItemCount() > 0) { + getElement().removeChild(getElement().getFirstChild()); + } + if (getItemCount() == 0) { + empty = true; + add(emptyLabel); + } + } + + @Override + public void clear() { + super.clear(); + empty = true; + add(emptyLabel); + } + + protected void scrollToBottom() { + getElement().setScrollTop(getElement().getScrollHeight()); + } + +} diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/tenant/AdminTenantImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/admin/tenant/AdminTenantImpl.ui.xml index 8b34a72347..9e24c999ee 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/tenant/AdminTenantImpl.ui.xml +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/tenant/AdminTenantImpl.ui.xml @@ -38,16 +38,11 @@ -
- * - -
- - + @@ -58,7 +53,7 @@ - + @@ -69,7 +64,7 @@ - + diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/users/AdminUserImpl.java b/manager/client/src/main/java/org/openremote/manager/client/admin/users/AdminUserImpl.java index 4a39d2d9a0..ce30f6797b 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/users/AdminUserImpl.java +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/users/AdminUserImpl.java @@ -70,7 +70,7 @@ interface UI extends UiBinder { FormCheckBox enabledCheckBox; @UiField - FormGroup resetPasswordNoteGroup; + Label resetPasswordNote; @UiField FormGroup resetPasswordGroup; @@ -83,7 +83,7 @@ interface UI extends UiBinder { PasswordTextBox resetPasswordControlInput; @UiField - FormGroup rolesNoteGroup; + Label rolesNote; @UiField FormGroup rolesGroup; @@ -209,26 +209,15 @@ public void setUserEnabledError(boolean error) { @Override public void enableResetPassword(boolean enable) { - resetPasswordGroup.getStyle().clearDisplay(); - resetPasswordControlGroup.getStyle().clearDisplay(); - if (enable) { - resetPasswordNoteGroup.getStyle().setDisplay(NONE); - } else { - resetPasswordNoteGroup.getStyle().clearDisplay(); - resetPasswordGroup.getStyle().setDisplay(NONE); - resetPasswordControlGroup.getStyle().setDisplay(NONE); - } + resetPasswordNote.setVisible(!enable); + resetPasswordGroup.setVisible(enable); + resetPasswordControlGroup.setVisible(enable); } @Override public void enableRoles(boolean enable) { - rolesGroup.getStyle().clearDisplay(); - if (enable) { - rolesNoteGroup.getStyle().setDisplay(NONE); - } else { - rolesNoteGroup.getStyle().clearDisplay(); - rolesGroup.getStyle().setDisplay(NONE); - } + rolesNote.setVisible(!enable); + rolesGroup.setVisible(enable); } @Override diff --git a/manager/client/src/main/java/org/openremote/manager/client/admin/users/AdminUserImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/admin/users/AdminUserImpl.ui.xml index 203df1fd2f..5b9d7b72b6 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/admin/users/AdminUserImpl.ui.xml +++ b/manager/client/src/main/java/org/openremote/manager/client/admin/users/AdminUserImpl.ui.xml @@ -36,14 +36,13 @@ + text="{managerMessages.editUser}"/> - + @@ -96,11 +95,9 @@ - - - - - + @@ -127,11 +124,9 @@ - - - - - + diff --git a/manager/client/src/main/java/org/openremote/manager/client/app/FooterPresenter.java b/manager/client/src/main/java/org/openremote/manager/client/app/FooterPresenter.java index 8625ce4723..198cbc9162 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/app/FooterPresenter.java +++ b/manager/client/src/main/java/org/openremote/manager/client/app/FooterPresenter.java @@ -22,22 +22,18 @@ import com.google.gwt.place.shared.Place; import com.google.gwt.place.shared.PlaceController; import com.google.inject.Inject; -import org.openremote.manager.client.admin.syslog.QuickSyslog; import org.openremote.model.event.bus.EventBus; public class FooterPresenter implements FooterView.Presenter { private FooterView view; - private final QuickSyslog.Presenter quickSyslogPresenter; private PlaceController placeController; @Inject public FooterPresenter(FooterView view, - QuickSyslog.Presenter quickSyslogPresenter, PlaceController placeController, EventBus eventBus) { this.view = view; - this.quickSyslogPresenter = quickSyslogPresenter; this.placeController = placeController; view.setPresenter(this); @@ -48,11 +44,6 @@ public FooterView getView() { return view; } - @Override - public QuickSyslog getQuickSyslog() { - return quickSyslogPresenter.getView(); - } - @Override public void goTo(Place place) { placeController.goTo(place); diff --git a/manager/client/src/main/java/org/openremote/manager/client/app/FooterView.java b/manager/client/src/main/java/org/openremote/manager/client/app/FooterView.java index ab27fb8aba..2fbbde8e1f 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/app/FooterView.java +++ b/manager/client/src/main/java/org/openremote/manager/client/app/FooterView.java @@ -21,15 +21,12 @@ import com.google.gwt.place.shared.Place; import com.google.gwt.user.client.ui.IsWidget; -import org.openremote.manager.client.admin.syslog.QuickSyslog; public interface FooterView extends IsWidget { interface Presenter { FooterView getView(); - QuickSyslog getQuickSyslog(); - void goTo(Place place); } diff --git a/manager/client/src/main/java/org/openremote/manager/client/app/FooterViewImpl.java b/manager/client/src/main/java/org/openremote/manager/client/app/FooterViewImpl.java index a379e0d6e6..0aa8ec4ca6 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/app/FooterViewImpl.java +++ b/manager/client/src/main/java/org/openremote/manager/client/app/FooterViewImpl.java @@ -21,7 +21,6 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.place.shared.Place; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; @@ -35,9 +34,6 @@ public class FooterViewImpl extends Composite implements FooterView { interface UI extends UiBinder { } - @UiField - PushButton quickSyslogButton; - @UiField PushButton fullscreenButton; @@ -55,11 +51,6 @@ public void setPresenter(Presenter presenter) { this.presenter = presenter; } - @UiHandler("quickSyslogButton") - public void quickSyslogClicked(final ClickEvent event) { - presenter.getQuickSyslog().toggleRelativeTo(quickSyslogButton); - } - @UiHandler("fullscreenButton") public void onFullscreenClicked(ClickEvent e) { toggleFullscreen(); diff --git a/manager/client/src/main/java/org/openremote/manager/client/app/FooterViewImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/app/FooterViewImpl.ui.xml index f40671807f..766ab1eb74 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/app/FooterViewImpl.ui.xml +++ b/manager/client/src/main/java/org/openremote/manager/client/app/FooterViewImpl.ui.xml @@ -31,13 +31,6 @@ -
- -
-
{ +public interface SharedEventArrayMapper + extends ObjectMapper, + EntityReader { } \ No newline at end of file diff --git a/manager/client/src/main/java/org/openremote/manager/client/i18n/ManagerMessages.java b/manager/client/src/main/java/org/openremote/manager/client/i18n/ManagerMessages.java index a6ad974911..f88320ba1c 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/i18n/ManagerMessages.java +++ b/manager/client/src/main/java/org/openremote/manager/client/i18n/ManagerMessages.java @@ -73,8 +73,6 @@ public interface ManagerMessages extends Messages { String search(); - String requiredFields(); - String newUser(); String selectTenant(); @@ -309,8 +307,6 @@ public interface ManagerMessages extends Messages { String noRulesetsFound(); - String systemStatus(); - String noTenantsFound(); String noUserFound(); @@ -337,13 +333,11 @@ public interface ManagerMessages extends Messages { String syslog(); - String filterLevel(); - String pauseLog(); String continueLog(); - String clearLog(); + String clear(); String noLogMessagesReceived(); @@ -368,4 +362,28 @@ public interface ManagerMessages extends Messages { String noAssetSelected(); String clearSelection(); + + String protocolConfiguration(); + + String showLast(); + + String events(); + + String store(); + + String eventsFor(); + + String saveSettings(); + + String removeAll(); + + String minutes(); + + String hours(); + + String days(); + + String eventsRemoved(); + + String settingsSaved(); } diff --git a/manager/client/src/main/java/org/openremote/manager/client/map/MapInfoPanel.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/map/MapInfoPanel.ui.xml index 0f6388d4aa..6b36e29656 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/map/MapInfoPanel.ui.xml +++ b/manager/client/src/main/java/org/openremote/manager/client/map/MapInfoPanel.ui.xml @@ -33,6 +33,7 @@ .infoItemLabel { font-size: 14px; line-height: 16px; + padding: 0 !important; } .infoItemValue { diff --git a/manager/client/src/main/java/org/openremote/manager/client/rules/AbstractRulesEditorActivity.java b/manager/client/src/main/java/org/openremote/manager/client/rules/AbstractRulesEditorActivity.java index 1a397fac36..082133d8b7 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/rules/AbstractRulesEditorActivity.java +++ b/manager/client/src/main/java/org/openremote/manager/client/rules/AbstractRulesEditorActivity.java @@ -124,6 +124,7 @@ public void onStop() { protected void startCreate() { ruleset = newRuleset(); + ruleset.setRules(environment.getMessages().rules() + "..."); clearViewMessages(); writeToView(); writeTemplateAssetToView(); diff --git a/manager/client/src/main/java/org/openremote/manager/client/rules/RulesEditorImpl.java b/manager/client/src/main/java/org/openremote/manager/client/rules/RulesEditorImpl.java index 8547d526c9..ee49932c45 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/rules/RulesEditorImpl.java +++ b/manager/client/src/main/java/org/openremote/manager/client/rules/RulesEditorImpl.java @@ -76,8 +76,6 @@ interface UI extends UiBinder { @UiField(provided = true) AssetSelector templateAssetSelector; - @UiField - FormGroup rulesGroup; @UiField FormTextArea rulesTextArea; @@ -272,7 +270,7 @@ public void cancelClicked(ClickEvent e) { protected void setOpaque(boolean opaque) { nameGroup.setOpaque(opaque); optionsGroup.setOpaque(opaque); - rulesGroup.setOpaque(opaque); + rulesTextArea.setOpaque(opaque); submitButtonGroup.setOpaque(opaque); } diff --git a/manager/client/src/main/java/org/openremote/manager/client/rules/RulesEditorImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/rules/RulesEditorImpl.ui.xml index 04844f1b12..bc738f6329 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/rules/RulesEditorImpl.ui.xml +++ b/manager/client/src/main/java/org/openremote/manager/client/rules/RulesEditorImpl.ui.xml @@ -20,8 +20,6 @@ } .rulesTextArea { - min-height: 38vh; - max-height: 75vh; } @@ -47,7 +45,7 @@ - + @@ -106,18 +104,9 @@ - - - - - - - - - - + diff --git a/manager/client/src/main/java/org/openremote/manager/client/rules/asset/AssetRulesListImpl.ui.xml b/manager/client/src/main/java/org/openremote/manager/client/rules/asset/AssetRulesListImpl.ui.xml index 4ba377513a..c60af1d927 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/rules/asset/AssetRulesListImpl.ui.xml +++ b/manager/client/src/main/java/org/openremote/manager/client/rules/asset/AssetRulesListImpl.ui.xml @@ -9,10 +9,6 @@ .navItem { margin: 0 1em; } - - .noRulesetsLabel { - max-width: 30em; - } @@ -69,7 +65,7 @@ sub="{managerMessages.manageAssetRulesets}"/> diff --git a/manager/client/src/main/java/org/openremote/manager/client/style/WidgetStyle.java b/manager/client/src/main/java/org/openremote/manager/client/style/WidgetStyle.java index 1ebd885d59..2488304fcb 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/style/WidgetStyle.java +++ b/manager/client/src/main/java/org/openremote/manager/client/style/WidgetStyle.java @@ -109,18 +109,6 @@ public String PopupPanelFooter() { return "or-PopupPanelFooter"; } - public String Headline() { - return "or-Headline"; - } - - public String HeadlineText() { - return "or-HeadlineText"; - } - - public String HeadlineSub() { - return "or-HeadlineSub"; - } - public String Form() { return "or-Form"; } diff --git a/manager/client/src/main/java/org/openremote/manager/client/widget/FormButton.java b/manager/client/src/main/java/org/openremote/manager/client/widget/FormButton.java index 932105fbc9..adfc44ab85 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/widget/FormButton.java +++ b/manager/client/src/main/java/org/openremote/manager/client/widget/FormButton.java @@ -22,8 +22,13 @@ public class FormButton extends PushButton { public FormButton() { + this(null); + } + + public FormButton(String text) { super(); addStyleName("or-FormControl or-FormButton"); + setText(text); } public void setPrimary(boolean primary) { diff --git a/manager/client/src/main/java/org/openremote/manager/client/widget/FormLabel.java b/manager/client/src/main/java/org/openremote/manager/client/widget/FormLabel.java index 6c29ab9336..54b1ba07af 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/widget/FormLabel.java +++ b/manager/client/src/main/java/org/openremote/manager/client/widget/FormLabel.java @@ -27,8 +27,6 @@ public class FormLabel extends ComplexPanel { protected SpanElement iconElement; protected String icon; protected LabelElement labelElement; - protected SpanElement requiredElement; - protected boolean required; protected boolean error; public FormLabel() { @@ -47,12 +45,6 @@ public FormLabel(String text) { labelElement.setHtmlFor(Document.get().createUniqueId()); getElement().appendChild(labelElement); - requiredElement= (SpanElement) Document.get().createElement(SpanElement.TAG); - requiredElement.addClassName("required"); - requiredElement.setInnerText("*"); - requiredElement.getStyle().setVisibility(Style.Visibility.HIDDEN); - getElement().appendChild(requiredElement); - setText(text); } @@ -64,15 +56,6 @@ public void setText(String text) { labelElement.setInnerText(text); } - public boolean isRequired() { - return required; - } - - public void setRequired(boolean required) { - this.required = required; - requiredElement.getStyle().setVisibility(required ? Style.Visibility.VISIBLE : Style.Visibility.HIDDEN); - } - public void setError(boolean error) { this.error = error; removeStyleName("error"); diff --git a/manager/client/src/main/java/org/openremote/manager/client/widget/FormTextArea.java b/manager/client/src/main/java/org/openremote/manager/client/widget/FormTextArea.java index 2e9c09413f..c44e1c998c 100644 --- a/manager/client/src/main/java/org/openremote/manager/client/widget/FormTextArea.java +++ b/manager/client/src/main/java/org/openremote/manager/client/widget/FormTextArea.java @@ -48,4 +48,11 @@ public void setWrap(String wrap) { getElement().setPropertyString("wrap", wrap); } + public void setOpaque(boolean opaque) { + removeStyleName("opaque"); + if (opaque) { + addStyleName("opaque"); + } + } + } \ No newline at end of file diff --git a/manager/client/src/main/resources/org/openremote/manager/client/i18n/ManagerMessages.properties b/manager/client/src/main/resources/org/openremote/manager/client/i18n/ManagerMessages.properties index a456005bdf..b4faf8b372 100644 --- a/manager/client/src/main/resources/org/openremote/manager/client/i18n/ManagerMessages.properties +++ b/manager/client/src/main/resources/org/openremote/manager/client/i18n/ManagerMessages.properties @@ -21,7 +21,6 @@ OK=OK cancel=Cancel filter=Filter search=Search -requiredFields=Required fields newUser=New user selectTenant=Select tenant username=Username @@ -163,7 +162,6 @@ canvasNotSupported=Canvas rendering not supported on this browser. previous=Previous next=Next noRulesetsFound=No rulesets found, please create a ruleset. -systemStatus=System status noTenantsFound=No tenants found, please create a tenant. noUserFound=No users found, please create a user. showLiveUpdates=Show live updates @@ -225,10 +223,9 @@ validationFailure[NOT_A_VALID_NUMBER]=Must be a number. validationFailure[WRONG_COLOR_FORMAT]=Wrong color format. validationFailure[TEMPERATURE_OUT_OF_RANGE]=Temperature out of scale''s range. syslog=System Log -filterLevel=Filter level pauseLog=Pause continueLog=Continue -clearLog=Clear log +clear=Clear noLogMessagesReceived=No log messages received. jsonObject=JSON object jsonArray=JSON array @@ -241,5 +238,16 @@ templateAsset=Template asset invalidTemplateAsset=Invalid template asset, please change your selection. noAssetSelected=No asset selected clearSelection=Clear selection - +protocolConfiguration=Protocol configuration +showLast=Show last +events=events +store=Store +eventsFor=events for +saveSettings=Save settings +removeAll=Remove all +minutes=Minutes +hours=Hours +days=Days +eventsRemoved=All events removed. +settingsSaved=Settings saved. diff --git a/manager/client/src/main/webapp/css/style.html b/manager/client/src/main/webapp/css/style.html index 58b00e4855..fd31dbfb57 100644 --- a/manager/client/src/main/webapp/css/style.html +++ b/manager/client/src/main/webapp/css/style.html @@ -1,6 +1,6 @@