/*******************************************************************************
 * Copyright (c) 2009 Martin Lippert and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0.
 *
 * Contributors:
 *     Martin Lippert - initial implementation
 *     Martin Lippert - caching of generated classes
 *******************************************************************************/

package org.eclipse.equinox.weaving.internal.caching;

import java.util.Map;

/**
 * A CacheItem contains the necessary information to store the cached bytecode
 * of a class to the cache disk storage.
 *
 * @author Martin Lippert
 */
public class CacheItem {

	private final byte[] cachedBytes;

	private final String directory;

	private final Map<String, byte[]> generatedClasses;

	private final String name;

	/**
	 * Create a new item to be cached
	 * 
	 * @param cachedBytes The bytes to be written to the cache
	 * @param directory   The directory to where the bytes should be stored
	 * @param name        The name of the file to store the bytes in
	 */
	public CacheItem(final byte[] cachedBytes, final String directory, final String name) {
		this(cachedBytes, directory, name, null);
	}

	/**
	 * Create a new item to be cached
	 * 
	 * @param cachedBytes      The bytes to be written to the cache
	 * @param directory        The directory to where the bytes should be stored
	 * @param name             The name of the file to store the bytes in
	 * @param generatedClasses The generated classes that should be stored together
	 *                         with this item (className -> bytecode)
	 */
	public CacheItem(final byte[] cachedBytes, final String directory, final String name,
			final Map<String, byte[]> generatedClasses) {
		this.cachedBytes = cachedBytes;
		this.directory = directory;
		this.name = name;
		this.generatedClasses = generatedClasses;
	}

	/**
	 * @return The bytes to be written to the cache under the given name
	 */
	public byte[] getCachedBytes() {
		return cachedBytes;
	}

	/**
	 * @return The directory in which the item should be stored
	 */
	public String getDirectory() {
		return directory;
	}

	/**
	 * @return A map containing the generated classes (name -> bytecode) for this
	 *         item or null, if there are no generated classes with this one
	 */
	public Map<String, byte[]> getGeneratedClasses() {
		return generatedClasses;
	}

	/**
	 * @return The name of the file to be written to the cache
	 */
	public String getName() {
		return name;
	}

}
