/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.server.api.model; import com.thoughtworks.xstream.annotations.XStreamAlias; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; import java.util.StringJoiner; import java.util.stream.Collectors; @XmlRootElement(name = "kie-container-filter") @XStreamAlias("kie-container-filter") @XmlAccessorType(XmlAccessType.NONE) public class KieContainerResourceFilter { public static final KieContainerResourceFilter ACCEPT_ALL = new KieContainerResourceFilter(); @XmlElement(name = "release-id-filter") @XStreamAlias("release-id-filter") private final ReleaseIdFilter releaseIdFilter; @XmlElement(name = "container-status-filter") @XStreamAlias("container-status-filter") private final KieContainerStatusFilter statusFilter; private KieContainerResourceFilter() { // needed for JAXB this.releaseIdFilter = ReleaseIdFilter.ACCEPT_ALL; this.statusFilter = KieContainerStatusFilter.ACCEPT_ALL; } public KieContainerResourceFilter(ReleaseIdFilter releaseIdFilter, KieContainerStatusFilter statusFilter) { this.releaseIdFilter = releaseIdFilter; this.statusFilter = statusFilter; } public KieContainerResourceFilter(ReleaseIdFilter releaseIdFilter) { this(releaseIdFilter, KieContainerStatusFilter.ACCEPT_ALL); } public ReleaseIdFilter getReleaseIdFilter() { return releaseIdFilter; } public KieContainerStatusFilter getStatusFilter() { return statusFilter; } public boolean accept(KieContainerResource kieContainerResource) { if (kieContainerResource == null) { throw new IllegalArgumentException("KieContainerResource can not be null!"); } // in case resolved release id exists, check against that ReleaseId resolvedReleaseId = kieContainerResource.getResolvedReleaseId(); if (resolvedReleaseId != null) { if (!releaseIdFilter.accept(resolvedReleaseId)) { return false; } } else { if (!releaseIdFilter.accept(kieContainerResource.getReleaseId())) { return false; } } KieContainerStatus status = kieContainerResource.getStatus(); if (status != null && !statusFilter.accept(status)) { return false; } // all sub-filters accepted the container, so it is a match return true; } /** * Creates representation of this filter which can be used as part of the URL (e.g. the "?" query part). * * @return string representation that can be directly used in URL (as query params), without the leading '?' */ public String toURLQueryString() { StringJoiner joiner = new StringJoiner("&"); if (releaseIdFilter.getGroupId() != null) { joiner.add("groupId=" + releaseIdFilter.getGroupId()); } if (releaseIdFilter.getArtifactId() != null) { joiner.add("artifactId=" + releaseIdFilter.getArtifactId()); } if (releaseIdFilter.getVersion() != null) { joiner.add("version=" + releaseIdFilter.getVersion()); } // don't send over the default status filter (e.g. one that accepts all the states) as it is not needed, it is // the default if (!statusFilter.equals(KieContainerStatusFilter.ACCEPT_ALL)) { String status = statusFilter.getAcceptedStatuses() .stream() .map(s -> s.toString()) .collect(Collectors.joining(",")); joiner.add("status=" + status); } return joiner.toString(); } @Override public String toString() { return "KieContainerResourceFilter{" + "releaseIdFilter=" + releaseIdFilter + ", statusFilter=" + statusFilter + '}'; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } KieContainerResourceFilter that = (KieContainerResourceFilter) o; if (releaseIdFilter != null ? !releaseIdFilter.equals(that.releaseIdFilter) : that.releaseIdFilter != null) return false; return statusFilter != null ? statusFilter.equals(that.statusFilter) : that.statusFilter == null; } @Override public int hashCode() { int result = releaseIdFilter != null ? releaseIdFilter.hashCode() : 0; result = 31 * result + (statusFilter != null ? statusFilter.hashCode() : 0); return result; } public static class Builder { private ReleaseIdFilter releaseIdFilter = ReleaseIdFilter.ACCEPT_ALL; private KieContainerStatusFilter statusFilter = KieContainerStatusFilter.ACCEPT_ALL; public Builder() { } public Builder releaseId(ReleaseId releaseId) { this.releaseIdFilter = new ReleaseIdFilter(releaseId); return this; } public Builder releaseId(String groupId, String artifactId, String version) { this.releaseIdFilter = new ReleaseIdFilter(groupId, artifactId, version); return this; } public Builder status(KieContainerStatus containerStatus) { this.statusFilter = new KieContainerStatusFilter(containerStatus); return this; } public Builder statuses(KieContainerStatus... containerStatuses) { this.statusFilter = new KieContainerStatusFilter(containerStatuses); return this; } public KieContainerResourceFilter build() { return new KieContainerResourceFilter(releaseIdFilter, statusFilter); } } }