Skip to content

Package: MemcachedResponse

MemcachedResponse

nameinstructionbranchcomplexitylinemethod
clear()
M: 37 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 13 C: 0
0%
M: 1 C: 0
0%
complete()
M: 18 C: 0
0%
M: 6 C: 0
0%
M: 4 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
create()
M: 12 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
getCas()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getDataType()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getDecodedKey()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getDecodedValue()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getExtraLength()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getFlags()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getKeyLength()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getOp()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getOpaque()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getResult()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getStatus()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getTotalBodyLength()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
isError()
M: 32 C: 0
0%
M: 12 C: 0
0%
M: 7 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
recycle()
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
setCas(long)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setDataType(byte)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setDecodedKey(Buffer, int, int, MemoryManager)
M: 32 C: 0
0%
M: 8 C: 0
0%
M: 5 C: 0
0%
M: 10 C: 0
0%
M: 1 C: 0
0%
setDecodedKey(Object)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setDecodedValue(Buffer, int, int, MemoryManager)
M: 62 C: 0
0%
M: 14 C: 0
0%
M: 9 C: 0
0%
M: 18 C: 0
0%
M: 1 C: 0
0%
setDecodedValue(Object)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setExtraLength(byte)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setFlags(int)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setKeyLength(short)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setOp(CommandOpcodes)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setOpaque(int)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setResult(Object, MemcachedClientFilter.ParsingStatus)
M: 193 C: 0
0%
M: 46 C: 0
0%
M: 27 C: 0
0%
M: 38 C: 0
0%
M: 1 C: 0
0%
setStatus(ResponseStatus)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
setTotalBodyLength(int)
M: 4 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 2 C: 0
0%
M: 1 C: 0
0%
static {...}
M: 11 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
toString()
M: 67 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*
2: * Copyright (c) 2012, 2017 Oracle and/or its affiliates. All rights reserved.
3: *
4: * This program and the accompanying materials are made available under the
5: * terms of the Eclipse Public License v. 2.0, which is available at
6: * http://www.eclipse.org/legal/epl-2.0.
7: *
8: * This Source Code may also be made available under the following Secondary
9: * Licenses when the conditions for such availability set forth in the
10: * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
11: * version 2 with the GNU Classpath Exception, which is available at
12: * https://www.gnu.org/software/classpath/license.html.
13: *
14: * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15: */
16:
17: package org.glassfish.grizzly.memcached;
18:
19: import org.glassfish.grizzly.Buffer;
20: import org.glassfish.grizzly.Cacheable;
21: import org.glassfish.grizzly.Grizzly;
22: import org.glassfish.grizzly.ThreadCache;
23: import org.glassfish.grizzly.memory.MemoryManager;
24:
25: import java.util.logging.Level;
26: import java.util.logging.Logger;
27:
28: /**
29: * Memcached response
30: * <p>
31: * Key and value will be decoded by {@link #setDecodedKey} and {@link #setDecodedValue}.
32: * {@link #setResult} sets the last result based on other fields of this response in according to memcached's command.
33: *
34: * @author Bongjae Chang
35: */
36: public class MemcachedResponse implements Cacheable {
37:
38: private static final Logger logger = Grizzly.logger(MemcachedResponse.class);
39:
40: private static final Long INVALID_LONG = (long) -1;
41: private static final ThreadCache.CachedTypeIndex<MemcachedResponse> CACHE_IDX =
42: ThreadCache.obtainIndex(MemcachedResponse.class, 16);
43:
44: // header
45: private CommandOpcodes op;
46: private short keyLength;
47: private byte extraLength;
48: private byte dataType;
49: private ResponseStatus status;
50: private int totalBodyLength;
51: private int opaque;
52: private long cas;
53:
54: // extras and body
55: private int flags;
56:
57: private Object decodedKey;
58: private Object decodedValue;
59: private Object result;
60:
61: private MemcachedResponse() {
62: }
63:
64: public static MemcachedResponse create() {
65: final MemcachedResponse response = ThreadCache.takeFromCache(CACHE_IDX);
66:• if (response != null) {
67: return response;
68: }
69: return new MemcachedResponse();
70: }
71:
72: public CommandOpcodes getOp() {
73: return op;
74: }
75:
76: public short getKeyLength() {
77: return keyLength;
78: }
79:
80: public byte getExtraLength() {
81: return extraLength;
82: }
83:
84: public byte getDataType() {
85: return dataType;
86: }
87:
88: public ResponseStatus getStatus() {
89: return status;
90: }
91:
92: public int getTotalBodyLength() {
93: return totalBodyLength;
94: }
95:
96: public int getOpaque() {
97: return opaque;
98: }
99:
100: public long getCas() {
101: return cas;
102: }
103:
104: public int getFlags() {
105: return flags;
106: }
107:
108: public Object getDecodedKey() {
109: return decodedKey;
110: }
111:
112: public Object getDecodedValue() {
113: return decodedValue;
114: }
115:
116: public Object getResult() {
117: return result;
118: }
119:
120: public void setOp(final CommandOpcodes op) {
121: this.op = op;
122: }
123:
124: public void setKeyLength(final short keyLength) {
125: this.keyLength = keyLength;
126: }
127:
128: public void setExtraLength(final byte extraLength) {
129: this.extraLength = extraLength;
130: }
131:
132: public void setDataType(final byte dataType) {
133: this.dataType = dataType;
134: }
135:
136: public void setStatus(final ResponseStatus status) {
137: this.status = status;
138: }
139:
140: public void setTotalBodyLength(final int totalBodyLength) {
141: this.totalBodyLength = totalBodyLength;
142: }
143:
144: public void setOpaque(final int opaque) {
145: this.opaque = opaque;
146: }
147:
148: public void setCas(final long cas) {
149: this.cas = cas;
150: }
151:
152: public void setFlags(final int flags) {
153: this.flags = flags;
154: }
155:
156: public void setDecodedKey(final Buffer buffer, final int position, final int limit, final MemoryManager memoryManager) {
157:• if (buffer == null || position > limit) {
158: return;
159: }
160: final Object result;
161:• switch (op) {
162: case Stat:
163:• if (!isError()) {
164: result = BufferWrapper.unwrap(buffer, position, limit, BufferWrapper.BufferType.STRING, memoryManager);
165: } else {
166: result = null;
167: }
168: break;
169: default:
170: result = null;
171: break;
172: }
173: decodedKey = result;
174: }
175:
176: public void setDecodedKey(final Object decodedKey) {
177: this.decodedKey = decodedKey;
178: }
179:
180: public void setDecodedValue(final Buffer buffer, final int position, final int limit, final MemoryManager memoryManager) {
181:• if (buffer == null || position > limit) {
182: return;
183: }
184: final Object result;
185:• switch (op) {
186: // user value type
187: case Get:
188: case GetQ:
189: case GAT:
190: case GATQ:
191: case GetK:
192: case GetKQ:
193: case Gets:
194: case GetsQ:
195:• if (!isError()) {
196: result = BufferWrapper.unwrap(buffer, position, limit, BufferWrapper.BufferType.getBufferType(this.flags), memoryManager);
197: } else {
198: result = null;
199: }
200: break;
201: case Increment:
202: case Decrement:
203:• if (!isError()) {
204: result = BufferWrapper.unwrap(buffer, position, limit, BufferWrapper.BufferType.LONG, memoryManager);
205: } else {
206: result = INVALID_LONG;
207: }
208: break;
209:
210: case Version:
211: case Stat:
212:• if (!isError()) {
213: result = BufferWrapper.unwrap(buffer, position, limit, BufferWrapper.BufferType.STRING, memoryManager);
214: } else {
215: result = null;
216: }
217: break;
218: default:
219: result = null;
220: break;
221: }
222: decodedValue = result;
223: }
224:
225: public void setDecodedValue(final Object decodedValue) {
226: this.decodedValue = decodedValue;
227: }
228:
229: @SuppressWarnings("unchecked")
230: public <K> void setResult(final K originKey, final MemcachedClientFilter.ParsingStatus parsingStatus) {
231:• if (isError() && parsingStatus == MemcachedClientFilter.ParsingStatus.DONE) {
232:• if (status == ResponseStatus.Key_Not_Found) {
233:• if (logger.isLoggable(Level.FINER)) {
234: logger.log(Level.FINER, "error status code={0}, status msg={1}, op={2}, key={3}", new Object[]{status, status.message(), op, originKey});
235: }
236: } else {
237:• if (logger.isLoggable(Level.WARNING)) {
238: logger.log(Level.WARNING, "error status code={0}, status msg={1}, op={2}, key={3}", new Object[]{status, status.message(), op, originKey});
239: }
240: }
241: }
242:
243: final Object result;
244:• switch (op) {
245: // user value type
246: case Get:
247: case GetQ:
248: case GAT:
249: case GATQ:
250:• if (!isError()) {
251: result = decodedValue;
252: } else {
253: result = null;
254: }
255: break;
256:
257: // ValueWithKey type
258: case GetK:
259: case GetKQ:
260:• if (!isError() && decodedValue != null) {
261: result = new ValueWithKey(originKey, decodedValue);
262: } else {
263: result = null;
264: }
265: break;
266:
267: // ValueWithCas type
268: case Gets:
269: case GetsQ:
270:• if (!isError() && decodedValue != null) {
271: result = new ValueWithCas(decodedValue, this.cas);
272: } else {
273: result = null;
274: }
275: break;
276:
277: // boolean and void type. there are no responses except for error
278: case Set:
279: case Add:
280: case Replace:
281: case Delete:
282: case Quit:
283: case Flush:
284: case Append:
285: case Prepend:
286: case Verbosity:
287: case Touch:
288: case Noop:
289: case SetQ:
290: case AddQ:
291: case ReplaceQ:
292: case DeleteQ:
293: case IncrementQ:
294: case DecrementQ:
295: case QuitQ:
296: case FlushQ:
297: case AppendQ:
298: case PrependQ:
299:• if (!isError() || parsingStatus == MemcachedClientFilter.ParsingStatus.NO_REPLY) {
300: result = Boolean.TRUE;
301: } else {
302: result = Boolean.FALSE;
303: }
304: break;
305:
306: // long type
307: case Increment:
308: case Decrement:
309:• if (!isError() && decodedValue instanceof Long) {
310: result = decodedValue;
311: } else {
312: result = INVALID_LONG;
313: }
314: break;
315:
316: // string type
317: case Version:
318:• if (!isError() && decodedValue instanceof String) {
319: result = decodedValue;
320: } else {
321: result = null;
322: }
323: break;
324:
325: case Stat:
326:• if (!isError() && decodedKey instanceof String && decodedValue instanceof String) {
327: result = new ValueWithKey<String, String>((String) decodedKey, (String) decodedValue);
328: } else {
329: result = null;
330: }
331: break;
332:
333: // currently not supported
334: case SASL_List:
335: case SASL_Auth:
336: case SASL_Step:
337: case RGet:
338: case RSet:
339: case RSetQ:
340: case RAppend:
341: case RAppendQ:
342: case RPrepend:
343: case RPrependQ:
344: case RDelete:
345: case RDeleteQ:
346: case RIncr:
347: case RIncrQ:
348: case RDecr:
349: case RDecrQ:
350: case Set_VBucket:
351: case Get_VBucket:
352: case Del_VBucket:
353: case TAP_Connect:
354: case TAP_Mutation:
355: case TAP_Delete:
356: case TAP_Flush:
357: case TAP_Opaque:
358: case TAP_VBucket_Set:
359: case TAP_Checkpoint_Start:
360: case TAP_Checkpoint_End:
361: default:
362: result = null;
363: break;
364: }
365: this.result = result;
366: }
367:
368: public boolean isError() {
369:• switch (op) {
370: case Delete:
371: case DeleteQ:
372:• return status != null && status != ResponseStatus.No_Error && status != ResponseStatus.Key_Not_Found;
373: default:
374:• return status != null && status != ResponseStatus.No_Error;
375: }
376: }
377:
378: public boolean complete() {
379:• switch (op) {
380: // one request - many response
381: case Stat:
382:• return decodedKey == null || decodedValue == null;
383: //return key == null || value == null;
384: default:
385: return true;
386: }
387: }
388:
389: public void clear() {
390: op = null;
391: keyLength = 0;
392: extraLength = 0;
393: dataType = 0;
394: status = null;
395: totalBodyLength = 0;
396: opaque = 0;
397: cas = 0;
398: flags = 0;
399: decodedKey = null;
400: decodedValue = null;
401: result = null;
402: }
403:
404: @Override
405: public void recycle() {
406: clear();
407: ThreadCache.putToCache(CACHE_IDX, this);
408: }
409:
410: @Override
411: public String toString() {
412: return "MemcachedResponse{" +
413: "op=" + op +
414: ", keyLength=" + keyLength +
415: ", extraLength=" + extraLength +
416: ", dataType=" + dataType +
417: ", status=" + status +
418: ", totalBodyLength=" + totalBodyLength +
419: ", opaque=" + opaque +
420: ", cas=" + cas +
421: ", flags=" + flags +
422: ", decodedKey=" + decodedKey +
423: ", decodedValue=" + decodedValue +
424: ", result=" + result +
425: '}';
426: }
427: }