/** * 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.brixcms.plugin.site.page.tile; import org.apache.wicket.Component; import org.apache.wicket.model.IModel; import org.brixcms.BrixNodeModel; import org.brixcms.jcr.wrapper.BrixNode; import org.brixcms.markup.tag.ComponentTag; import org.brixcms.markup.tag.simple.SimpleTag; import org.brixcms.markup.variable.VariableKeyProvider; import org.brixcms.plugin.site.page.AbstractContainer; import java.util.Collection; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; /** * Base class for tags that represent {@link Tile}s * * @author ivaynberg, Matej Knopp */ public class TileTag extends SimpleTag implements ComponentTag, VariableKeyProvider { private final static AtomicLong atomicLong = new AtomicLong(); private final static String PREFIX = "tile-"; /** * name of tile this tag is attached to */ private final String tileName; private final BrixNodeModel tileContainerNodeModel; private String id; /** * Constructor * * @param name * @param type * @param attributeMap * @param tileName */ public TileTag(String name, Type type, Map<String, String> attributeMap, AbstractContainer tileContainerNode, String tileName) { super(name, type, attributeMap); this.tileName = tileName; tileContainerNodeModel = new BrixNodeModel(tileContainerNode); tileContainerNodeModel.detach(); } /** * @return name of tile */ public String getTileName() { return tileName; } /** * {@inheritDoc} */ public Component getComponent(String id, IModel<BrixNode> pageNodeModel) { AbstractContainer container = getTileContainer(); BrixNode tileNode = container.getTileNode(tileName); if (tileNode != null) { Tile tile = Tile.Helper.getTileOfType(TileContainerFacet.getTileClassName(tileNode), tileNode.getBrix()); return tile.newViewer(id, new BrixNodeModel(tileNode)); } else { return null; } } /** * return unique id of this tag */ public String getUniqueTagId() { if (id == null) { id = PREFIX + atomicLong.incrementAndGet(); } return id; } /** * {@inheritDoc} */ public Collection<String> getVariableKeys() { BrixNode tileNode = getTileContainer().tiles().getTile(tileName); if (tileNode != null) { Tile tile = Tile.Helper.getTileOfType(TileContainerFacet.getTileClassName(tileNode), tileNode.getBrix()); if (tile instanceof VariableKeyProvider) { return ((VariableKeyProvider) tile).getVariableKeys(); } } return null; } /** * @return tile container that contains the tile */ protected AbstractContainer getTileContainer() { AbstractContainer container = (AbstractContainer) tileContainerNodeModel.getObject(); tileContainerNodeModel.detach(); return container; } }