/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.tinkerpop.gremlin.structure.io.graphson; import org.apache.tinkerpop.shaded.jackson.core.JsonParseException; import org.apache.tinkerpop.shaded.jackson.core.JsonParser; import org.apache.tinkerpop.shaded.jackson.core.JsonToken; import org.apache.tinkerpop.shaded.jackson.core.util.JsonParserSequence; import java.io.IOException; import java.util.ArrayList; /** * Utility class to easily concatenate multiple JsonParsers. This class had to be implemented because the class it is * extending, {@link JsonParserSequence}, inevitably skips a token when switching from one empty parser to a new one. * I.e. it is automatically calling {@link JsonParser#nextToken()} when switching to the new parser, ignoring * the current token. * * This class is used for high performance in GraphSON when trying to detect types. * * @author Kevin Gallardo (https://kgdo.me) */ public class JsonParserConcat extends JsonParserSequence { protected JsonParserConcat(final JsonParser[] parsers) { super(parsers); } public static JsonParserConcat createFlattened(final JsonParser first, final JsonParser second) { if (!(first instanceof JsonParserConcat) && !(second instanceof JsonParserConcat)) { return new JsonParserConcat(new JsonParser[]{first, second}); } else { final ArrayList p = new ArrayList(); if (first instanceof JsonParserConcat) { ((JsonParserConcat) first).addFlattenedActiveParsers(p); } else { p.add(first); } if (second instanceof JsonParserConcat) { ((JsonParserConcat) second).addFlattenedActiveParsers(p); } else { p.add(second); } return new JsonParserConcat((JsonParser[]) p.toArray(new JsonParser[p.size()])); } } @Override public JsonToken nextToken() throws IOException, JsonParseException { JsonToken t = this.delegate.nextToken(); if (t != null) { return t; } else { do { if (!this.switchToNext()) { return null; } // call getCurrentToken() instead of nextToken() in JsonParserSequence. t = this.delegate.getCurrentToken() == null ? this.nextToken() : this.getCurrentToken(); } while (t == null); return t; } } }