org.ebayopensource.turmeric.eclipse.test.util.ProjectArtifactValidator.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.eclipse.test.util.ProjectArtifactValidator.java

Source

/*******************************************************************************
 * 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.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.lang.StringUtils;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.ElementNameAndAttributeQualifier;
import org.custommonkey.xmlunit.XMLUnit;
import org.ebayopensource.turmeric.eclipse.functional.test.SoaTestConstants;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.ISOARepositorySystem;
import org.ebayopensource.turmeric.eclipse.test.utils.WsdlUtilTest;
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;
import org.eclipse.core.runtime.Path;

/**
 * @author rpallikonda
 * 
 */
public class ProjectArtifactValidator implements IResourceVisitor {

    private String goldCopyDir = null;
    private Collection<File> files = null;
    private boolean matches = true;
    private boolean isV3 = false;
    private List<String> filterDirList = new ArrayList<String>();
    private List<String> filterFileList = new ArrayList<String>();
    private static StringBuffer message = new StringBuffer();

    public ProjectArtifactValidator(String... filterDirList) {
        super();
        if (filterDirList != null) {
            this.filterDirList.addAll(Arrays.asList(filterDirList));
        }
    }

    public void setGoldCopyRootDir(String subDir) {
        goldCopyDir = WsdlUtilTest.getPluginOSPath(SoaTestConstants.PLUGIN_ID, "data/extractedData/" + subDir);
        System.out.println(" --- gold Copy Dir : " + goldCopyDir.toString());

        ISOARepositorySystem repositorySystem = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem();

        List<String> dirList = this.filterDirList;
        dirList.add("build"); // '..\bin' is now '..\build'
        dirList.add(".settings");
        dirList.add("bin");
        dirList.add("target");

        List<String> fileList = filterFileList;
        fileList.add(".project");
        fileList.add("pom.xml");
        // filtering out this file as there is a harcoded path in this property
        // file which will make the comparison fail if executed from some other
        // system.
        // need to find a way to compare property file
        fileList.add("service_intf_project.properties");
        fileList.add("project.xml");
        fileList.add(".classpath");

        NotFileFilter dirFilter = new NotFileFilter(new NameFileFilter(dirList));
        NotFileFilter fileFilter = new NotFileFilter(new NameFileFilter(fileList));
        files = FileUtils.listFiles(new File(goldCopyDir), fileFilter, dirFilter);

    }

    public boolean isMatches() {
        if (files.size() > 0) {
            for (Iterator iterator = files.iterator(); iterator.hasNext();) {
                File file = (File) iterator.next();
                System.out.println("Goldcopy file : " + file.getAbsolutePath());
            }
        }
        return matches && !files.isEmpty();
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.core.resources.IResourceVisitor#visit(org.eclipse.core.resources
     * .IResource)
     */
    @Override
    public boolean visit(IResource resource) throws CoreException {

        // if (!matches)
        // return false;

        IPath path = resource.getProjectRelativePath();

        String filePath = path.toString();

        if (StringUtils.isEmpty(filePath))
            return true;

        for (String dir : filterDirList) {
            IPath dirPath = new Path(dir);
            if (path.matchingFirstSegments(dirPath) == dirPath.segmentCount()) {
                return true;
            }
        }

        String lastSegment = path.lastSegment();
        for (String file : this.filterFileList) {
            if (lastSegment.equalsIgnoreCase(file))
                return true;
        }

        // now compare with the files in the gold copy
        IPath rsrcPath = resource.getProject().getLocation().append(path);

        if (rsrcPath.toFile().isFile()) {

            if (!rsrcPath.toFile().exists()
                    && (new File(goldCopyDir + File.separator + path.toString()).exists())) {

                formatMessage(rsrcPath, "generated copy does not exist");

            }

            System.out.println(" --- Functional test generated file : " + rsrcPath.toOSString());
            if ("properties".equals(rsrcPath.getFileExtension())) {

                Properties srcProp = new Properties();
                InputStream ins = null;
                try {
                    ins = new FileInputStream(rsrcPath.toFile());
                    srcProp.load(ins);
                } catch (Exception e) {
                    e.printStackTrace();
                    matches = false;
                } finally {
                    IOUtils.closeQuietly(ins);
                }
                Properties goldCopyProp = new Properties();
                try {
                    ins = new FileInputStream(new File(goldCopyDir + File.separator + path.toString()));
                    goldCopyProp.load(ins);
                } catch (Exception e) {
                    e.printStackTrace();
                    matches = false;
                } finally {
                    IOUtils.closeQuietly(ins);
                }
                if (matches) {
                    if (srcProp.containsKey("original_wsdl_uri")) {
                        srcProp.remove("original_wsdl_uri");
                        goldCopyProp.remove("original_wsdl_uri");
                    }
                    if (PropertiesFileUtil.isEqual(srcProp, goldCopyProp) == false) {

                        formatMessage(rsrcPath, "gold copy did not match");

                        System.out.println("the following did not match: " + goldCopyDir + "/" + path);
                        matches = false;
                    }
                }

            } else {
                try {

                    if ("java".equals(rsrcPath.getFileExtension())) {

                        //                  if(rsrcPath.lastSegment().contains("TypeDefsBuilder")){
                        //                  //failing in linux box.   
                        //                  return true;
                        //                     
                        //                  }

                        System.out.println("java file : " + rsrcPath.toOSString());
                        File goldCopyJava = new File(goldCopyDir + File.separator + path.toString());

                        if (!goldCopyJava.exists()) {
                            formatMessage(rsrcPath, "gold copy do not exist");
                            System.out.println("File not in gold copy" + goldCopyDir + "/" + path);
                            matches = false;
                            return true;
                        }
                        if (compareTwoFiles(rsrcPath.toFile(), goldCopyJava) == false) {

                            formatMessage(rsrcPath, "gold copy did not match");
                            System.out.println("the following did not match: " + goldCopyDir + "/" + path);

                            matches = false;
                        }

                    } else {
                        if ("xml".equals(rsrcPath.getFileExtension())) {
                            System.out.println("xml file : " + rsrcPath.toOSString());

                            /*
                             * if (FileUtils.contentEquals( rsrcPath.toFile(),
                             * new File(goldCopyDir + "/" + path.toString())) ==
                             * false) { formatMessage(rsrcPath); System.out
                             * .println("the following did not match: " +
                             * goldCopyDir + "/" + path); matches = false; }
                             */

                            try {
                                String xmlfile = readFileAsString(rsrcPath.toOSString());

                                // Only Validated if we have a schema with the
                                // file
                                // XMLAssert.assertXMLValid(xmlfile);
                                // XMLAssert.assertXMLValid(goldCopyDir
                                // + File.separator + path);
                                XMLUnit.setIgnoreAttributeOrder(true);
                                XMLUnit.setIgnoreWhitespace(true);

                                String goldFile = readFileAsString(goldCopyDir + File.separator + path);
                                //                        XMLAssert.assertXMLEqual(goldFile,xmlfile);
                                Diff diff = new Diff(goldFile, xmlfile);
                                //Whichever element has the attribute "name" in the goldfile will be compared with 
                                //all the elements that have attribute "name" in the xmlfile, takes care of order differences
                                diff.overrideElementQualifier(new ElementNameAndAttributeQualifier("name"));
                                if (!diff.similar()) {
                                    formatMessage(rsrcPath, "gold copy did not match");
                                    System.out.println("the following did not match: " + goldCopyDir + "/" + path);
                                    matches = false;
                                }
                                //                        XMLAssert.assertXMLEqual(goldFile,xmlfile);

                            } catch (Exception e) {
                                formatMessage(rsrcPath, "gold copy did not match");
                                e.printStackTrace();
                            }

                        } else if ("wsdl".equals(rsrcPath.getFileExtension())) {

                            System.out.println("wsdlFile file : " + rsrcPath.toOSString());

                        } else {

                            System.out.println("other file : " + rsrcPath.toOSString());

                            if (FileUtils.contentEquals(rsrcPath.toFile(),
                                    new File(goldCopyDir + "/" + path.toString())) == false) {
                                formatMessage(rsrcPath, "gold copy did not match");
                                System.out.println("the following did not match: " + goldCopyDir + "/" + path);
                                matches = false;
                            }
                        }

                    }
                } catch (FileNotFoundException fnfe) {
                    formatMessage(rsrcPath, "file not found exception");

                } 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 static String readFileAsString(String filePath) throws java.io.IOException {
        StringBuffer fileData = new StringBuffer(1000);
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
        char[] buf = new char[1024];
        int numRead = 0;
        while ((numRead = reader.read(buf)) != -1) {
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }
        reader.close();
        return fileData.toString();
    }

    private boolean compareTwoFiles(File file1, File file2) throws IOException {
        @SuppressWarnings("unchecked")
        List<String> firstFile = FileUtils.readLines(file1);

        ArrayList<String> trimmedList1 = new ArrayList<String>();

        ArrayList<String> trimmedList2 = new ArrayList<String>();
        @SuppressWarnings("unchecked")
        List<String> secondFile = FileUtils.readLines(file2);

        while (firstFile.remove(""))
            ;
        while (secondFile.remove(""))
            ;

        for (String s : firstFile) {
            trimmedList1.add(s.trim());
        }

        for (String s : secondFile) {
            trimmedList2.add(s.trim());
        }

        ArrayList<String> commentRemoved1 = new ArrayList<String>();

        ArrayList<String> commentRemoved2 = new ArrayList<String>();

        commentRemoved1.addAll(trimmedList1);
        Iterator<String> it = trimmedList1.iterator();
        String s = null;
        while (it.hasNext()) {
            s = it.next();
            if (Pattern.matches(CommentDetector.COMMENT_DETECTOR_REGEX, s))
                commentRemoved1.remove(s);
        }

        commentRemoved2.addAll(trimmedList2);
        it = trimmedList2.iterator();
        while (it.hasNext()) {
            s = it.next();
            if (Pattern.matches(CommentDetector.COMMENT_DETECTOR_REGEX, s))
                commentRemoved2.remove(s);
        }

        if (commentRemoved1.size() == commentRemoved2.size()) {
            if (commentRemoved1.containsAll(commentRemoved2))
                return true;
            else {

                Iterator<String> itr = commentRemoved1.iterator();
                Iterator<String> itr2 = commentRemoved2.iterator();

                while (itr.hasNext() && itr2.hasNext()) {

                    String line1 = itr.next();
                    String line2 = itr2.next();
                    if (!line1.equals(line2)) {
                        System.out.println(line1 + " is not matching " + line2);
                    }
                }
                System.out.println(commentRemoved1);
                System.out.println(commentRemoved2);
                return false;
            }

        } else {
            System.out.println("Number of lines in first file " + commentRemoved1.size());
            System.out.println("Number of lines in second file " + commentRemoved2.size());
            return false;
        }
    }

    public static StringBuffer getErroredFileMessage() {

        return ProjectArtifactValidator.message;
    }

    public static void setMessage(StringBuffer message) {
        ProjectArtifactValidator.message = message;
    }

    private void compileSrc(String filePath) {

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        int result = compiler.run(null, null, null, filePath);
    }

    private void formatMessage(IPath resource, String msg) {

        message.append("----The file " + resource.toOSString() + msg);
    }

}