blob: 7e35aa641bd22ce5fe6d5c4774156997a0d09a44 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Oracle Corporation.
* 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:
* Cameron Bateman - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.facelet.core.internal.validation;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jst.j2ee.model.ModelProviderManager;
import org.eclipse.jst.jsf.common.internal.componentcore.AbstractVirtualComponentQuery.DefaultVirtualComponentQuery;
import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.TagModelParser;
import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.WebappConfiguration;
import org.eclipse.jst.jsf.facelet.core.internal.registry.taglib.faceletTaglib_1_0.FaceletTaglibDefn;
import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil;
import org.eclipse.jst.jsp.core.internal.Logger;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
import org.xml.sax.SAXException;
/**
* FUTURE USE: a build validator for source taglib definition files.
*
* @author cbateman
*
*/
public class TaglibValidator implements IValidatorJob
{
public ISchedulingRule getSchedulingRule(IValidationContext helper)
{
// no scheduling rule
return null;
}
public IStatus validateInJob(IValidationContext helper, IReporter reporter)
throws ValidationException
{
IStatus status = Status.OK_STATUS;
try
{
validate(helper, reporter);
}
catch (ValidationException e)
{
Logger.logException(e);
status = new Status(IStatus.ERROR, FaceletCorePlugin.PLUGIN_ID,
IStatus.ERROR, e.getLocalizedMessage(), e);
}
return status;
}
public void cleanup(IReporter reporter)
{
// no cleanup
}
public void validate(IValidationContext helper, IReporter reporter)
throws ValidationException
{
String[] uris = helper.getURIs();
IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
if (uris.length > 0)
{
IFile currentFile = null;
for (int i = 0; i < uris.length && !reporter.isCancelled(); i++)
{
currentFile = wsRoot.getFile(new Path(uris[i]));
if (currentFile != null && currentFile.exists())
{
if (shouldValidate(currentFile))
{
validateFile(currentFile, reporter);
}
}
}
}
}
private boolean shouldValidate(IFile currentFile)
{
final IProject project = currentFile.getProject();
final IVirtualFolder folder = new DefaultVirtualComponentQuery().getWebContentFolder(project);
final IPath filePath = currentFile.getProjectRelativePath();
final IPath webFolderPath = folder.getUnderlyingFolder().getProjectRelativePath();
boolean isInValidPath = ViewUtil.isFaceletVDLFile(currentFile)
&& webFolderPath.isPrefixOf(filePath);
if (isInValidPath)
{
for (final String configuredPath : WebappConfiguration.getConfigFilesFromContextParam(project, ModelProviderManager.getModelProvider(project)))
{
final IPath path = webFolderPath.append(configuredPath);
if (path.equals(filePath))
{
return true;
}
}
}
return false;
}
private void validateFile(IFile file, IReporter reporter)
{
InputStream is = null;
try
{
is = file.getContents();
FaceletTaglibDefn taglib = TagModelParser.loadFromInputStream(is, null);
if (taglib != null)
{
validate(taglib);
}
}
catch (CoreException e)
{
FaceletCorePlugin.log("Validating taglib file: "+file.getName(), e); //$NON-NLS-1$
}
catch (IOException e)
{
FaceletCorePlugin.log("Validating taglib file: "+file.getName(), e); //$NON-NLS-1$
}
catch (ParserConfigurationException e)
{
FaceletCorePlugin.log("Validating taglib file: "+file.getName(), e); //$NON-NLS-1$
}
catch (SAXException e)
{
FaceletCorePlugin.log("Validating taglib file: "+file.getName(), e); //$NON-NLS-1$
}
finally
{
if (is != null)
{
try
{
is.close();
}
catch (IOException e)
{
FaceletCorePlugin.log("Closing taglib file: "+file.getName(), e); //$NON-NLS-1$
}
}
}
}
private void validate(FaceletTaglibDefn taglib)
{
// if (taglib instanceof FaceletXMLDefnTaglib)
// {
//
// }
// else if (taglib instanceof FaceletLibraryClassTagLib)
// {
//
// }
}
}