/* * DescriptionActor.java * Copyright 2016 Connor Petty <cpmeister@users.sourceforge.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Created on Jun 8, 2016, 11:01:00 PM */ package pcgen.output.actor; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; import java.util.Collections; import java.util.List; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.CharID; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.facet.FacetLibrary; import pcgen.cdom.facet.ObjectWrapperFacet; import pcgen.cdom.facet.PlayerCharacterTrackingFacet; import pcgen.cdom.helper.SpringHelper; import pcgen.core.Description; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.output.base.OutputActor; /** * A DescriptionActor is designed to process an interpolation and convert the * a list of descriptions from a PObject into a TemplateModel. * * Note that the actual name of the interpolation is stored externally to this * Actor (in CDOMObjectWrapperInfo to be precise) * @author Connor Petty <cpmeister@users.sourceforge.net> */ public class DescriptionActor implements OutputActor<PObject> { private final ListKey<Description> listKey; /** * Constructs a new DescriptionActor with the given ListKey as the ListKey used to * fetch the Description from the CDOMObject. * * @param listKey * the ListKey used to fetch the Description from the CDOMObject */ public DescriptionActor(ListKey<Description> listKey) { this.listKey = listKey; } @Override public TemplateModel process(CharID id, PObject d) throws TemplateModelException { List<Description> theBenefits = d.getListFor(listKey); if (theBenefits == null) { return FacetLibrary.getFacet(ObjectWrapperFacet.class).wrap(id, Constants.EMPTY_STRING); } PlayerCharacterTrackingFacet charStore = SpringHelper.getBean(PlayerCharacterTrackingFacet.class); PlayerCharacter aPC = charStore.getPC(id); final StringBuilder buf = new StringBuilder(250); boolean needSpace = false; for (final Description desc : theBenefits) { final String str = desc.getDescription(aPC, Collections.singletonList(d)); if (!str.isEmpty()) { if (needSpace) { buf.append(' '); } buf.append(str); needSpace = true; } } return FacetLibrary.getFacet(ObjectWrapperFacet.class).wrap(id, buf.toString()); } }