/** * Copyright 2007-2015, Kaazing Corporation. All rights reserved. * * Licensed 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 org.kaazing.k3po.driver.internal.netty.bootstrap.bbosh; import static java.lang.Character.toLowerCase; import static java.lang.Integer.parseInt; import static java.lang.String.format; import static java.util.concurrent.TimeUnit.SECONDS; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; public abstract class BBoshStrategy { public enum Kind { POLLING, LONG_POLLING, STREAMING } public abstract Kind getKind(); public abstract int getRequests(); public abstract long getInterval(TimeUnit unit); public static BBoshStrategy valueOf(String strategy) { if (strategy != null && !strategy.isEmpty()) { switch (strategy.charAt(0)) { case 'p': Matcher pollingMatcher = Polling.PATTERN.matcher(strategy); if (pollingMatcher.matches()) { int interval = parseInt(pollingMatcher.group(1)); TimeUnit intervalUnit = SECONDS; return new Polling(interval, intervalUnit); } break; case 'l': Matcher longPollingMatcher = LongPolling.PATTERN.matcher(strategy); if (longPollingMatcher.matches()) { int interval = parseInt(longPollingMatcher.group(1)); TimeUnit intervalUnit = SECONDS; String requests = longPollingMatcher.group(2); if (requests != null) { return new LongPolling(interval, intervalUnit, parseInt(requests)); } else { return new LongPolling(interval, intervalUnit); } } break; case 's': Matcher streamingMatcher = Streaming.PATTERN.matcher(strategy); if (streamingMatcher.matches()) { return new Streaming(); } break; default: break; } } return null; } public static final class Polling extends BBoshStrategy { private static final Pattern PATTERN = Pattern.compile("polling;interval=([0-9]+)s"); private final int interval; private final TimeUnit intervalUnit; Polling(int interval, TimeUnit intervalUnit) { this.interval = interval; this.intervalUnit = intervalUnit; } @Override public Kind getKind() { return Kind.POLLING; } @Override public long getInterval(TimeUnit unit) { return unit.convert(interval, intervalUnit); } @Override public int getRequests() { return 1; } public String toString() { return format("polling;interval=%d%s", interval, toLowerCase(intervalUnit.name().charAt(0))); } } public static final class LongPolling extends BBoshStrategy { private static final Pattern PATTERN = Pattern.compile("long-polling;interval=([0-9]+)s(?:;requests=([0-9]+))"); private final int interval; private final TimeUnit intervalUnit; private final int requests; LongPolling(int interval, TimeUnit intervalUnit) { this(interval, intervalUnit, 2); } LongPolling(int interval, TimeUnit intervalUnit, int requests) { this.interval = interval; this.intervalUnit = intervalUnit; this.requests = requests; } @Override public Kind getKind() { return Kind.LONG_POLLING; } @Override public long getInterval(TimeUnit unit) { return unit.convert(interval, intervalUnit); } @Override public int getRequests() { return requests; } public String toString() { return format("long-polling;interval=%d%s;requests=%d", interval, toLowerCase(intervalUnit.name().charAt(0)), requests); } } public static final class Streaming extends BBoshStrategy { private static final Pattern PATTERN = Pattern.compile("streaming;request=chunked"); Streaming() { } @Override public Kind getKind() { return Kind.STREAMING; } @Override public long getInterval(TimeUnit unit) { return 0; } @Override public int getRequests() { return 1; } public String toString() { return "streaming;request=chunked"; } } }