1 /*******************************************************************************
2  * Copyright (c) 2008, 2017 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *     Cloudsmith Inc. - query indexes
14  *******************************************************************************/
15 package org.eclipse.equinox.internal.p2.director;
16 
17 import java.util.Iterator;
18 import java.util.List;
19 import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils;
20 import org.eclipse.equinox.internal.p2.metadata.InstallableUnit;
21 import org.eclipse.equinox.internal.p2.metadata.TranslationSupport;
22 import org.eclipse.equinox.internal.p2.metadata.index.*;
23 import org.eclipse.equinox.p2.metadata.IInstallableUnit;
24 import org.eclipse.equinox.p2.metadata.KeyWithLocale;
25 import org.eclipse.equinox.p2.metadata.index.IIndex;
26 
27 public class QueryableArray extends IndexProvider<IInstallableUnit> {
28 	private final List<IInstallableUnit> dataSet;
29 	private IIndex<IInstallableUnit> capabilityIndex;
30 	private IIndex<IInstallableUnit> idIndex;
31 	private TranslationSupport translationSupport;
32 
QueryableArray(IInstallableUnit[] ius)33 	public QueryableArray(IInstallableUnit[] ius) {
34 		dataSet = CollectionUtils.unmodifiableList(ius);
35 	}
36 
37 	@Override
everything()38 	public Iterator<IInstallableUnit> everything() {
39 		return dataSet.iterator();
40 	}
41 
42 	@Override
getIndex(String memberName)43 	public synchronized IIndex<IInstallableUnit> getIndex(String memberName) {
44 		if (InstallableUnit.MEMBER_PROVIDED_CAPABILITIES.equals(memberName)) {
45 			if (capabilityIndex == null)
46 				capabilityIndex = new CapabilityIndex(dataSet.iterator());
47 			return capabilityIndex;
48 		}
49 		if (InstallableUnit.MEMBER_ID.equals(memberName)) {
50 			if (idIndex == null)
51 				idIndex = new IdIndex(dataSet.iterator());
52 			return idIndex;
53 		}
54 		return null;
55 	}
56 
57 	@Override
getManagedProperty(Object client, String memberName, Object key)58 	public synchronized Object getManagedProperty(Object client, String memberName, Object key) {
59 		if (!(client instanceof IInstallableUnit))
60 			return null;
61 		IInstallableUnit iu = (IInstallableUnit) client;
62 		if (InstallableUnit.MEMBER_TRANSLATED_PROPERTIES.equals(memberName)) {
63 			if (translationSupport == null)
64 				translationSupport = new TranslationSupport(this);
65 			return key instanceof KeyWithLocale ? translationSupport.getIUProperty(iu, (KeyWithLocale) key) : translationSupport.getIUProperty(iu, key.toString());
66 		}
67 		return null;
68 	}
69 }
70