From 21181bc6f857edf3b3c2b4153f4ca078e3bed5c1 Mon Sep 17 00:00:00 2001 From: Kai Zimmermann Date: Tue, 7 Feb 2017 09:57:43 +0100 Subject: [PATCH] Update Spring Boot & Hateoas (#430) * Upgrade spring boot 1.4.4 and hateoas 0.23. Removed unneded dependency, Signed-off-by: kaizimmerm * Avoid link change with new hateoas version. Signed-off-by: kaizimmerm * Readded commons.io Signed-off-by: kaizimmerm * Update MariaDB driver to 1.5.7 Signed-off-by: kaizimmerm * Added missing content to docs. Signed-off-by: kaizimmerm * Fix equals. Signed-off-by: kaizimmerm * Simplify Signed-off-by: kaizimmerm * Fix equal after removal of commons collections. Signed-off-by: kaizimmerm --- docs/src/main/resources/_data/doclinks.yml | 4 +- .../architecture/rollout-management.md | 45 ++++++++++++++++++ .../documentation/guide/clustering.md | 9 ++-- .../images/rolloutgroupstatediagram.png | Bin 0 -> 8847 bytes .../images/rolloutstatediagram.png | Bin 0 -> 11327 bytes .../interfaces/management-api.md | 4 +- .../resource/MgmtSoftwareModuleMapper.java | 3 +- .../mgmt/rest/resource/MgmtTargetMapper.java | 3 +- .../hawkbit-repository-jpa/pom.xml | 4 -- .../jpa/JpaDistributionSetManagement.java | 2 +- .../jpa/builder/JpaDistributionSetCreate.java | 2 +- .../builder/JpaDistributionSetTypeCreate.java | 2 +- .../jpa/model/JpaDistributionSetType.java | 2 +- hawkbit-ui/pom.xml | 4 -- .../hawkbit/ui/common/CommonDialogWindow.java | 24 ++-------- .../targettable/TargetBeanQuery.java | 4 +- .../management/targettable/TargetTable.java | 2 +- pom.xml | 13 ++--- 18 files changed, 74 insertions(+), 53 deletions(-) create mode 100644 docs/src/main/resources/documentation/architecture/rollout-management.md create mode 100644 docs/src/main/resources/documentation/images/rolloutgroupstatediagram.png create mode 100644 docs/src/main/resources/documentation/images/rolloutstatediagram.png diff --git a/docs/src/main/resources/_data/doclinks.yml b/docs/src/main/resources/_data/doclinks.yml index cc12a5b8e..b104b4a8e 100644 --- a/docs/src/main/resources/_data/doclinks.yml +++ b/docs/src/main/resources/_data/doclinks.yml @@ -17,6 +17,8 @@ href: "/documentation/architecture/datamodel.html" - title: "Target States" href: "/documentation/architecture/targetstate.html" + - title: "Rollout Management" + href: "/documentation/architecture/rollout-management.html" - title: "Interfaces" href: "" @@ -48,4 +50,4 @@ - title: "Theme Customization" href: "/documentation/guide/customtheme.html" - title: "Create Feign Client" - href: "/documentation/guide/feignclient.html" \ No newline at end of file + href: "/documentation/guide/feignclient.html" diff --git a/docs/src/main/resources/documentation/architecture/rollout-management.md b/docs/src/main/resources/documentation/architecture/rollout-management.md new file mode 100644 index 000000000..9b7a1792c --- /dev/null +++ b/docs/src/main/resources/documentation/architecture/rollout-management.md @@ -0,0 +1,45 @@ +--- +layout: documentation +title: Rollout Management +--- + +{% include base.html %} + +Software update operations in large scale IoT scenarios with hundreds of thousands of devices require special handling. + +That includes: +- _Technical Scalability_ by means of horizontal scale of the _Rollouts_ server cluster in the cloud. +- _Global_ artifact _content delivery_ capacities. +- _Functional Scalability_ by means of: + - Secure handling of large volumes of devices at rollout creation time. + - Monitoring of the rollout progress. + - Emergency rollout shutdown in case of problems on to many devices. + +- Reporting capabilities for a complete understanding of the rollout progress at each point in time. + +Eclipse _hawkBit_ sees these capabilities under the term Rollout Management. + +The following capabilities are currently supported by the _Rollout Management_: +- Create, update and start of rollouts. + - Selection of targets as input for the rollout based on _target filter_ functionality. + - Selection of a _DistributionSet_. + - Auto-splitting of the input target list into a defined number deployment groups. + +- Cascading start of the deployment groups based on installation status of the previous group. +- Emergency shutdown of the rollout in case a group exceeds the defined error threshold. +- Rollout progress monitoring for the entire rollout and the individual groups. + + +## Cascading Deployment Group Execution +The cascading execution of the deployment groups is based on two thresholds that can be defined by the rollout creator. +- success condition by means of percentage of successfully installed targets in the current groups triggers. +- error condition by means of absolute or percentage of failed installations which triggers an emergency shutdown of the entire rollout. + +[[images/DeploymentGroups.png]] + +## Rollout state machine +### State Machine on Rollout +![](../images/rolloutstatediagram.png){:width="100%" .image-center} + +### State Machine on Rollout Deployment Group +![](../images/rolloutgroupstatediagram.png){:width="100%" .image-center} diff --git a/docs/src/main/resources/documentation/guide/clustering.md b/docs/src/main/resources/documentation/guide/clustering.md index 4c589bf93..a4ff6d383 100644 --- a/docs/src/main/resources/documentation/guide/clustering.md +++ b/docs/src/main/resources/documentation/guide/clustering.md @@ -9,7 +9,7 @@ title: Clustering _hawkBit_ is able to run in a cluster with some constraints. This guide provides insights in the basic concepts and how to setup your own cluster. You can find additional information in the [hawkbit example app's README](https://github.com/eclipse/hawkbit/blob/master/examples/hawkbit-example-app/README.md). -# Big picture +# Big picture ![](../images/overall_cluster.png){:width="100%"} @@ -18,7 +18,7 @@ _hawkBit_ is able to run in a cluster with some constraints. This guide provides Event communication between nodes is based on [Spring Cloud Bus](https://cloud.spring.io/spring-cloud-bus/) and [Spring Cloud Stream](http://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/). There are different [binder implementations](http://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_binders) available. The _hawkbit example app_ uses RabbitMQ binder. Every node gets his own queue to receive cluster events, the default payload is JSON. If an event is thrown locally at one node, it will be automatically delivered to all other available nodes via the Spring Cloud Bus's topic exchange: -![](../images/eventing-within-cluster.png){:width="100%"} +[[images/eventing-within-cluster.png]] Via the ServiceMatcher you can check whether an event happened locally at one node or on a different node. `serviceMatcher.isFromSelf(event)` @@ -26,7 +26,7 @@ Via the ServiceMatcher you can check whether an event happened locally at one no # Caching Every node is maintaining its own caches independent from other nodes. So there is no globally shared/synchronized cache instance within the cluster. In order to keep nodes in sync a TTL (time to live) can be set for all caches to ensure that after some time the cache is refreshed from the database. To enable the TTL just set the property "hawkbit.cache.global.ttl" (value in milliseconds). -Of course you can implement a shared cache, e.g. Redis. +Of course you can implement a shared cache, e.g. Redis. See [CacheAutoConfiguration](https://github.com/eclipse/hawkbit/blob/master/hawkbit-autoconfigure/src/main/java/org/eclipse/hawkbit/autoconfigure/cache/CacheAutoConfiguration.java) # Schedulers @@ -36,7 +36,7 @@ Every node has multiple schedulers which run after a defined period of time. All # Known constraints ## UI sessions -As of today _hawkBit_ isn't storing user sessions in a shared, clusterwide cache. Session is only bound to the node where the login took place. If this node is going down for whatever reason, the session is lost and the user is forced to login again. +As of today _hawkBit_ isn't storing user sessions in a shared, clusterwide cache. Session is only bound to the node where the login took place. If this node is going down for whatever reason, the session is lost and the user is forced to login again. In case that's not an option, you can help yourself by introducing a shared session cache based on e.g. Redis. Furthermore _hawkBit_ isn't supporting session stickiness out of the box either. However most of the well known load balancers out there can solve this issue. @@ -49,4 +49,3 @@ In a cluster-capable environment this fact can lead to issues as it could happen _hawkbit_ owns the feature of guarding itself from DoS attacks, a [DoS filter](https://github.com/eclipse/hawkbit/blob/master/hawkbit-security-core/src/main/java/org/eclipse/hawkbit/security/DosFilter.java). It reduces the maximum number of requests per seconds which can be configured for read and write requests. This mechanism is only working for every node separately, i.e. in a cluster environment the worst-case behaviour would be that the maximum number of requests per seconds will be increased to its product if every request is handled by a different node. The same constraint exists with the validator to check if a user tried too many logins within a defined period of time. - diff --git a/docs/src/main/resources/documentation/images/rolloutgroupstatediagram.png b/docs/src/main/resources/documentation/images/rolloutgroupstatediagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6a472812087234a7ad95b9f736b99ce4371670ce GIT binary patch literal 8847 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 literal 0 HcmV?d00001 diff --git a/docs/src/main/resources/documentation/images/rolloutstatediagram.png b/docs/src/main/resources/documentation/images/rolloutstatediagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb273173a79e07eeba2f841bad4cc2f325f1027 GIT binary patch literal 11327 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 literal 0 HcmV?d00001 diff --git a/docs/src/main/resources/documentation/interfaces/management-api.md b/docs/src/main/resources/documentation/interfaces/management-api.md index 21d075ffc..f7c0dacfb 100644 --- a/docs/src/main/resources/documentation/interfaces/management-api.md +++ b/docs/src/main/resources/documentation/interfaces/management-api.md @@ -36,7 +36,7 @@ Available Management APIs resources are: * [Software Module Types](https://docs.bosch-iot-rollouts.com/documentation/rest-api/softwaremoduletypes-api-guide.html) * [Target Tag](https://docs.bosch-iot-rollouts.com/documentation/rest-api/targettag-api-guide.html) * [Distribution Set Tag](https://docs.bosch-iot-rollouts.com/documentation/rest-api/distributionsettag-api-guide.html) -* [Rollouts](http://https://docs.bosch-iot-rollouts.com/documentation/developerguide/apispecifications/managementapi/rollouts.html) +* [Rollouts](https://docs.bosch-iot-rollouts.com/documentation/rest-api/rollout-api-guide.html) ## Headers @@ -74,4 +74,4 @@ A _Distribution Set_ entity may have for example URIs to artifacts, _Software Mo "metadata": { "href": "http://localhost:8080/rest/v1/softwaremodules/83/metadata?offset=0&limit=50" } -{% endhighlight %} \ No newline at end of file +{% endhighlight %} diff --git a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtSoftwareModuleMapper.java b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtSoftwareModuleMapper.java index a78fcf812..ba441bbb7 100644 --- a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtSoftwareModuleMapper.java +++ b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtSoftwareModuleMapper.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.lang3.ArrayUtils; import org.eclipse.hawkbit.mgmt.json.model.MgmtMetadata; import org.eclipse.hawkbit.mgmt.json.model.artifact.MgmtArtifact; import org.eclipse.hawkbit.mgmt.json.model.artifact.MgmtArtifactHash; @@ -116,7 +117,7 @@ public final class MgmtSoftwareModuleMapper { response.add(linkTo(methodOn(MgmtSoftwareModuleResource.class).getMetadata(response.getModuleId(), Integer.parseInt(MgmtRestConstants.REQUEST_PARAMETER_PAGING_DEFAULT_OFFSET), Integer.parseInt(MgmtRestConstants.REQUEST_PARAMETER_PAGING_DEFAULT_LIMIT), null, null)) - .withRel("metadata")); + .withRel("metadata").expand(ArrayUtils.toArray())); return response; } diff --git a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtTargetMapper.java b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtTargetMapper.java index f593b12be..5ef0e726c 100644 --- a/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtTargetMapper.java +++ b/hawkbit-mgmt-resource/src/main/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtTargetMapper.java @@ -19,6 +19,7 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.lang3.ArrayUtils; import org.eclipse.hawkbit.mgmt.json.model.MgmtPollStatus; import org.eclipse.hawkbit.mgmt.json.model.action.MgmtAction; import org.eclipse.hawkbit.mgmt.json.model.action.MgmtActionStatus; @@ -65,7 +66,7 @@ public final class MgmtTargetMapper { response.add(linkTo(methodOn(MgmtTargetRestApi.class).getActionHistory(response.getControllerId(), 0, MgmtRestConstants.REQUEST_PARAMETER_PAGING_DEFAULT_LIMIT_VALUE, ActionFields.ID.getFieldName() + ":" + SortDirection.DESC, null)) - .withRel(MgmtRestConstants.TARGET_V1_ACTIONS)); + .withRel(MgmtRestConstants.TARGET_V1_ACTIONS).expand(ArrayUtils.toArray())); } static void addPollStatus(final Target target, final MgmtTarget targetRest) { diff --git a/hawkbit-repository/hawkbit-repository-jpa/pom.xml b/hawkbit-repository/hawkbit-repository-jpa/pom.xml index d1f275f81..7398d24db 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/pom.xml +++ b/hawkbit-repository/hawkbit-repository-jpa/pom.xml @@ -81,10 +81,6 @@ cz.jirutka.rsql rsql-parser - - org.apache.commons - commons-collections4 - diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java index dd8f25c11..5798a29db 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java @@ -18,7 +18,6 @@ import java.util.stream.Collectors; import javax.persistence.EntityManager; -import org.apache.commons.collections4.CollectionUtils; import org.eclipse.hawkbit.repository.DistributionSetFields; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetMetadataFields; @@ -69,6 +68,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.Modifying; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import com.google.common.base.Strings; diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/builder/JpaDistributionSetCreate.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/builder/JpaDistributionSetCreate.java index 6865f82ca..e5fb559c8 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/builder/JpaDistributionSetCreate.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/builder/JpaDistributionSetCreate.java @@ -12,7 +12,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Optional; -import org.apache.commons.collections4.CollectionUtils; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.builder.AbstractDistributionSetUpdateCreate; @@ -21,6 +20,7 @@ import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.SoftwareModule; +import org.springframework.util.CollectionUtils; /** * Create/build implementation. diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/builder/JpaDistributionSetTypeCreate.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/builder/JpaDistributionSetTypeCreate.java index a71732646..f7b4ff6b3 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/builder/JpaDistributionSetTypeCreate.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/builder/JpaDistributionSetTypeCreate.java @@ -11,13 +11,13 @@ package org.eclipse.hawkbit.repository.jpa.builder; import java.util.Collection; import java.util.Collections; -import org.apache.commons.collections4.CollectionUtils; import org.eclipse.hawkbit.repository.SoftwareManagement; import org.eclipse.hawkbit.repository.builder.AbstractDistributionSetTypeUpdateCreate; import org.eclipse.hawkbit.repository.builder.DistributionSetTypeCreate; import org.eclipse.hawkbit.repository.exception.EntityNotFoundException; import org.eclipse.hawkbit.repository.jpa.model.JpaDistributionSetType; import org.eclipse.hawkbit.repository.model.SoftwareModuleType; +import org.springframework.util.CollectionUtils; /** * Create/build implementation. diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaDistributionSetType.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaDistributionSetType.java index cded4d4d5..5d55e5aa6 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaDistributionSetType.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/model/JpaDistributionSetType.java @@ -25,12 +25,12 @@ import javax.persistence.Table; import javax.persistence.UniqueConstraint; import javax.validation.constraints.Size; -import org.apache.commons.collections4.CollectionUtils; import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.hibernate.validator.constraints.NotEmpty; +import org.springframework.util.CollectionUtils; /** * A distribution set type defines which software module types can or have to be diff --git a/hawkbit-ui/pom.xml b/hawkbit-ui/pom.xml index b0d8d09b6..008581f9a 100644 --- a/hawkbit-ui/pom.xml +++ b/hawkbit-ui/pom.xml @@ -204,10 +204,6 @@ org.springframework.security spring-security-web - - org.apache.commons - commons-collections4 - com.vaadin diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java index 2adcef834..93a6d2e9e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java @@ -19,7 +19,6 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.hawkbit.ui.artifacts.smtable.SoftwareModuleAddUpdateWindow; import org.eclipse.hawkbit.ui.components.SPUIComponentProvider; @@ -33,7 +32,6 @@ import org.vaadin.hene.flexibleoptiongroup.FlexibleOptionGroupItemComponent; import com.google.common.base.Strings; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.vaadin.data.Container.ItemSetChangeEvent; import com.vaadin.data.Container.ItemSetChangeListener; import com.vaadin.data.Property.ValueChangeEvent; @@ -240,7 +238,7 @@ public class CommonDialogWindow extends Window { Object value = field.getValue(); if (field instanceof Table) { - value = Sets.newHashSet(((Table) field).getContainerDataSource().getItemIds()); + value = ((Table) field).getContainerDataSource().getItemIds(); } orginalValues.put(field, value); } @@ -263,6 +261,9 @@ public class CommonDialogWindow extends Window { } protected void addComponentListeners() { + // avoid duplicate registration + removeListeners(); + for (final AbstractField field : allComponents) { if (field instanceof TextChangeNotifier) { ((TextChangeNotifier) field).addTextChangeListener(new ChangeListener(field)); @@ -290,28 +291,13 @@ public class CommonDialogWindow extends Window { } final Object currentValue = getCurrentVaue(currentChangedComponent, newValue, field); - if (!isValueEquals(field, originalValue, currentValue)) { + if (!Objects.equals(originalValue, currentValue)) { return true; } } return false; } - private static boolean isValueEquals(final AbstractField field, final Object orginalValue, - final Object currentValue) { - if (Set.class.equals(field.getType())) { - return CollectionUtils.isEqualCollection(CollectionUtils.emptyIfNull((Collection) orginalValue), - CollectionUtils.emptyIfNull((Collection) currentValue)); - } - - if (String.class.equals(field.getType())) { - return Objects.equals(Strings.emptyToNull((String) orginalValue), - Strings.emptyToNull((String) currentValue)); - } - - return Objects.equals(orginalValue, currentValue); - } - private static Object getCurrentVaue(final Component currentChangedComponent, final Object newValue, final AbstractField field) { Object currentValue = field.getValue(); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetBeanQuery.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetBeanQuery.java index 1271fe166..285362a5b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetBeanQuery.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetBeanQuery.java @@ -20,7 +20,6 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import org.apache.commons.collections4.CollectionUtils; import org.eclipse.hawkbit.repository.FilterParams; import org.eclipse.hawkbit.repository.OffsetBasedPageRequest; import org.eclipse.hawkbit.repository.TargetManagement; @@ -39,6 +38,7 @@ import org.eclipse.hawkbit.ui.utils.SpringContextHelper; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort; +import org.springframework.util.CollectionUtils; import org.vaadin.addons.lazyquerycontainer.AbstractBeanQuery; import org.vaadin.addons.lazyquerycontainer.QueryDefinition; @@ -211,7 +211,7 @@ public class TargetBeanQuery extends AbstractBeanQuery { private boolean isAnyFilterSelected() { final boolean isFilterSelected = isTagSelected() || isOverdueFilterEnabled(); - return isFilterSelected || CollectionUtils.isNotEmpty(status) || distributionId != null + return isFilterSelected || !CollectionUtils.isEmpty(status) || distributionId != null || !isNullOrEmpty(searchText); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java index 94f0d427f..cfd9a4a4e 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/targettable/TargetTable.java @@ -26,7 +26,6 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.commons.collections4.CollectionUtils; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.FilterParams; import org.eclipse.hawkbit.repository.TagManagement; @@ -70,6 +69,7 @@ import org.eclipse.hawkbit.ui.utils.UIComponentIdProvider; import org.eclipse.hawkbit.ui.utils.UINotification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory; import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer; import org.vaadin.addons.lazyquerycontainer.LazyQueryDefinition; diff --git a/pom.xml b/pom.xml index 5bf1d5303..29931c176 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.3.RELEASE + 1.4.4.RELEASE org.eclipse.hawkbit @@ -101,11 +101,12 @@ 1.8 - 1.4.3.RELEASE + 1.4.4.RELEASE true + 0.23.0.RELEASE 2.0.0 @@ -137,14 +138,13 @@ 1.1.6 1.0.2 19.0 - 1.5.3 + 1.5.7 1.50.5 2.2.4 1.1.7 1.1 1.1.1 3.4 - 4.1 20141113 2.1.0 Camden.SR1 @@ -668,11 +668,6 @@ commons-lang3 ${commons-lang3.version} - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - org.springframework.boot spring-boot-starter-test