org.robotframework.red.junit.ProjectProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.robotframework.red.junit.ProjectProvider.java

Source

/*
 * Copyright 2016 Nokia Solutions and Networks
 * Licensed under the Apache License, Version 2.0,
 * see license.txt file for details.
 */
package org.robotframework.red.junit;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.rf.ide.core.project.RobotProjectConfig;
import org.robotframework.ide.eclipse.main.plugin.project.RedEclipseProjectConfigWriter;
import org.robotframework.ide.eclipse.main.plugin.project.RobotProjectNature;

import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.io.CharStreams;

/**
 * @author Michal Anglart
 *
 */
public class ProjectProvider implements TestRule {

    private final String projectName;

    private IProject project;

    public ProjectProvider(final Class<?> testClass) {
        this(testClass.getSimpleName());
    }

    public ProjectProvider(final String projectName) {
        this.projectName = projectName;
    }

    public IProject getProject() {
        return project;
    }

    /**
     * Configures the project to have robot nature. Use wisely since this adds builder
     * to the project, so in some situations project building/validation can start.
     * 
     * @throws CoreException
     */
    public void addRobotNature() throws CoreException {
        RobotProjectNature.addRobotNature(project, null);
    }

    public void removeRobotNature() throws CoreException {
        RobotProjectNature.removeRobotNature(project, null, true);
    }

    public void configure() throws IOException, CoreException {
        configure(new RobotProjectConfig());
    }

    public void configure(final RobotProjectConfig config) throws IOException, CoreException {
        createFile(Path.fromPortableString("red.xml"), "");
        new RedEclipseProjectConfigWriter().writeConfiguration(config, project);
    }

    public void deconfigure() throws CoreException {
        project.findMember("red.xml").delete(true, null);
    }

    @Override
    public Statement apply(final Statement base, final Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                try {
                    if (project == null) {
                        project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
                        project.create(null);
                        project.open(null);
                        project.refreshLocal(IResource.DEPTH_INFINITE, null);
                    }
                    base.evaluate();
                } finally {
                    if (project != null && project.exists()) {
                        project.refreshLocal(IResource.DEPTH_INFINITE, null);
                        project.delete(true, null);
                    }
                }
            }
        };
    }

    public IFolder createDir(final String dirPath) throws CoreException {
        return createDir(Path.fromPortableString(dirPath));
    }

    public IFolder createDir(final IPath dirPath) throws CoreException {
        final IFolder directory = project.getFolder(dirPath);
        directory.create(true, true, null);
        return directory;
    }

    public IFile createFile(final String filePath, final String... lines) throws IOException, CoreException {
        return createFile(Path.fromPortableString(filePath), lines);
    }

    public IFile createFile(final IPath filePath, final String... lines) throws IOException, CoreException {
        final IFile file = project.getFile(filePath);
        try (InputStream source = new ByteArrayInputStream(Joiner.on('\n').join(lines).getBytes(Charsets.UTF_8))) {
            if (file.exists()) {
                file.setContents(source, true, false, null);
            } else {
                file.create(source, true, null);
            }
            project.refreshLocal(IResource.DEPTH_INFINITE, null);
        }
        return file;
    }

    public IFile getFile(final IPath filePath) {
        return project.getFile(filePath);
    }

    public IFile getFile(final String filePath) {
        return getFile(new Path(filePath));
    }

    public String getFileContent(final String filePath) throws IOException, CoreException {
        return getFileContent(new Path(filePath));
    }

    public String getFileContent(final IPath filePath) throws IOException, CoreException {
        return getFileContent(getFile(filePath));
    }

    public String getFileContent(final IFile file) throws IOException, CoreException {
        try (final InputStream stream = file.getContents()) {
            return CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8));
        }
    }

    public IFolder getDir(final IPath dirPath) {
        return project.getFolder(dirPath);
    }

    public IFolder getDir(final String dirPath) {
        return getDir(new Path(dirPath));
    }

}