/*******************************************************************************
* 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.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.data.ICpItem;
import com.arm.cmsis.pack.data.ICpPack;
import com.arm.cmsis.pack.data.ICpPackFamily;
import com.arm.cmsis.pack.enums.EVersionMatchMode;
import com.arm.cmsis.pack.generic.IAttributes;
import com.arm.cmsis.pack.info.ICpPackInfo;
import com.arm.cmsis.pack.utils.VersionComparator;
/**
*
*/
public class RtePackFamily extends RtePackItem implements IRtePackFamily {
protected String fId = null;
protected Map<String, IRtePack> fPacks = new TreeMap<String, IRtePack>(new VersionComparator());
protected EVersionMatchMode fVersionMatchMode = EVersionMatchMode.EXCLUDED; // until pack filter says other way
protected ICpPackFamily fPackFamily = null;
public RtePackFamily(IRtePackItem parent, ICpPackFamily packFamily) {
this(parent, packFamily.getId());
addCpItem(packFamily);
}
public RtePackFamily(IRtePackItem parent, String id) {
super(parent);
fId = id;
}
@Override
public void clear() {
super.clear();
fPacks = null;
fPackFamily = null;
fId = null;
}
@Override
public boolean purge() {
if(fPacks != null && ! fPacks.isEmpty()) {
for (Iterator<IRtePack> iterator = fPacks.values().iterator(); iterator.hasNext();) {
IRtePack pack = iterator.next();
if(pack.purge()) {
iterator.remove();
}
}
}
if(fPacks == null || fPacks.isEmpty()) {
clear();
return true;
}
return false;
}
@Override
public String getId() {
return fId;
}
@Override
public boolean isSelected() {
for(IRtePack pack : fPacks.values()){
if(pack.isSelected())
return true;
}
return false;
}
protected boolean isExplicitlySelected() {
for(IRtePack pack : fPacks.values()){
if(pack.isExplicitlySelected())
return true;
}
return false;
}
@Override
public IRtePackFamily getFamily() {
return this;
}
@Override
public boolean isUsed() {
for(IRtePack pack : fPacks.values()){
if(pack.isUsed())
return true;
}
return false;
}
@Override
public ICpPack getPack() {
IRtePack rtePack = getLatestRtePack();
if(rtePack != null )
return rtePack.getPack();
return null;
}
@Override
public ICpPackInfo getPackInfo() {
IRtePack rtePack = getLatestRtePack();
if(rtePack != null )
return rtePack.getPackInfo();
return null;
}
@Override
public boolean isInstalled() {
if(fPacks.isEmpty())
return false;
for(IRtePack pack : fPacks.values()){
if(!pack.isInstalled())
return false;
}
return true;
}
@Override
public boolean isExcluded() {
return getVersionMatchMode() == EVersionMatchMode.EXCLUDED;
}
@Override
public EVersionMatchMode getVersionMatchMode() {
if(isUseAllLatestPacks())
return EVersionMatchMode.LATEST;
return fVersionMatchMode;
}
@Override
public void setVersionMatchMode(EVersionMatchMode mode) {
fVersionMatchMode = mode;
if(mode == EVersionMatchMode.FIXED && !isExplicitlySelected()){
IRtePack pack= getLatestRtePack();
if(pack != null)
pack.setSelected(true);
}
}
@Override
public void updateVersionMatchMode() {
if(fVersionMatchMode != EVersionMatchMode.LATEST) {
if(isExplicitlySelected())
fVersionMatchMode = EVersionMatchMode.FIXED;
else
fVersionMatchMode = EVersionMatchMode.EXCLUDED;
}
}
@Override
public IRtePack getLatestRtePack() {
if(fPacks.isEmpty())
return null;
return fPacks.entrySet().iterator().next().getValue();
}
@Override
public IRtePack getRtePack(String version) {
if(version == null || version.isEmpty())
return getLatestRtePack();
return fPacks.get(version);
}
@Override
public IRtePackItem getFirstChild() {
return getLatestRtePack();
}
@Override
public void addCpItem(ICpItem item) {
if(item instanceof ICpPackFamily) {
fPackFamily = (ICpPackFamily)item;
Collection<? extends ICpItem> children = fPackFamily.getChildren();
if(children == null)
return;
for(ICpItem child : children) {
addCpItem(child);
}
} else if(item instanceof ICpPack || item instanceof ICpPackInfo) {
addRtePackItem(item);
}
}
protected void addRtePackItem(ICpItem item) {
String version = item.getVersion();
IRtePack rtePack = getRtePack(version);
if(rtePack == null) {
rtePack = new RtePack(this, item);
fPacks.put(version, rtePack);
} else {
rtePack.addCpItem(item);
}
}
@Override
public ICpItem getCpItem() {
return fPackFamily;
}
@Override
public Object[] getChildArray() {
return fPacks.values().toArray();
}
@Override
public boolean hasChildren() {
return !fPacks.isEmpty();
}
@Override
public int getChildCount() {
return fPacks.size();
}
@Override
public String getVersion() {
switch(getVersionMatchMode()){
case FIXED:
break;
case LATEST:
IRtePackItem rtePack = getLatestRtePack();
if(rtePack != null)
return rtePack.getVersion();
case EXCLUDED:
default:
return CmsisConstants.EMPTY_STRING;
}
String version = CmsisConstants.EMPTY_STRING;
for(IRtePack pack : fPacks.values()){
if(pack.isSelected()) {
if(!version.isEmpty())
version += " ,"; //$NON-NLS-1$
version += pack.getVersion();
}
}
return version;
}
@Override
public Set<String> getSelectedVersions() {
Set<String> versions = new HashSet<String>();
for(IRtePack pack : fPacks.values()){
if(pack.isSelected())
versions.add(pack.getVersion());
}
return versions;
}
@Override
public Collection<IRtePack> getSelectedPacks() {
Collection<IRtePack> packs = new LinkedList<IRtePack>();
for(IRtePack pack : fPacks.values()){
if(pack.isSelected())
packs.add(pack);
}
return packs;
}
@Override
public IAttributes getAttributes() {
IRtePack p = getLatestRtePack();
if(p != null)
return p.getAttributes();
return null;
}
}