package org.nocket.gen.domain.visitor.html; import gengui.domain.AbstractDomainReference; import gengui.util.DomainProperties.JfdRetentionStrategy; import org.nocket.gen.domain.DMDWebGenContext; import org.nocket.gen.domain.element.AbstractDomainElement; import org.nocket.gen.domain.element.ButtonElement; import org.nocket.gen.domain.element.CheckboxPropertyElement; import org.nocket.gen.domain.element.ChoicerPropertyElement; import org.nocket.gen.domain.element.HeadlineElement; import org.nocket.gen.domain.element.HiddenPropertyElement; import org.nocket.gen.domain.element.MultivaluePropertyElement; import org.nocket.gen.domain.element.ResourceElement; import org.nocket.gen.domain.element.SimplePropertyElement; import org.nocket.gen.domain.visitor.DomainElementVisitorI; import org.nocket.gen.domain.visitor.DummyVisitor; import org.nocket.gen.domain.visitor.html.create.CreateHtmlVisitor; import org.nocket.gen.domain.visitor.html.merge.MergeHtmlVisitor; import org.nocket.gen.domain.visitor.html.styling.StylingFactory; import org.nocket.gen.domain.visitor.html.styling.common.StylingStrategyI; /** * This visitor is delegates HTML generation to another visitor depending on retention strategy * and layouting strategy. * * @param <E> */ public class DelegateHtmlVisitor<E extends AbstractDomainReference> extends AbstractHtmlVisitor<E> { private DomainElementVisitorI<E> delegate; public DelegateHtmlVisitor(DMDWebGenContext<E> context) { super(context); } @Override public void visitSimpleProperty(SimplePropertyElement<E> e) { doDelegation(e); } @Override public void visitChoicerProperty(ChoicerPropertyElement<E> e) { doDelegation(e); } @Override public void visitCheckboxProperty(CheckboxPropertyElement<E> e) { doDelegation(e); } @Override public void visitButton(ButtonElement<E> e) { doDelegation(e); } @Override public void visitResource(ResourceElement<E> e) { doDelegation(e); } @Override public void visitFieldsetOpen(HeadlineElement<E> e) { doDelegation(e); } @Override public void visitMultivalueProperty(MultivaluePropertyElement<E> e) { doDelegation(e); } @Override public void visitFieldsetClose() { delegate.visitFieldsetClose(); } @Override public void visitHiddenProperty(HiddenPropertyElement<E> e) { doDelegation(e); } protected void doDelegation(AbstractDomainElement<E> e) { if (delegate == null) { lazyInitDelegate(getContext()); } e.accept(delegate); } @Override public void finish() { if (delegate == null) { lazyInitDelegate(getContext()); } delegate.finish(); } protected void lazyInitDelegate(DMDWebGenContext<E> context) { boolean fileExists = getHtmlFile().exists(); JfdRetentionStrategy jfdRetentionStrategy = getContext().getDomainProperties().getJFDRetentionStrategy(); switch (jfdRetentionStrategy) { case merge: case silentmerge: if (fileExists) { this.delegate = new MergeHtmlVisitor<E>(context, getStylingStrategy(context)); } else { this.delegate = new CreateHtmlVisitor<E>(context, getStylingStrategy(context)); } break; case keep: if (fileExists) { this.delegate = new DummyVisitor<E>(context); } else { this.delegate = new CreateHtmlVisitor<E>(context, getStylingStrategy(context)); } break; case overwrite: this.delegate = new CreateHtmlVisitor<E>(context, getStylingStrategy(context)); break; case none: default: throw new UnsupportedOperationException("Unsupported " + JfdRetentionStrategy.class.getSimpleName() + ": " + jfdRetentionStrategy); } } private StylingStrategyI getStylingStrategy(DMDWebGenContext<E> context) { return StylingFactory.newStylingStrategyInstance(context); } }