/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*******************************************************************************/
package org.ebayopensource.turmeric.eclipse.test.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.lang.StringUtils;
import org.ebayopensource.turmeric.eclipse.utils.io.PropertiesFileUtil;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
/**
* The Class TLArtifactValidator.
*/
public class TLArtifactValidator implements IResourceVisitor {
private String goldCopyDir = null;
private Collection<File> files = null;
private boolean matches = true;
/**
* Sets the gold copy root dir.
*
* @param subDir the new gold copy root dir
*/
@SuppressWarnings("unchecked")
public void setGoldCopyRootDir(String subDir) {
// goldCopyDir = WsdlUtilTest.getPluginOSPath(Activator.PLUGIN_ID, "test-data/" + subDir);
ArrayList<String> dirList = new ArrayList<String>();
dirList.add("bin");
// dirList.add("gen-src");
ArrayList<String> fileList = new ArrayList<String>();
fileList.add(".project");
fileList.add("ObjectFactory.java");
fileList.add("project.xml");
NotFileFilter dirFilter = new NotFileFilter(new NameFileFilter(dirList));
NotFileFilter fileFilter = new NotFileFilter(new NameFileFilter(fileList));
files = FileUtils.listFiles(new File(goldCopyDir), fileFilter, dirFilter);
}
/**
* Checks if is matches.
*
* @return true, if is matches
*/
public boolean isMatches() {
if (files.size() > 0) {
for (Iterator<File> iterator = files.iterator(); iterator.hasNext();) {
File file = iterator.next();
System.out.println("Goldcopy extra file: " + file.getAbsolutePath() );
}
}
return matches && !files.isEmpty();
}
/**
* {@inheritDoc}
*/
@Override
public boolean visit(IResource resource) throws CoreException {
if (!matches) return false;
IPath path = resource.getProjectRelativePath();
if (StringUtils.isEmpty(path.toString()))
return true;
if (path.toString().startsWith("bin"))
return true;
if (path.toString().startsWith("build"))
return true;
// Verify Builder and Nature in .project
if (path.toString().equalsIgnoreCase(".project"))
return true;
// Skipping validaton of ObjectFactory.java as it is generated in a different way each time.
if(path.toString().endsWith("ObjectFactory.java"))
return true;
if (path.toString().startsWith(".settings"))
return true;
// Skipping validaton of TypeMapping.xml as it is generated in a different way each time.
if (path.toString().endsWith("TypeInformation.xml"))
return true;
if (path.toString().endsWith(".episode"))
return true;
// now compare with the files in the gold copy
IPath rsrcPath = resource.getProject().getLocation().append(path);
System.out.println(rsrcPath.toOSString());
if (rsrcPath.toFile().isFile()) {
if (rsrcPath.toString().endsWith("properties")) {
Properties srcProp = new Properties();
FileInputStream srcIs = null;
try {
srcIs = new FileInputStream(rsrcPath.toFile());
srcProp.load(srcIs);
} catch (Exception e) {
e.printStackTrace();
matches = false;
} finally {
closeInputStream(srcIs);
}
Properties goldCopyProp = new Properties();
FileInputStream is = null;
try {
is = new FileInputStream(new File(goldCopyDir + "/" + path.toString()));
goldCopyProp.load(is);
} catch (Exception e) {
e.printStackTrace();
matches = false;
} finally {
closeInputStream(is);
}
if (matches) {
matches = PropertiesFileUtil.isEqual(srcProp, goldCopyProp);
}
} else {
try {
if (path.toString().startsWith("gen-src")) {
if (path.toString().endsWith(resource.getProject().getName() + ".java"))
{
// Assert the location
if (FileUtils.contentEquals(rsrcPath.toFile(), new File(goldCopyDir + "/" + path.toString())) == false)
{
System.out.println("the following did not match: " + goldCopyDir + "/" +path);
matches = false;
}
}
else {
matches = true;
}
} else if (path.toString().startsWith("gen-meta-src")) {
if (FileUtils.contentEquals(rsrcPath.toFile(), new File(goldCopyDir + "/" + path.toString())) == false)
{
System.out.println("the following did not match: "+ goldCopyDir + "/" + path);
matches = false;
}
} else {
if (FileUtils.contentEquals(rsrcPath.toFile(), new File(goldCopyDir + "/" + path.toString())) == false)
{
System.out.println("the following did not match: "+ goldCopyDir + "/" + path);
matches = false;
}
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("the following did not match: " + goldCopyDir + "/" + path);
matches = false;
}
}
} else {
files.remove(new File(goldCopyDir + "/" + path.toString()));
}
return true;
}
private void closeInputStream(FileInputStream srcIs) {
if (srcIs != null) {
try {
srcIs.close();
} catch (IOException e) {
}
}
}
}