/* * 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 org.esigate.extension.parallelesi; import java.io.IOException; import org.esigate.parser.future.CharSequenceFuture; import org.esigate.parser.future.FutureElementType; import org.esigate.parser.future.FutureParserContext; class FragmentElement extends BaseElement { public static final FutureElementType TYPE = new BaseElementType("<esi:fragment", "</esi:fragment") { @Override public FragmentElement newInstance() { return new FragmentElement(); } }; private EsiRenderer esiRenderer; private CharSequence replacement = null; private boolean initialStateWrite = false; FragmentElement() { } @Override public void onTagEnd(String tag, FutureParserContext ctx) throws IOException { if (replacement != null) { esiRenderer.setWrite(true); characters(new CharSequenceFuture(replacement)); } esiRenderer.setWrite(initialStateWrite); } @Override protected boolean parseTag(Tag tag, FutureParserContext ctx) { String name = tag.getAttribute("name"); esiRenderer = ctx.findAncestor(EsiRenderer.class); initialStateWrite = esiRenderer.isWrite(); // If name matches, start writing if (esiRenderer != null) { boolean nameMatches = name.equals(esiRenderer.getName()); if (nameMatches) { esiRenderer.setWrite(true); esiRenderer.setFound(true); } else if (esiRenderer.getFragmentsToReplace() != null && initialStateWrite) { replacement = esiRenderer.getFragmentsToReplace().get(name); if (replacement != null) { esiRenderer.setWrite(false); } } } return true; } }