/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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 org.elasticsearch.rest; import static org.elasticsearch.common.unit.ByteSizeValue.parseBytesSizeValue; import static org.elasticsearch.common.unit.TimeValue.parseTimeValue; import java.net.SocketAddress; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.StringTokenizer; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.elasticsearch.common.Booleans; import org.elasticsearch.common.ContextAndHeaderHolder; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.rest.support.RestUtils; /** * */ public abstract class RestRequest extends ContextAndHeaderHolder implements ToXContent.Params { public enum Method { GET, POST, PUT, DELETE, OPTIONS, HEAD } public abstract Method method(); /** * The uri of the rest request, with the query string. */ public abstract String uri(); /** * The non decoded, raw path provided. */ public abstract String rawPath(); /** * The path part of the URI (without the query string), decoded. */ public final String path() { return RestUtils.decodeComponent(rawPath()); } public abstract boolean hasContent(); public abstract BytesReference content(); public abstract String header(String name); public abstract Iterable<Map.Entry<String, String>> headers(); @Nullable public SocketAddress getRemoteAddress() { return null; } @Nullable public SocketAddress getLocalAddress() { return null; } public abstract boolean hasParam(String key); @Override public abstract String param(String key); public abstract Map<String, String> params(); public float paramAsFloat(String key, float defaultValue) { String sValue = param(key); if (sValue == null) { return defaultValue; } try { return Float.parseFloat(sValue); } catch (NumberFormatException e) { throw new IllegalArgumentException("Failed to parse float parameter [" + key + "] with value [" + sValue + "]", e); } } public int paramAsInt(String key, int defaultValue) { String sValue = param(key); if (sValue == null) { return defaultValue; } try { return Integer.parseInt(sValue); } catch (NumberFormatException e) { throw new IllegalArgumentException("Failed to parse int parameter [" + key + "] with value [" + sValue + "]", e); } } public long paramAsLong(String key, long defaultValue) { String sValue = param(key); if (sValue == null) { return defaultValue; } try { return Long.parseLong(sValue); } catch (NumberFormatException e) { throw new IllegalArgumentException("Failed to parse long parameter [" + key + "] with value [" + sValue + "]", e); } } @Override public boolean paramAsBoolean(String key, boolean defaultValue) { return Booleans.parseBoolean(param(key), defaultValue); } @Override public Boolean paramAsBoolean(String key, Boolean defaultValue) { return Booleans.parseBoolean(param(key), defaultValue); } public TimeValue paramAsTime(String key, TimeValue defaultValue) { return parseTimeValue(param(key), defaultValue, key); } public ByteSizeValue paramAsSize(String key, ByteSizeValue defaultValue) { return parseBytesSizeValue(param(key), defaultValue, key); } public String[] paramAsStringArray(String key, String[] defaultValue) { String value = param(key); if (value == null) { return defaultValue; } return Strings.splitStringByCommaToArray(value); } public String[] paramAsStringArrayOrEmptyIfAll(String key) { String[] params = paramAsStringArray(key, Strings.EMPTY_ARRAY); if (Strings.isAllOrWildcard(params)) { return Strings.EMPTY_ARRAY; } return params; } public Collection<Range<Token>> paramsAsTokenRanges(String key) { String value = param(key); if (value != null) { Collection<Range<Token>> tokenRanges = new ArrayList<Range<Token>>(); Token.TokenFactory tokenFactory = DatabaseDescriptor.getPartitioner().getTokenFactory(); StringTokenizer stk = new StringTokenizer(value, "{[(,)]}"); while (stk.hasMoreTokens()) { Token leftToken = tokenFactory.fromString(stk.nextToken()); Token rightToken = tokenFactory.fromString(stk.nextToken()); tokenRanges.add(new Range(leftToken, rightToken)); } return tokenRanges; } return null; } }