/*******************************************************************************
* Copyright (c) 2015 ARM Ltd. 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:
* ARM Ltd and ARM Germany GmbH - Initial API and implementation
*******************************************************************************/
package com.arm.cmsis.pack.rte.packs;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.data.CpPack;
import com.arm.cmsis.pack.data.CpPackFilter;
import com.arm.cmsis.pack.data.ICpItem;
import com.arm.cmsis.pack.data.ICpPack;
import com.arm.cmsis.pack.data.ICpPackCollection;
import com.arm.cmsis.pack.data.ICpPackFamily;
import com.arm.cmsis.pack.data.ICpPackFilter;
import com.arm.cmsis.pack.enums.EVersionMatchMode;
import com.arm.cmsis.pack.generic.IAttributes;
import com.arm.cmsis.pack.info.CpPackFilterInfo;
import com.arm.cmsis.pack.info.CpPackInfo;
import com.arm.cmsis.pack.info.ICpPackFilterInfo;
import com.arm.cmsis.pack.info.ICpPackInfo;
import com.arm.cmsis.pack.utils.AlnumComparator;
/**
* Class that encapsulates filtered and ordered collection of Packs
*
*/
public class RtePackCollection extends RtePackItem implements IRtePackCollection {
protected ICpPackCollection fPackCollection = null;
protected Map<String, IRtePackFamily> fPackFamilies = new TreeMap<String, IRtePackFamily>(new AlnumComparator(false, false));
Map<String, ICpPackInfo> fUsedPacks = null;
boolean fbUseAllLatest = true;
public RtePackCollection() {
super(null);
}
@Override
public void clear() {
super.clear();
fPackFamilies = null;
fUsedPacks = null;
fPackCollection = null;
}
@Override
public boolean purge() {
if(fPackFamilies != null && ! fPackFamilies.isEmpty()) {
for (Iterator<IRtePackFamily> iterator = fPackFamilies.values().iterator(); iterator.hasNext();) {
IRtePackFamily family = iterator.next();
if(family.purge()) {
iterator.remove();
}
}
}
return false;
}
@Override
public IRtePackCollection getRoot() {
return this;
}
@Override
public String getId() {
if(fPackCollection != null)
return fPackCollection.getId();
return null;
}
@Override
public void setPackFilterInfo(ICpPackFilterInfo packFilterInfo) {
if(packFilterInfo == null)
return;
fbUseAllLatest = packFilterInfo.isUseAllLatestPacks();
// set version match modes and selection
Collection<? extends ICpItem> children = packFilterInfo.getChildren();
if(children == null)
return;
for(ICpItem item : children){
if(!(item instanceof ICpPackInfo))
continue;
addCpItem(item);
ICpPackInfo packInfo = (ICpPackInfo)item;
String familyId = packInfo.getPackFamilyId();
IRtePackFamily packFamily = getRtePackFamily(familyId);
EVersionMatchMode mode = packInfo.getVersionMatchMode();
// first select packs with fixed version to avoid auto-selection
if(mode == EVersionMatchMode.FIXED){
String version = packInfo.getVersion();
IRtePack pack = packFamily.getRtePack(version);
pack.setSelected(true);
}
packFamily.setVersionMatchMode(mode);
}
}
@Override
public void addCpItem(ICpItem item) {
if(item == null)
return;
if(item instanceof ICpPackFilterInfo || item instanceof ICpPackCollection) {
if(item instanceof ICpPackCollection )
fPackCollection = (ICpPackCollection)item;
Collection<? extends ICpItem> children = item.getChildren();
if(children == null)
return;
for(ICpItem child : children){
addCpItem(child);
}
} else {
addRtePackFamily(item);
}
}
protected void addRtePackFamily(ICpItem item) {
if(item instanceof ICpPackFamily || item instanceof ICpPack || item instanceof ICpPackInfo) {
String familyId = CpPack.familyFromId(item.getId());
IRtePackFamily rtePackFamily = ensurePackFamily(familyId);
rtePackFamily.addCpItem(item);
}
}
protected IRtePackFamily ensurePackFamily(String familyId) {
IRtePackFamily rtePackFamily = getRtePackFamily(familyId);
if(rtePackFamily == null) {
rtePackFamily = new RtePackFamily(this, familyId);
fPackFamilies.put(familyId, rtePackFamily);
}
return rtePackFamily;
}
@Override
public ICpItem getCpItem() {
return fPackCollection;
}
@Override
public boolean isSelected() {
for(IRtePackFamily f : fPackFamilies.values()) {
if(f.isSelected())
return true;
}
return false;
}
@Override
public boolean isUsed() {
for(IRtePackFamily f : fPackFamilies.values()) {
if(f.isUsed())
return true;
}
return false;
}
@Override
public boolean isInstalled() {
if(fPackFamilies.isEmpty())
return false;
for(IRtePackFamily f : fPackFamilies.values()) {
if(!f.isInstalled())
return false;
}
return true;
}
@Override
public boolean isExcluded() {
return false;
}
@Override
public Object[] getChildArray() {
return fPackFamilies.values().toArray();
}
@Override
public boolean hasChildren() {
return !fPackFamilies.isEmpty();
}
@Override
public int getChildCount() {
return fPackFamilies.size();
}
@Override
public boolean isUseAllLatestPacks() {
return fbUseAllLatest;
}
@Override
public void setUseAllLatestPacks(boolean bUseLatest) {
fbUseAllLatest = bUseLatest;
if(fbUseAllLatest)
return;
// select all used packs as fixed and all other as excluded
for(IRtePackFamily f : fPackFamilies.values()) {
if(f.isUsed())
f.setVersionMatchMode(EVersionMatchMode.FIXED);
else
f.setVersionMatchMode(EVersionMatchMode.EXCLUDED);
}
}
@Override
public IRtePackFamily getRtePackFamily(String familyId) {
return fPackFamilies.get(familyId);
}
@Override
public String getVersion() {
return CmsisConstants.EMPTY_STRING;
}
@Override
public IRtePackItem getFirstChild() {
if(!fPackFamilies.isEmpty())
return fPackFamilies.entrySet().iterator().next().getValue();
return null;
}
@Override
public ICpPackFilter createPackFiler() {
CpPackFilter filter = new CpPackFilter();
filter.setUseAllLatestPacks(fbUseAllLatest);
if(fbUseAllLatest)
return filter;
for(IRtePackFamily f : fPackFamilies.values()) {
String familyId = f.getId();
Set<String> versions = null;
switch(f.getVersionMatchMode()){
case FIXED:
versions = f.getSelectedVersions();
case LATEST:
filter.setFixed(familyId, versions);
break;
case EXCLUDED:
filter.setExcluded(familyId, true);
break;
default:
break;
}
}
return filter;
}
@Override
public ICpPackFilterInfo createPackFilterInfo() {
CpPackFilterInfo filterInfo = new CpPackFilterInfo(null);
filterInfo.setUseAllLatestPacks(fbUseAllLatest);
if(!fbUseAllLatest) {
for(IRtePackFamily f : fPackFamilies.values()) {
EVersionMatchMode mode = f.getVersionMatchMode();
switch(mode){
case EXCLUDED:
continue;
case LATEST:
ICpPackInfo info = new CpPackInfo(filterInfo, f.getAttributes());
info.setVersionMatchMode(mode);
filterInfo.addChild(info);
continue;
case FIXED:
break;
}
Collection<IRtePack> packs = f.getSelectedPacks();
for(IRtePack p : packs){
ICpPackInfo info = null;
ICpPack pack = p.getPack();
if(pack != null)
info = new CpPackInfo(filterInfo, pack);
else
info = new CpPackInfo(filterInfo, p.getAttributes());
info.setVersionMatchMode(mode);
filterInfo.addChild(info);
}
}
}
return filterInfo;
}
@Override
public void setUsedPacks(Map<String, ICpPackInfo> usedPackInfos) {
fUsedPacks = usedPackInfos;
// ensure all items exist
if(fUsedPacks != null && !fUsedPacks.isEmpty()) {
for(Entry<String, ICpPackInfo> e : usedPackInfos.entrySet()){
addCpItem(e.getValue());
}
}
}
@Override
public boolean isPackUsed(String id) {
if(fUsedPacks == null || fUsedPacks.isEmpty())
return false;
return fUsedPacks.containsKey(id);
}
@Override
public IAttributes getAttributes() {
return null;
}
}