# Resources.java

    /*******************************************************************************
     * Copyright (c) 2009, 2013 Mountainminds GmbH & Co. KG and Contributors
     * 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:
     *    Marc R. Hoffmann - initial API and implementation
     *
     *******************************************************************************/
    package org.jacoco.report.internal.html.resources;

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;

    import org.jacoco.core.analysis.ICoverageNode.ElementType;
    import org.jacoco.report.internal.ReportOutputFolder;

    /**
     * Static resource that are included with the coverage report and might be
     * referenced from created HTML pages.
     */
    public class Resources {

    	/** The name of the style sheet */
    	public static final String STYLESHEET = "report.css";

    	/** The name of the prettify style sheet */
    	public static final String PRETTIFY_STYLESHEET = "prettify.css";

    	/** The name of the prettify script */
    	public static final String PRETTIFY_SCRIPT = "prettify.js";

    	/** The name of the sort script */
    	public static final String SORT_SCRIPT = "sort.js";

    	/** The name of the red part of the coverage bar */
    	public static final String REDBAR = "redbar.gif";

    	/** The name of the green part of the coverage bar */
    	public static final String GREENBAR = "greenbar.gif";

    	private final ReportOutputFolder folder;

    	/**
    	 * Attaches resources to the report with the given root folder.
    	 *
    	 * @param root
    	 *            root folder of the report
    	 */
    	public Resources(final ReportOutputFolder root) {
    		folder = root.subFolder(".resources");
    	}

    	/**
    	 * Returns a relative link to a static resource.
    	 *
    	 * @param base
    	 *            base folder from where the link should be created
    	 * @param name
    	 *            name of the static resource, see constants in this class
    	 * @return relative link
    	 */
    	public String getLink(final ReportOutputFolder base, final String name) {
    		return folder.getLink(base, name);
    	}

    	/**
    	 * Determines the style sheet class for the given element type.
    	 *
    	 * @param type
    	 *            type of the element
    	 * @return style class name
    	 */
    	public static String getElementStyle(final ElementType type) {
    		switch (type) {
    		case GROUP:
    			return Styles.EL_GROUP;
    		case BUNDLE:
    			return Styles.EL_BUNDLE;
    		case PACKAGE:
    			return Styles.EL_PACKAGE;
    		case SOURCEFILE:
    			return Styles.EL_SOURCE;
    		case CLASS:
    			return Styles.EL_CLASS;
    		case METHOD:
    			return Styles.EL_METHOD;
    		}
    		throw new AssertionError("Unknown element type: " + type);
    	}

    	/**
    	 * Copies all static resources into the report.
    	 *
    	 * @throws IOException
    	 *             if the resources can't be written to the report
    	 */
    	public void copyResources() throws IOException {
    		copyResource(STYLESHEET);
    		copyResource("report.gif");
    		copyResource("group.gif");
    		copyResource("bundle.gif");
    		copyResource("package.gif");
    		copyResource("source.gif");
    		copyResource("class.gif");
    		copyResource("method.gif");
    		copyResource("session.gif");
    		copyResource("sort.gif");
    		copyResource("up.gif");
    		copyResource("down.gif");
    		copyResource("branchfc.gif");
    		copyResource("branchnc.gif");
    		copyResource("branchpc.gif");
    		copyResource(REDBAR);
    		copyResource(GREENBAR);
    		copyResource(PRETTIFY_STYLESHEET);
    		copyResource(PRETTIFY_SCRIPT);
    		copyResource(SORT_SCRIPT);
    	}

    	private void copyResource(final String name) throws IOException {
    		final InputStream in = Resources.class.getResourceAsStream(name);
    		final OutputStream out = folder.createFile(name);
    		final byte[] buffer = new byte[256];
    		int len;
    		while ((len = in.read(buffer)) != -1) {
    			out.write(buffer, 0, len);
    		}
    		in.close();
    		out.close();
    	}

    }