/*******************************************************************************
* 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.action;
import java.io.IOException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.IMarkerResolutionGenerator2;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.jboss.tools.common.text.ext.util.Utils;
import org.jboss.tools.jsf.JSFModelPlugin;
import org.jboss.tools.jsf.jsf2.model.CompositeComponentConstants;
import org.jboss.tools.jsf.web.validation.composite.CompositeComponentValidator;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
/**
*
* @author yzhishko
*
*/
public class JSF2ComponentResolutionGenerator implements
IMarkerResolutionGenerator2 {
public IMarkerResolution[] getResolutions(IMarker marker) {
try {
int messageId = getMessageID(marker);
if (messageId == -1)
return new IMarkerResolution[] {};
final IFile file = (IFile) marker.getResource();
Integer attribute = ((Integer) marker.getAttribute(IMarker.CHAR_START));
if (attribute == null)
return new IMarkerResolution[] {};
final int start = attribute.intValue();
IModelManager manager = StructuredModelManager.getModelManager();
if(manager != null){
IStructuredModel model = null;
try {
model = manager.getModelForRead(file);
if (model instanceof IDOMModel) {
Node node = Utils.findNodeForOffset(((IDOMModel) model).getDocument(), start);
String tagName = node.getLocalName();
String attrName = "";
if(node instanceof IDOMAttr){
attrName = node.getLocalName();
node = ((IDOMAttr)node).getOwnerElement();
tagName = node.getLocalName();
}
if (messageId == CompositeComponentValidator.UNKNOWN_COMPOSITE_COMPONENT_NAME_ID) {
return new IMarkerResolution[] { new JSF2CompositeComponentProposal(marker.getResource(), getComponentPath(node), tagName, getAttributes(node)) };
}else if(messageId == CompositeComponentValidator.UNKNOWN_COMPOSITE_COMPONENT_ATTRIBUTE_ID){
return new IMarkerResolution[] { new JSF2CompositeAttrsProposal(marker.getResource(), getComponentPath(node), tagName, getAttributes(node), attrName) };
}
}
} catch (CoreException e) {
JSFModelPlugin.getPluginLog().logError(e);
} catch (IOException e) {
JSFModelPlugin.getPluginLog().logError(e);
} finally {
if (model != null) {
model.releaseFromRead();
}
}
}
} catch (CoreException e) {
JSFModelPlugin.getPluginLog().logError(e);
}
return new IMarkerResolution[0];
}
private String getComponentPath(Node node){
String path;
String uriString = node.getNamespaceURI();
String relativeLocation = uriString.replaceFirst(
CompositeComponentConstants.COMPOSITE_XMLNS, ""); //$NON-NLS-1$
String nodeName = node.getLocalName();
path = relativeLocation + "/" + nodeName + ".xhtml"; //$NON-NLS-1$ //$NON-NLS-2$
return path;
}
private String[] getAttributes(Node node){
NamedNodeMap nm = node.getAttributes();
String[] attributes = new String[nm.getLength()];
for(int i = 0; i < nm.getLength(); i++){
attributes[i] = nm.item(i).getLocalName();
}
return attributes;
}
/**
* return message id or -1 if impossible to find
* @param marker
* @return
*/
private int getMessageID(IMarker marker)throws CoreException{
Integer attribute = ((Integer) marker.getAttribute(CompositeComponentValidator.MESSAGE_ID_ATTRIBUTE_NAME));
if (attribute != null)
return attribute.intValue();
return -1;
}
public boolean hasResolutions(IMarker marker) {
if(marker.exists()){
try {
return getMessageID(marker) >= 0;
} catch (CoreException ex) {
JSFModelPlugin.getDefault().logError(ex);
}
}
return false;
}
}