/*******************************************************************************
* Copyright (c) 2007-2010 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.web.validation.jsf2;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.eclipse.core.resources.IFile;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.eclipse.wst.xml.core.internal.validation.core.ValidationReport;
import org.jboss.tools.common.el.core.resolver.ELContext;
import org.jboss.tools.jsf.JSFModelPlugin;
import org.jboss.tools.jsf.jsf2.model.JSF2ComponentModelManager;
import org.jboss.tools.jsf.jsf2.util.JSF2ComponentUtil;
import org.jboss.tools.jsf.web.validation.IJSFValidationComponent;
import org.jboss.tools.jsf.web.validation.jsf2.util.JSF2ComponentRecognizer;
import org.jboss.tools.jst.web.kb.IPageContext;
import org.jboss.tools.jst.web.kb.PageContextFactory;
import org.jboss.tools.jst.web.kb.internal.XmlContextImpl;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
*
* @author yzhishko
*
*/
@SuppressWarnings("restriction")
public class JSF2XMLValidator {
public static String JSF2_PROBLEM_ID = JSFModelPlugin.PLUGIN_ID
+ ".jsf2problemmarker"; //$NON-NLS-1$
private JSF2ValidationInfo validationInfo;
private static JSF2XMLValidator instance = new JSF2XMLValidator();
public ValidationReport validate(IFile file, String uri) {
validationInfo = new JSF2ValidationInfo(uri);
validate(file);
return validationInfo;
}
private JSF2XMLValidator() {
}
public static JSF2XMLValidator getInstance() {
return instance;
}
private void validate(IFile file) {
ELContext elContext = PageContextFactory.createPageContext(file);
if (elContext instanceof IPageContext) {
validateAsDOM(file);
} else if (elContext instanceof XmlContextImpl) {
if ("xhtml".equals(file.getFileExtension())) { //$NON-NLS-1$
validateAsDOM(file);
}
}
}
private void validateAsDOM(IFile file) {
IDOMDocument document = JSF2ComponentModelManager
.getReadableDOMDocument(file);
IJSFValidationComponent[] components = getValidationComponents(
document, file);
if (components != null) {
for (int i = 0; i < components.length; i++) {
createMarkerForComponent(components[i]);
}
}
}
private void createMarkerForComponent(
IJSFValidationComponent jsf2ValidationComponent) {
validationInfo.addWarning(jsf2ValidationComponent
.getValidationMessage(), jsf2ValidationComponent.getLine(), 0,
validationInfo.getFileURI(), null, jsf2ValidationComponent
.getMessageParams());
}
public static IJSFValidationComponent[] getValidationComponents(Node node,
IFile file) {
List<IJSFValidationComponent> components = new ArrayList<IJSFValidationComponent>(
0);
Map<String, List<Element>> compositeComponentsMap = JSF2ComponentUtil
.findCompositeComponents(node);
Set<Entry<String, List<Element>>> entries = compositeComponentsMap
.entrySet();
for (Entry<String, List<Element>> entry : entries) {
List<Element> elements = entry.getValue();
for (Element element : elements) {
IJSFValidationComponent[] validationComponents = JSF2ComponentRecognizer
.recognizeCompositeValidationComponents(file,
(IDOMElement) element);
for (int i = 0; i < validationComponents.length; i++) {
components.add(validationComponents[i]);
}
}
}
IDOMAttr[] attrs = JSF2ComponentUtil.findURIContainers(node);
Set<String> attrValuesSet = new HashSet<String>(0);
for (int i = 0; i < attrs.length; i++) {
if (!attrValuesSet.contains(attrs[i].getValue())) {
attrValuesSet.add(attrs[i].getValue());
IJSFValidationComponent validationComponent = JSF2ComponentRecognizer
.recognizeURIValidationComponent(file.getProject(),
attrs[i]);
if (validationComponent != null) {
components.add(validationComponent);
}
}
}
return components.toArray(new IJSFValidationComponent[0]);
}
}