View Javadoc
1   /*
2    * Copyright 2016 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License, version 2.0 (the
5    * "License"); you may not use this file except in compliance with the License. You may obtain a
6    * copy of the License at:
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software distributed under the License
11   * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing permissions and limitations under
13   * the License.
14   */
15  
16  package io.netty.handler.codec.redis;
17  
18  import io.netty.util.AbstractReferenceCounted;
19  import io.netty.util.ReferenceCountUtil;
20  import io.netty.util.internal.ObjectUtil;
21  import io.netty.util.internal.StringUtil;
22  import io.netty.util.internal.UnstableApi;
23  
24  import java.util.Collections;
25  import java.util.List;
26  
27  /**
28   * Arrays of <a href="http://redis.io/topics/protocol">RESP</a>.
29   */
30  @UnstableApi
31  public class ArrayRedisMessage extends AbstractReferenceCounted implements RedisMessage {
32  
33      private final List<RedisMessage> children;
34  
35      private ArrayRedisMessage() {
36          children = Collections.emptyList();
37      }
38  
39      /**
40       * Creates a {@link ArrayRedisMessage} for the given {@code content}.
41       *
42       * @param children the children.
43       */
44      public ArrayRedisMessage(List<RedisMessage> children) {
45          // do not retain here. children are already retained when created.
46          this.children = ObjectUtil.checkNotNull(children, "children");
47      }
48  
49      /**
50       * Get children of this Arrays. It can be null or empty.
51       *
52       * @return list of {@link RedisMessage}s.
53       */
54      public final List<RedisMessage> children() {
55          return children;
56      }
57  
58      /**
59       * Returns whether the content of this message is {@code null}.
60       *
61       * @return indicates whether the content of this message is {@code null}.
62       */
63      public boolean isNull() {
64          return false;
65      }
66  
67      @Override
68      protected void deallocate() {
69          for (RedisMessage msg : children) {
70              ReferenceCountUtil.release(msg);
71          }
72      }
73  
74      @Override
75      public ArrayRedisMessage touch(Object hint) {
76          for (RedisMessage msg : children) {
77              ReferenceCountUtil.touch(msg);
78          }
79          return this;
80      }
81  
82      @Override
83      public String toString() {
84          return new StringBuilder(StringUtil.simpleClassName(this))
85                  .append('[')
86                  .append("children=")
87                  .append(children.size())
88                  .append(']').toString();
89      }
90  
91      /**
92       * A predefined null array instance for {@link ArrayRedisMessage}.
93       */
94      public static final ArrayRedisMessage NULL_INSTANCE = new ArrayRedisMessage() {
95          @Override
96          public boolean isNull() {
97              return true;
98          }
99  
100         @Override
101         public ArrayRedisMessage retain() {
102             return this;
103         }
104 
105         @Override
106         public ArrayRedisMessage retain(int increment) {
107             return this;
108         }
109 
110         @Override
111         public ArrayRedisMessage touch() {
112             return this;
113         }
114 
115         @Override
116         public ArrayRedisMessage touch(Object hint) {
117             return this;
118         }
119 
120         @Override
121         public boolean release() {
122             return false;
123         }
124 
125         @Override
126         public boolean release(int decrement) {
127             return false;
128         }
129 
130         @Override
131         public String toString() {
132             return "NullArrayRedisMessage";
133         }
134     };
135 
136     /**
137      * A predefined empty array instance for {@link ArrayRedisMessage}.
138      */
139     public static final ArrayRedisMessage EMPTY_INSTANCE = new ArrayRedisMessage() {
140         @Override
141         public boolean isNull() {
142             return false;
143         }
144 
145         @Override
146         public ArrayRedisMessage retain() {
147             return this;
148         }
149 
150         @Override
151         public ArrayRedisMessage retain(int increment) {
152             return this;
153         }
154 
155         @Override
156         public ArrayRedisMessage touch() {
157             return this;
158         }
159 
160         @Override
161         public ArrayRedisMessage touch(Object hint) {
162             return this;
163         }
164 
165         @Override
166         public boolean release() {
167             return false;
168         }
169 
170         @Override
171         public boolean release(int decrement) {
172             return false;
173         }
174 
175         @Override
176         public String toString() {
177             return "EmptyArrayRedisMessage";
178         }
179     };
180 
181 }