/******************************************************************************* * 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.components; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.jdt.internal.core.JarEntryFile; import org.eclipse.wst.xml.core.internal.document.ElementImpl; 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.jboss.tools.jsf.jsf2.model.JSF2ComponentModelManager; import org.jboss.tools.jsf.web.validation.IJSFValidationComponent; import org.jboss.tools.jsf.web.validation.jsf2.util.JSF2ValidatorConstants; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; /** * * @author yzhishko * */ @SuppressWarnings("restriction") public class JSF2ComponentFactory { private static Set<String> uncheckedAttrs = new HashSet<String>(0); static { uncheckedAttrs.add("id"); //$NON-NLS-1$ } public static IJSFValidationComponent createCompositeTempComponent( IDOMElement element) { JSF2CompositeTempComponent component = new JSF2CompositeTempComponent( (ElementImpl) element); component.setStartOffSet(element.getStartOffset()); component.setLength(element.getStartEndOffset() - component.getStartOffSet()); component.setLine(element.getStructuredDocument().getLineOfOffset( component.getStartOffSet()) + 1); component.createValidationMessage(); component.createMessageParams(); return component; } public static IJSFValidationComponent[] createUnfixableAttrTempComponents( JarEntryFile container, IDOMElement elementWithAttrs) { List<IJSFValidationComponent> validationComponents = new ArrayList<IJSFValidationComponent>( 0); IDOMDocument containerDocument = JSF2ComponentModelManager .getReadableDOMDocument(container); Element interfaceElement = JSF2ComponentModelManager.getManager() .checkCompositeInterface(containerDocument); Set<String> interfaceAttrs = JSF2ComponentModelManager.getManager() .getInterfaceAttrs(interfaceElement); interfaceAttrs.addAll(uncheckedAttrs); IDOMAttr[] existingAttrs = getExistingAttrs(elementWithAttrs); for (int i = 0; i < existingAttrs.length; i++) { if (!interfaceAttrs.contains(existingAttrs[i].getName())) { IDOMAttr attr = existingAttrs[i]; JSF2AttrTempComponent component = new JSF2AttrTempComponent( attr, (ElementImpl) elementWithAttrs); component .setType(JSF2ValidatorConstants.JSF2_UNFIXABLE_ATTR_TYPE); component.setStartOffSet(attr.getStartOffset()); component.setLine(attr.getStructuredDocument().getLineOfOffset( component.getStartOffSet()) + 1); component.setLength(attr.getName().length()); component.createValidationMessage(); component.createMessageParams(); validationComponents.add(component); } } return validationComponents.toArray(new IJSFValidationComponent[0]); } public static IJSFValidationComponent[] createFixableAttrTempComponents( IFile compContainerFile, IDOMElement elementWithAttrs) { List<IJSFValidationComponent> components = new ArrayList<IJSFValidationComponent>( 0); IDOMDocument document = JSF2ComponentModelManager .getReadableDOMDocument(compContainerFile); Element interfaceElement = JSF2ComponentModelManager.getManager() .checkCompositeInterface(document); Set<String> interfaceAttrs = JSF2ComponentModelManager.getManager() .getInterfaceAttrs(interfaceElement); interfaceAttrs.addAll(uncheckedAttrs); IDOMAttr[] existingAttrs = getExistingAttrs(elementWithAttrs); for (int i = 0; i < existingAttrs.length; i++) { if (!interfaceAttrs.contains(existingAttrs[i].getName())) { IDOMAttr attr = existingAttrs[i]; JSF2AttrTempComponent component = new JSF2AttrTempComponent( attr, (ElementImpl) elementWithAttrs); component .setType(JSF2ValidatorConstants.JSF2_FIXABLE_ATTR_TYPE); component.setStartOffSet(attr.getStartOffset()); component.setLine(attr.getStructuredDocument().getLineOfOffset( component.getStartOffSet()) + 1); component.setLength(attr.getName().length()); component.createValidationMessage(); component.createMessageParams(); components.add(component); } } return components.toArray(new IJSFValidationComponent[0]); } public static IJSFValidationComponent createURITempComponent( IDOMAttr attrContainer) { JSF2URITempComponent component = new JSF2URITempComponent(attrContainer .getValue()); component.setStartOffSet(attrContainer.getStartOffset()); component.setLength(attrContainer.getValueRegionStartOffset() - component.getStartOffSet() + attrContainer.getValue().length() + 2); component.setLine(attrContainer.getStructuredDocument() .getLineOfOffset(component.getStartOffSet()) + 1); component.createMessageParams(); component.createValidationMessage(); return component; } private static IDOMAttr[] getExistingAttrs(IDOMElement validateElement) { List<IDOMAttr> existingAttrs = new ArrayList<IDOMAttr>(0); NamedNodeMap attrsMap = validateElement.getAttributes(); if (attrsMap != null) { for (int i = 0; i < attrsMap.getLength(); i++) { Node node = attrsMap.item(i); if (node instanceof IDOMAttr) { existingAttrs.add((IDOMAttr) node); } } } return existingAttrs.toArray(new IDOMAttr[0]); } }