/******************************************************************************* * Copyright (c) 2006, 2016 IBM 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.help.internal.dynamic; import java.util.Map; import org.eclipse.help.ITocContribution; import org.eclipse.help.internal.HelpPlugin; import org.eclipse.help.internal.UAElement; /* * A handler that ensures that specified attributes are there for certain nodes, * or removes the node and logs an error. Also logs warnings for deprecated elements. */ public class ValidationHandler extends ProcessorHandler { private Map<String, String[]> requiredAttributes; private Map<String, String> deprecatedElements; /* * Creates a new validator that looks for the given mapping of * element names to required attribute names. */ public ValidationHandler(Map<String, String[]> requiredAttributes) { this(requiredAttributes, null); } /* * Creates a new validator that looks for the given mapping of * element names to required attribute names, as well as a mapping * of deprecated element names to suggested new element names. */ public ValidationHandler(Map<String, String[]> requiredAttributes, Map<String, String> deprecatedElements) { this.requiredAttributes = requiredAttributes; this.deprecatedElements = deprecatedElements; } @Override public short handle(UAElement element, String id) { if (deprecatedElements != null) { String suggestion = deprecatedElements.get(element.getElementName()); if (suggestion != null) { String msg = "The \"" + element.getElementName() + "\" element is deprecated in \"" + id + "\"; use \"" + suggestion + "\" instead."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ HelpPlugin.logWarning(msg); } } String[] attributes = requiredAttributes.get(element.getElementName()); if (attributes != null) { for (int i=0;i<attributes.length;++i) { if (element.getAttribute(attributes[i]) == null) { String msg = "Required attribute \"" + attributes[i] + "\" missing from \"" + element.getElementName() + "\" element"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if (id != null) { msg += " in \"" + id + '"'; //$NON-NLS-1$ } UAElement parent = element.getParentElement(); if (parent != null && !(parent instanceof ITocContribution)) { msg += " (skipping element)"; //$NON-NLS-1$ parent.removeChild(element); HelpPlugin.logError(msg); return HANDLED_SKIP; } else { throw new IllegalArgumentException(msg); } } } } return UNHANDLED; } }