bluej.collect.CollectUtility.java Source code

Java tutorial

Introduction

Here is the source code for bluej.collect.CollectUtility.java

Source

/*
 This file is part of the BlueJ program. 
 Copyright (C) 2012,2014  Michael Kolling and John Rosenberg 
     
 This program is free software; you can redistribute it and/or 
 modify it under the terms of the GNU General Public License 
 as published by the Free Software Foundation; either version 2 
 of the License, or (at your option) any later version. 
     
 This program is distributed in the hope that it will be useful, 
 but WITHOUT ANY WARRANTY; without even the implied warranty of 
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 GNU General Public License for more details. 
     
 You should have received a copy of the GNU General Public License 
 along with this program; if not, write to the Free Software 
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
     
 This file is subject to the Classpath exception as provided in the  
 LICENSE.txt file that accompanied this code.
 */
package bluej.collect;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.http.entity.mime.content.StringBody;

import threadchecker.OnThread;
import threadchecker.Tag;
import bluej.pkgmgr.Project;
import bluej.utility.Debug;

/**
 * A class with various utilities used by DataCollector
 * @author nccb
 *
 */
class CollectUtility {
    /**
     * Cached UTF-8 charset:
     */
    private static final Charset utf8 = Charset.forName("UTF-8");

    /**
     * A class that stores details of the Project that are useful for constructing messages to
     * the Blackbox server.  This is needed so that we can safely pull the details from the Project
     * on the Swing thread, then use them later from the submitter thread
     *
     */
    // package-visible
    static class ProjectDetails {
        final Charset charset;
        final File projectDir;

        // package-visible
        @OnThread(Tag.Swing)
        ProjectDetails(Project project) {
            this.projectDir = project.getProjectDir();
            this.charset = project.getProjectCharset();
        }

    }

    /**
     * Reads a source code file from the project, and anonymises it
     */
    static String readFileAndAnonymise(ProjectDetails proj, File f) {
        try {
            StringBuilder sb = new StringBuilder();
            FileInputStream inputStream = new FileInputStream(f);
            InputStreamReader reader = new InputStreamReader(inputStream, proj.charset);
            char[] buf = new char[4096];

            int read = reader.read(buf);
            while (read != -1) {
                sb.append(buf, 0, read);
                read = reader.read(buf);
            }

            reader.close();
            inputStream.close();
            return CodeAnonymiser.anonymise(sb.toString());
        } catch (IOException ioe) {
            return null;
        }
    }

    /**
     * Gets the path of the given file, relative to the given project's base directory
     */
    static String toPath(ProjectDetails proj, File f) {
        return proj.projectDir.toURI().relativize(f.toURI()).getPath();
    }

    /**
     * Chains together toBody with toPath
     */
    static StringBody toBodyLocal(ProjectDetails project, File sourceFile) {
        return toBody(toPath(project, sourceFile));
    }

    /**
     * Performs an md5 hash of the given string
     */
    static String md5Hash(String src) {
        byte[] hash;
        try {
            hash = MessageDigest.getInstance("MD5").digest(src.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            //Oracle comes with MD5, unlikely that any other JDK wouldn't:
            Debug.reportError(e);
            return "";
        } catch (UnsupportedEncodingException e) {
            //Shouldn't happen -- no UTF-8?!
            Debug.reportError(e);
            return "";
        }
        StringBuilder s = new StringBuilder();
        for (byte b : hash) {
            s.append(String.format("%02X", b));
        }
        return s.toString();
    }

    /**
     * Converts the given String to a StringBody.  Null strings are sent the same as empty strings.
     */
    static StringBody toBody(String s) {
        try {
            return new StringBody(s == null ? "" : s, utf8);
        } catch (UnsupportedEncodingException e) {
            // Shouldn't happen, because UTF-8 is required to be supported
            return null;
        }
    }

    /**
     * Converts the integer to a StringBody
     */
    static StringBody toBody(int i) {
        return toBody(Integer.toString(i));
    }

    /**
     * Converts the long to a StringBody
     */
    static StringBody toBody(long l) {
        return toBody(Long.toString(l));
    }

    /**
     * Converts the boolean to a StringBody
     */
    static StringBody toBody(boolean b) {
        return toBody(Boolean.toString(b));
    }

}