001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.client;
019
020import org.apache.hadoop.hbase.TableName;
021import org.apache.hadoop.hbase.exceptions.DeserializationException;
022import org.apache.yetus.audience.InterfaceAudience;
023import org.apache.yetus.audience.InterfaceStability;
024
025import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;
026
027import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
028
029/**
030 * Represents table state.
031 */
032@InterfaceAudience.Private
033public class TableState {
034
035  @InterfaceAudience.Private
036  @InterfaceStability.Evolving
037  public static enum State {
038    ENABLED,
039    DISABLED,
040    DISABLING,
041    ENABLING;
042
043    /**
044     * Covert from PB version of State
045     * @param state convert from
046     */
047    public static State convert(HBaseProtos.TableState.State state) {
048      State ret;
049      switch (state) {
050        case ENABLED:
051          ret = State.ENABLED;
052          break;
053        case DISABLED:
054          ret = State.DISABLED;
055          break;
056        case DISABLING:
057          ret = State.DISABLING;
058          break;
059        case ENABLING:
060          ret = State.ENABLING;
061          break;
062        default:
063          throw new IllegalStateException(state.toString());
064      }
065      return ret;
066    }
067
068    /**
069     * Covert to PB version of State
070     */
071    public HBaseProtos.TableState.State convert() {
072      HBaseProtos.TableState.State state;
073      switch (this) {
074        case ENABLED:
075          state = HBaseProtos.TableState.State.ENABLED;
076          break;
077        case DISABLED:
078          state = HBaseProtos.TableState.State.DISABLED;
079          break;
080        case DISABLING:
081          state = HBaseProtos.TableState.State.DISABLING;
082          break;
083        case ENABLING:
084          state = HBaseProtos.TableState.State.ENABLING;
085          break;
086        default:
087          throw new IllegalStateException(this.toString());
088      }
089      return state;
090    }
091
092  }
093
094  private final TableName tableName;
095  private final State state;
096
097  /** Returns True if table is {@link State#ENABLED}. */
098  public boolean isEnabled() {
099    return isInStates(State.ENABLED);
100  }
101
102  /** Returns True if table is {@link State#ENABLING}. */
103  public boolean isEnabling() {
104    return isInStates(State.ENABLING);
105  }
106
107  /** Returns True if {@link State#ENABLED} or {@link State#ENABLING} */
108  public boolean isEnabledOrEnabling() {
109    return isInStates(State.ENABLED, State.ENABLING);
110  }
111
112  /** Returns True if table is disabled. */
113  public boolean isDisabled() {
114    return isInStates(State.DISABLED);
115  }
116
117  /** Returns True if table is disabling. */
118  public boolean isDisabling() {
119    return isInStates(State.DISABLING);
120  }
121
122  /** Returns True if {@link State#DISABLED} or {@link State#DISABLED} */
123  public boolean isDisabledOrDisabling() {
124    return isInStates(State.DISABLED, State.DISABLING);
125  }
126
127  /**
128   * Create instance of TableState.
129   * @param tableName name of the table
130   * @param state     table state
131   */
132  public TableState(TableName tableName, State state) {
133    this.tableName = tableName;
134    this.state = state;
135  }
136
137  /** Returns table state */
138  public State getState() {
139    return state;
140  }
141
142  /**
143   * Table name for state
144   */
145  public TableName getTableName() {
146    return tableName;
147  }
148
149  /**
150   * Check that table in given states
151   * @param state state
152   * @return true if satisfies
153   */
154  public boolean inStates(State state) {
155    return this.state.equals(state);
156  }
157
158  /**
159   * Check that table in given states
160   * @param states state list
161   * @return true if satisfies
162   */
163  public boolean inStates(State... states) {
164    for (State s : states) {
165      if (s.equals(this.state)) return true;
166    }
167    return false;
168  }
169
170  /**
171   * Covert to PB version of TableState
172   */
173  public HBaseProtos.TableState convert() {
174    return HBaseProtos.TableState.newBuilder().setState(this.state.convert()).build();
175  }
176
177  /**
178   * Covert from PB version of TableState
179   * @param tableName  table this state of
180   * @param tableState convert from
181   */
182  public static TableState convert(TableName tableName, HBaseProtos.TableState tableState) {
183    TableState.State state = State.convert(tableState.getState());
184    return new TableState(tableName, state);
185  }
186
187  public static TableState parseFrom(TableName tableName, byte[] bytes)
188    throws DeserializationException {
189    try {
190      return convert(tableName, HBaseProtos.TableState.parseFrom(bytes));
191    } catch (InvalidProtocolBufferException e) {
192      throw new DeserializationException(e);
193    }
194  }
195
196  /**
197   * Static version of state checker
198   * @param target equals to any of
199   * @return true if satisfies
200   */
201  public boolean isInStates(State... target) {
202    for (State tableState : target) {
203      if (this.state.equals(tableState)) {
204        return true;
205      }
206    }
207    return false;
208  }
209
210  @Override
211  public boolean equals(Object o) {
212    if (this == o) {
213      return true;
214    }
215    if (!(o instanceof TableState)) {
216      return false;
217    }
218    TableState that = (TableState) o;
219    if (state != that.state) {
220      return false;
221    }
222    if (tableName != null ? !tableName.equals(that.tableName) : that.tableName != null) {
223      return false;
224    }
225    return true;
226  }
227
228  @Override
229  public int hashCode() {
230    int result = (tableName != null ? tableName.hashCode() : 0);
231    result = 31 * result + (state != null ? state.hashCode() : 0);
232    return result;
233  }
234
235  @Override
236  public String toString() {
237    return "tableName=" + tableName + ", state=" + state;
238  }
239}