Rename filter to follow naming convention
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/86cf35f1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/86cf35f1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/86cf35f1 Branch: refs/heads/master Commit: 86cf35f1062ff8e71c843572b8a05b7035dd6586 Parents: cc95fa7 Author: Svetoslav Neykov <[email protected]> Authored: Thu Mar 5 15:11:07 2015 +0200 Committer: Svetoslav Neykov <[email protected]> Committed: Thu Mar 19 16:01:29 2015 +0200 ---------------------------------------------------------------------- .../brooklyn/launcher/BrooklynWebServer.java | 4 +- .../rest/filter/HaHotCheckResourceFilter.java | 114 +++++++++++++++++++ .../rest/filter/HaStateCheckResourceFilter.java | 114 ------------------- .../brooklyn/rest/BrooklynRestApiLauncher.java | 2 +- 4 files changed, 117 insertions(+), 117 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/86cf35f1/usage/launcher/src/main/java/brooklyn/launcher/BrooklynWebServer.java ---------------------------------------------------------------------- diff --git a/usage/launcher/src/main/java/brooklyn/launcher/BrooklynWebServer.java b/usage/launcher/src/main/java/brooklyn/launcher/BrooklynWebServer.java index aaac004..56df07a 100644 --- a/usage/launcher/src/main/java/brooklyn/launcher/BrooklynWebServer.java +++ b/usage/launcher/src/main/java/brooklyn/launcher/BrooklynWebServer.java @@ -60,7 +60,7 @@ import brooklyn.rest.BrooklynRestApi; import brooklyn.rest.BrooklynWebConfig; import brooklyn.rest.filter.BrooklynPropertiesSecurityFilter; import brooklyn.rest.filter.HaMasterCheckFilter; -import brooklyn.rest.filter.HaStateCheckResourceFilter; +import brooklyn.rest.filter.HaHotCheckResourceFilter; import brooklyn.rest.filter.LoggingFilter; import brooklyn.rest.filter.NoCacheFilter; import brooklyn.rest.filter.RequestTaggingFilter; @@ -324,7 +324,7 @@ public class BrooklynWebServer { config.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, GZIPContentEncodingFilter.class.getName()); config.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, ImmutableList.of(GZIPContentEncodingFilter.class, NoCacheFilter.class)); // Checks if appropriate request given HA status - config.getProperties().put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, HaStateCheckResourceFilter.class.getName()); + config.getProperties().put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, HaHotCheckResourceFilter.class.getName()); // configure to match empty path, or any thing which looks like a file path with /assets/ and extension html, css, js, or png // and treat that as static content config.getProperties().put(ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX, "(/?|[^?]*/assets/[^?]+\\.[A-Za-z0-9_]+)"); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/86cf35f1/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java b/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java new file mode 100644 index 0000000..55f5467 --- /dev/null +++ b/usage/rest-server/src/main/java/brooklyn/rest/filter/HaHotCheckResourceFilter.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * 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 brooklyn.rest.filter; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import brooklyn.entity.rebind.RebindManagerImpl.RebindTracker; +import brooklyn.management.ManagementContext; +import brooklyn.management.ha.ManagementNodeState; +import brooklyn.util.time.Duration; + +import com.google.common.collect.ImmutableSet; +import com.sun.jersey.api.model.AbstractMethod; +import com.sun.jersey.spi.container.ContainerRequest; +import com.sun.jersey.spi.container.ContainerRequestFilter; +import com.sun.jersey.spi.container.ContainerResponseFilter; +import com.sun.jersey.spi.container.ResourceFilter; +import com.sun.jersey.spi.container.ResourceFilterFactory; + +public class HaHotCheckResourceFilter implements ResourceFilterFactory { + private static final Set<ManagementNodeState> HOT_STATES = ImmutableSet.of( + ManagementNodeState.MASTER, ManagementNodeState.HOT_STANDBY, ManagementNodeState.HOT_BACKUP); + private static final long STATE_CHANGE_SETTLE_OFFSET = Duration.seconds(10).toMilliseconds(); + + @Context + private ManagementContext mgmt; + + private static class MethodFilter implements ResourceFilter, ContainerRequestFilter { + + private AbstractMethod am; + private ManagementContext mgmt; + + public MethodFilter(AbstractMethod am, ManagementContext mgmt) { + this.am = am; + this.mgmt = mgmt; + } + + @Override + public ContainerRequestFilter getRequestFilter() { + return this; + } + + @Override + public ContainerResponseFilter getResponseFilter() { + return null; + } + + @Override + public ContainerRequest filter(ContainerRequest request) { + if (!isStateLoaded() && isUnsafe(request)) { + Response response = Response.status(Response.Status.FORBIDDEN) + .type(MediaType.APPLICATION_JSON) + .entity("{\"error\":403,\"message\":\"Requests should be made to the master Brooklyn server\"}") + .build(); + throw new WebApplicationException(response); + } + return request; + } + + private boolean isStateLoaded() { + return isHaHotStatus() && !RebindTracker.isRebinding() && !recentlySwitchedState(); + } + + // Ideally there will be a separate state to indicate that we switched state + // but still haven't finished rebinding. There's a gap between changing the state + // and starting rebind so add a time offset just to be sure. + private boolean recentlySwitchedState() { + long lastStateChange = mgmt.getHighAvailabilityManager().getLastStateChange(); + return System.currentTimeMillis() - lastStateChange < STATE_CHANGE_SETTLE_OFFSET; + } + + private boolean isUnsafe(ContainerRequest request) { + boolean isOverriden = "true".equalsIgnoreCase(request.getHeaderValue(HaMasterCheckFilter.SKIP_CHECK_HEADER)); + return !isOverriden && + (am.getAnnotation(HaHotStateRequired.class) != null || + am.getResource().getAnnotation(HaHotStateRequired.class) != null); + } + + private boolean isHaHotStatus() { + ManagementNodeState state = mgmt.getHighAvailabilityManager().getNodeState(); + return HOT_STATES.contains(state); + } + + } + + @Override + public List<ResourceFilter> create(AbstractMethod am) { + return Collections.<ResourceFilter>singletonList(new MethodFilter(am, mgmt)); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/86cf35f1/usage/rest-server/src/main/java/brooklyn/rest/filter/HaStateCheckResourceFilter.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/brooklyn/rest/filter/HaStateCheckResourceFilter.java b/usage/rest-server/src/main/java/brooklyn/rest/filter/HaStateCheckResourceFilter.java deleted file mode 100644 index 86a5b9b..0000000 --- a/usage/rest-server/src/main/java/brooklyn/rest/filter/HaStateCheckResourceFilter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * 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 brooklyn.rest.filter; - -import java.util.Collections; -import java.util.List; -import java.util.Set; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import brooklyn.entity.rebind.RebindManagerImpl.RebindTracker; -import brooklyn.management.ManagementContext; -import brooklyn.management.ha.ManagementNodeState; -import brooklyn.util.time.Duration; - -import com.google.common.collect.ImmutableSet; -import com.sun.jersey.api.model.AbstractMethod; -import com.sun.jersey.spi.container.ContainerRequest; -import com.sun.jersey.spi.container.ContainerRequestFilter; -import com.sun.jersey.spi.container.ContainerResponseFilter; -import com.sun.jersey.spi.container.ResourceFilter; -import com.sun.jersey.spi.container.ResourceFilterFactory; - -public class HaStateCheckResourceFilter implements ResourceFilterFactory { - private static final Set<ManagementNodeState> HOT_STATES = ImmutableSet.of( - ManagementNodeState.MASTER, ManagementNodeState.HOT_STANDBY, ManagementNodeState.HOT_BACKUP); - private static final long STATE_CHANGE_SETTLE_OFFSET = Duration.seconds(10).toMilliseconds(); - - @Context - private ManagementContext mgmt; - - private static class MethodFilter implements ResourceFilter, ContainerRequestFilter { - - private AbstractMethod am; - private ManagementContext mgmt; - - public MethodFilter(AbstractMethod am, ManagementContext mgmt) { - this.am = am; - this.mgmt = mgmt; - } - - @Override - public ContainerRequestFilter getRequestFilter() { - return this; - } - - @Override - public ContainerResponseFilter getResponseFilter() { - return null; - } - - @Override - public ContainerRequest filter(ContainerRequest request) { - if (!isStateLoaded() && isUnsafe(request)) { - Response response = Response.status(Response.Status.FORBIDDEN) - .type(MediaType.APPLICATION_JSON) - .entity("{\"error\":403,\"message\":\"Requests should be made to the master Brooklyn server\"}") - .build(); - throw new WebApplicationException(response); - } - return request; - } - - private boolean isStateLoaded() { - return isHaHotStatus() && !RebindTracker.isRebinding() && !recentlySwitchedState(); - } - - // Ideally there will be a separate state to indicate that we switched state - // but still haven't finished rebinding. There's a gap between changing the state - // and starting rebind so add a time offset just to be sure. - private boolean recentlySwitchedState() { - long lastStateChange = mgmt.getHighAvailabilityManager().getLastStateChange(); - return System.currentTimeMillis() - lastStateChange < STATE_CHANGE_SETTLE_OFFSET; - } - - private boolean isUnsafe(ContainerRequest request) { - boolean isOverriden = "true".equalsIgnoreCase(request.getHeaderValue(HaMasterCheckFilter.SKIP_CHECK_HEADER)); - return !isOverriden && - (am.getAnnotation(HaHotStateRequired.class) != null || - am.getResource().getAnnotation(HaHotStateRequired.class) != null); - } - - private boolean isHaHotStatus() { - ManagementNodeState state = mgmt.getHighAvailabilityManager().getNodeState(); - return HOT_STATES.contains(state); - } - - } - - @Override - public List<ResourceFilter> create(AbstractMethod am) { - return Collections.<ResourceFilter>singletonList(new MethodFilter(am, mgmt)); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/86cf35f1/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java b/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java index db54b40..5baf2d2 100644 --- a/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java +++ b/usage/rest-server/src/test/java/brooklyn/rest/BrooklynRestApiLauncher.java @@ -331,7 +331,7 @@ public class BrooklynRestApiLauncher { // disable caching for dynamic content config.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, NoCacheFilter.class.getName()); // Checks if appropriate request given HA status - config.getProperties().put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, brooklyn.rest.filter.HaStateCheckResourceFilter.class.getName()); + config.getProperties().put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, brooklyn.rest.filter.HaHotCheckResourceFilter.class.getName()); // configure to match empty path, or any thing which looks like a file path with /assets/ and extension html, css, js, or png // and treat that as static content config.getProperties().put(ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX, "(/?|[^?]*/assets/[^?]+\\.[A-Za-z0-9_]+)");
