/******************************************************************************* * Copyright (c) 2010, 2011 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.osgi.internal.baseadaptor.weaving; import java.util.*; import org.eclipse.osgi.internal.resolver.StateBuilder; import org.eclipse.osgi.service.resolver.ImportPackageSpecification; import org.eclipse.osgi.util.ManifestElement; import org.osgi.framework.Constants; /** * 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<String>(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(); validateSyntax(element); return imports.set(index, element); } @Override public void add(int index, String element) { wovenClass.checkPermission(); validateSyntax(element); imports.add(index, element); } @Override public String remove(int index) { wovenClass.checkPermission(); return imports.remove(index); } private void validateSyntax(String imported) { // validate the syntax of imports that are added. ManifestElement[] importElements; try { importElements = ManifestElement.parseHeader(Constants.IMPORT_PACKAGE, imported); // validate the syntax is correct StateBuilder.checkImportExportSyntax(Constants.IMPORT_PACKAGE, importElements, false, false, false); // validate we can create an import spec out of it. List<ImportPackageSpecification> dynamicImportSpecs = new ArrayList<ImportPackageSpecification>(importElements.length); for (ManifestElement dynamicImportElement : importElements) StateBuilder.addImportPackages(dynamicImportElement, dynamicImportSpecs, 2, true); } catch (Throwable t) { IllegalArgumentException exception = new IllegalArgumentException(); exception.initCause(t); throw exception; } return; } }