| /******************************************************************************* |
| * Copyright (c) 2001, 2007 Oracle Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Oracle Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.pagedesigner.itemcreation.command; |
| |
| import org.eclipse.jst.jsf.common.dom.TagIdentifier; |
| import org.eclipse.jst.pagedesigner.dom.EditModelQuery; |
| import org.eclipse.jst.pagedesigner.dom.IDOMPosition; |
| import org.eclipse.jst.pagedesigner.utils.BodyHelper; |
| import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule; |
| import org.w3c.dom.Document; |
| |
| /** |
| * Used to create a container that should only occur once per document. Typically |
| * used for HTML body and JSF f:view tags. |
| * |
| * <p><b>Provisional API - subject to change</b></p> |
| * |
| * Clients may reference but not sub-class. |
| * @author cbateman |
| * |
| */ |
| public final class SingletonContainerCreationCommand extends ContainerCreationCommand |
| { |
| private static final int MAX_DEPTH_TO_SEARCH_FOR_CONTAINER = 10; |
| |
| /** |
| * @param domPosition |
| * @param containerTag |
| * @param tagBeingCreated |
| */ |
| public SingletonContainerCreationCommand(IDOMPosition domPosition, |
| TagIdentifier containerTag, TagIdentifier tagBeingCreated) |
| { |
| super(domPosition, containerTag, tagBeingCreated); |
| } |
| |
| @Override |
| protected IDOMPosition doExecute() |
| { |
| return insertSingletonIfNotPresent(); |
| } |
| |
| private IDOMPosition insertSingletonIfNotPresent() |
| { |
| IDOMPosition domPosition = getDomPosition(); |
| final TagIdentifier containerTag = getContainerTag(); |
| final TagIdentifier tagBeingCreated = getTagBeingCreated(); |
| |
| final Document document = EditModelQuery.getDocumentNode(domPosition |
| .getContainerNode()); |
| |
| final boolean isContainerAlreadyPresent = |
| JSFRootContainerPositionRule.hasBasicContainers |
| (document, MAX_DEPTH_TO_SEARCH_FOR_CONTAINER); |
| |
| if (isContainerAlreadyPresent) |
| { |
| // if the container and element to be created are the same, |
| // then return null indicating to abort |
| if (containerTag.equals(tagBeingCreated)) |
| { |
| domPosition = null; |
| } |
| // otherwise, simply fall through keeping domPosition unchanged |
| } |
| // if the container isn't already present |
| else |
| { |
| |
| if (!containerTag.equals(tagBeingCreated)) |
| { |
| // if the container is different and doesn't exist, then add it. |
| domPosition = BodyHelper.insertBody(domPosition, containerTag.asQName(), "f"); //$NON-NLS-1$ |
| } |
| // otherwise, fall through leaving domPosition unchanged |
| } |
| |
| return domPosition; |
| } |
| |
| @Override |
| protected boolean prepare() |
| { |
| throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$ |
| } |
| } |