package com.psddev.cms.db; import com.psddev.dari.db.State; import com.psddev.dari.util.LazyWriterResponse; import javax.servlet.http.HttpServletRequest; import java.io.IOException; class FieldAccessListener extends State.Listener { private static final String ATTRIBUTE_PREFIX = FieldAccessListener.class.getName() + "."; private static final String PREVIOUS_MARKER_HTML_ATTRIBUTE = ATTRIBUTE_PREFIX + "previousMarkerHtml"; private final HttpServletRequest request; public FieldAccessListener(HttpServletRequest request) { this.request = request; } @Override public void beforeFieldGet(State state, String name) { Object original = state.getOriginalObject(); if (original == null || original.getClass().getName().startsWith("com.psddev.dari.")) { return; } try { com.psddev.dari.util.LazyWriter writer = FieldAccessFilter.THREAD_DEFAULT_LAZY_WRITER.get(); if (writer == null) { com.psddev.dari.util.LazyWriterResponse response = (LazyWriterResponse) request.getAttribute(FieldAccessFilter.CURRENT_RESPONSE_ATTRIBUTE); if (response != null) { writer = response.getLazyWriter(); } } if (writer != null) { String markerHtml = FieldAccessFilter.createMarkerHtml(state, name); String previousMarkerHtml = (String) request.getAttribute(PREVIOUS_MARKER_HTML_ATTRIBUTE); if (!markerHtml.equals(previousMarkerHtml)) { request.setAttribute(PREVIOUS_MARKER_HTML_ATTRIBUTE, markerHtml); writer.writeLazily(markerHtml); } } } catch (IOException error) { // Can't write the field access marker HTML to the response, // but that's OK, so move on. } } }