/* * Copyright 2010 Google Inc. * * Licensed 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 elemental.json.impl; import elemental.json.JsonArray; import elemental.json.JsonObject; import elemental.json.JsonValue; import elemental.json.impl.JsonContext; /** * A visitor for JSON objects. For each unique JSON datatype, a callback is * invoked with a {@link elemental.json.impl.JsonContext} * that can be used to replace a value or remove it. For Object and Array * types, the {@link #visitKey} and {@link #visitIndex} methods are invoked * respectively for each contained value to determine if they should be * processed or not. Finally, the visit methods for Object and Array types * returns a boolean that determines whether or not to process its contained * values. */ class JsonVisitor { private class ImmutableJsonContext extends JsonContext { public ImmutableJsonContext(JsonValue node) { super(node); } @Override public void removeMe() { immutableError(); } @Override public void replaceMe(double d) { immutableError(); } @Override public void replaceMe(String d) { immutableError(); } @Override public void replaceMe(boolean d) { immutableError(); } @Override public void replaceMe(JsonValue value) { immutableError(); } private void immutableError() { throw new UnsupportedOperationException("Immutable context"); } } public void accept(JsonValue node) { accept(node, new ImmutableJsonContext(node)); } /** * Accept array or object type and visit its members. */ public void accept(JsonValue node, JsonContext ctx) { if (node == null) { return; } ((JreJsonValue) node).traverse(this, ctx); } /** * Called after every element of array has been visited. */ public void endVisit(JsonArray array, JsonContext ctx) { } /** * Called after every field of an object has been visited. * @param object * @param ctx */ public void endVisit(JsonObject object, JsonContext ctx) { } /** * Called for JS numbers present in a JSON object. */ public void visit(double number, JsonContext ctx) { } /** * Called for JS strings present in a JSON object. */ public void visit(String string, JsonContext ctx) { } /** * Called for JS boolean present in a JSON object. */ public void visit(boolean bool, elemental.json.impl.JsonContext ctx) { } /** * Called for JS arrays present in a JSON object. Return true if array * elements should be visited. * @param array a JS array * @param ctx a context to replace or delete the array * @return true if the array elements should be visited */ public boolean visit(JsonArray array, JsonContext ctx) { return true; } /** * Called for JS objects present in a JSON object. Return true if object * fields should be visited. * @param object a Json object * @param ctx a context to replace or delete the object * @return true if object fields should be visited */ public boolean visit(JsonObject object, JsonContext ctx) { return true; } /** * Return true if the value for a given array index should be visited. * @param index an index in a JSON array * @param ctx a context object used to delete or replace values * @return true if the value associated with the index should be visited */ public boolean visitIndex(int index, JsonContext ctx) { return true; } /** * Return true if the value for a given object key should be visited. * @param key a key in a JSON object * @param ctx a context object used to delete or replace values * @return true if the value associated with the key should be visited */ public boolean visitKey(String key, JsonContext ctx) { return true; } /** * Called for nulls present in a JSON object. */ public void visitNull(JsonContext ctx) { } }