/*******************************************************************************
 * 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));
	}
}
