/*******************************************************************************
 * Copyright (c) 2010, 2016 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.osgi.internal.weaving;

import java.util.*;
import org.eclipse.osgi.util.ManifestElement;
import org.osgi.framework.Constants;
import org.osgi.framework.PackagePermission;

/**
 * A list of DynamicImport-Package statements that are to be used for adding new 
 * dynamic imports to a bundle class loader.
 *
 */
public class DynamicImportList extends AbstractList<String> implements RandomAccess {
	// the collection of valid DynamicImport-Package statments.
	private final List<String> imports = new ArrayList<>(0);
	private final WovenClassImpl wovenClass;

	public DynamicImportList(WovenClassImpl wovenClass) {
		super();
		this.wovenClass = wovenClass;
	}

	@Override
	public String get(int index) {
		return imports.get(index);
	}

	@Override
	public int size() {
		return imports.size();
	}

	@Override
	public String set(int index, String element) {
		wovenClass.checkPermission();
		validateSyntaxAndCheckPackagePermission(element);
		return imports.set(index, element);
	}

	@Override
	public void add(int index, String element) {
		wovenClass.checkPermission();
		validateSyntaxAndCheckPackagePermission(element);
		imports.add(index, element);
	}

	@Override
	public String remove(int index) {
		wovenClass.checkPermission();
		return imports.remove(index);
	}

	private void validateSyntaxAndCheckPackagePermission(String dynamicImportPackageDescription) {
		ManifestElement[] clauses;
		// Validate the syntax of imports that are added.
		try {
			clauses = ManifestElement.parseHeader(Constants.IMPORT_PACKAGE, dynamicImportPackageDescription);
		} catch (Exception e) {
			throw new IllegalArgumentException(e);
		}
		SecurityManager sm = System.getSecurityManager();
		if (sm == null)
			return;
		// Security is enabled. Ensure the weaver has import package permission
		// for each dynamic import added.
		for (ManifestElement clause : clauses)
			for (String pkg : clause.getValueComponents())
				sm.checkPermission(new PackagePermission(pkg, PackagePermission.IMPORT));
	}
}
