1 /*
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19 package org.apache.hadoop.hbase.client;
20
21 import org.apache.hadoop.classification.InterfaceAudience;
22 import org.apache.hadoop.classification.InterfaceStability;
23 import org.codehaus.jackson.map.ObjectMapper;
24
25 import java.io.IOException;
26 import java.util.Map;
27
28 /**
29 * Superclass for any type that maps to a potentially application-level query.
30 * (e.g. Put, Get, Delete, Scan, Next, etc.)
31 * Contains methods for exposure to logging and debugging tools.
32 */
33 @InterfaceAudience.Public
34 @InterfaceStability.Evolving
35 public abstract class Operation {
36 // TODO make this configurable
37 // TODO Do we need this anymore now we have protobuffed it all?
38 private static final int DEFAULT_MAX_COLS = 5;
39
40 private static final ObjectMapper MAPPER = new ObjectMapper();
41
42 /**
43 * Produces a Map containing a fingerprint which identifies the type and
44 * the static schema components of a query (i.e. column families)
45 * @return a map containing fingerprint information (i.e. column families)
46 */
47 public abstract Map<String, Object> getFingerprint();
48
49 /**
50 * Produces a Map containing a summary of the details of a query
51 * beyond the scope of the fingerprint (i.e. columns, rows...)
52 * @param maxCols a limit on the number of columns output prior to truncation
53 * @return a map containing parameters of a query (i.e. rows, columns...)
54 */
55 public abstract Map<String, Object> toMap(int maxCols);
56
57 /**
58 * Produces a Map containing a full summary of a query.
59 * @return a map containing parameters of a query (i.e. rows, columns...)
60 */
61 public Map<String, Object> toMap() {
62 return toMap(DEFAULT_MAX_COLS);
63 }
64
65 /**
66 * Produces a JSON object for fingerprint and details exposure in a
67 * parseable format.
68 * @param maxCols a limit on the number of columns to include in the JSON
69 * @return a JSONObject containing this Operation's information, as a string
70 */
71 public String toJSON(int maxCols) throws IOException {
72 return MAPPER.writeValueAsString(toMap(maxCols));
73 }
74
75 /**
76 * Produces a JSON object sufficient for description of a query
77 * in a debugging or logging context.
78 * @return the produced JSON object, as a string
79 */
80 public String toJSON() throws IOException {
81 return toJSON(DEFAULT_MAX_COLS);
82 }
83
84 /**
85 * Produces a string representation of this Operation. It defaults to a JSON
86 * representation, but falls back to a string representation of the
87 * fingerprint and details in the case of a JSON encoding failure.
88 * @param maxCols a limit on the number of columns output in the summary
89 * prior to truncation
90 * @return a JSON-parseable String
91 */
92 public String toString(int maxCols) {
93 /* for now this is merely a wrapper from producing a JSON string, but
94 * toJSON is kept separate in case this is changed to be a less parsable
95 * pretty printed representation.
96 */
97 try {
98 return toJSON(maxCols);
99 } catch (IOException ioe) {
100 return toMap(maxCols).toString();
101 }
102 }
103
104 /**
105 * Produces a string representation of this Operation. It defaults to a JSON
106 * representation, but falls back to a string representation of the
107 * fingerprint and details in the case of a JSON encoding failure.
108 * @return String
109 */
110 @Override
111 public String toString() {
112 return toString(DEFAULT_MAX_COLS);
113 }
114 }