/*******************************************************************************
* 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.components;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.data.ICpComponent;
import com.arm.cmsis.pack.data.ICpItem;
import com.arm.cmsis.pack.data.ICpTaxonomy;
import com.arm.cmsis.pack.enums.EComponentAttribute;
import com.arm.cmsis.pack.enums.EEvaluationResult;
import com.arm.cmsis.pack.generic.IAttributes;
import com.arm.cmsis.pack.info.ICpComponentInfo;
import com.arm.cmsis.pack.rte.RteConstants;
import com.arm.cmsis.pack.utils.AlnumComparator;
/**
*
*/
public class RteComponentGroup extends RteComponentItem implements IRteComponentGroup{
protected Map<String, ICpComponent> fApis = null; // api collection sorted by version
protected String fActiveApiVersion = null;
protected boolean fbUseLatesApi = true;
/**
* @param parent
*/
public RteComponentGroup(IRteComponentItem parent, String name) {
super(parent, name);
fComponentAttribute = EComponentAttribute.CSUB;
fbExclusive = false;
}
@Override
public IRteComponentGroup getParentGroup() {
return this;
}
@Override
public ICpItem getCpItem() {
ICpComponent api = getApi();
if(api != null) {
return api;
}
return super.getCpItem();
}
@Override
public String getEffectiveName() {
String name = super.getEffectiveName();
if(fApis != null && !fApis.isEmpty())
name += " (API)"; //$NON-NLS-1$
return name;
}
@Override
public IRteComponentItem getEffectiveItem() {
if(fApis == null || fApis.isEmpty()) {
if(getChildCount() == 1) {
IRteComponentItem child = fChildMap.entrySet().iterator().next().getValue();
String childName = child.getName();
if(childName.isEmpty() || childName.equals(getName()))
return child;
}
}
return super.getEffectiveItem();
}
@Override
public void addCpItem(ICpItem cpItem) {
if(cpItem instanceof ICpComponent) {
ICpComponent c = (ICpComponent)cpItem;
if( c.isApi())
addApi(c);
else
addComponent(c, RteConstants.NONE);
} else if (cpItem instanceof ICpTaxonomy ){
String csub = cpItem.getAttribute(CmsisConstants.CSUB);
if( csub != null && !csub.isEmpty()) {
// add component using subName as a key
IRteComponentItem component = getChild(csub);
if(component != null) {
component.addCpItem(cpItem);
}
} else if(getTaxonomy() == null){
fTaxonomy = cpItem;
}
}
}
@Override
public void addComponent(ICpComponent cpComponent, int flags) {
if(cpComponent.isApi()) {
addApi(cpComponent);
return;
}
String componentName = cpComponent.getAttribute(CmsisConstants.CSUB);
// add component using subName as a key
IRteComponentItem component = getChild(componentName);
if(component == null) {
component = new RteComponent(this, componentName);
addChild(component);
}
component.addComponent(cpComponent, flags);
}
/**
* Adds an API item to this group
* @param cpApi ICpApi item
*/
protected void addApi(ICpComponent cpApi) {
String groupName = cpApi.getAttribute(CmsisConstants.CGROUP);
if(!groupName.equals(getName()))
return;
ICpComponentInfo apiInfo = null;
if(cpApi instanceof ICpComponentInfo) {
apiInfo = (ICpComponentInfo)cpApi;
}
String version = null;
if(apiInfo == null || apiInfo.isVersionFixed())
version = cpApi.getVersion();
ICpComponent existingApi = getApi(version);
if(existingApi == null) {
if(fApis == null)
fApis = new TreeMap<String, ICpComponent>(new AlnumComparator());
fApis.put(cpApi.getVersion(), cpApi);
}
if(apiInfo != null) {
if(existingApi == null || existingApi instanceof ICpComponentInfo) {
apiInfo.setComponent(null);
apiInfo.setEvaluationResult(EEvaluationResult.MISSING_API);
} else {
apiInfo.setComponent(existingApi);
}
setActiveApi(version);
}
}
@Override
public ICpComponent getApi( final String version){
if(fApis != null) {
if(version == null)
return fApis.entrySet().iterator().next().getValue();
return fApis.get(version);
}
return null;
}
@Override
public ICpComponent getApi() {
return getApi(getActiveApiVersion());
}
@Override
public Map<String, ICpComponent> getApis() {
return fApis;
}
@Override
public String getActiveApiVersion() {
if(fApis != null && fActiveApiVersion == null ) {
fActiveApiVersion = fApis.entrySet().iterator().next().getKey();
}
return fActiveApiVersion;
}
@Override
public boolean setActiveApi(final String version) {
if(fApis == null)
return false;
String newVersion = version;
if(version == null || version.equals(getDefaultVersion())) {
newVersion = fApis.entrySet().iterator().next().getKey();
fbUseLatesApi = true;
} else {
fbUseLatesApi = false;
}
String activeApiVersion = getActiveApiVersion();
if(activeApiVersion.equals(newVersion))
return false;
fActiveApiVersion = newVersion;
return true;
}
@Override
public IRteComponentGroup getGroup(IAttributes attributes) {
if(attributes.getAttribute(CmsisConstants.CGROUP, CmsisConstants.EMPTY_STRING).equals(getName()))
return this;
return null;
}
@Override
public Collection<String> getVersionStrings() {
if(fApis != null && !fApis.isEmpty())
return fApis.keySet();
return super.getVersionStrings();
}
@Override
public String getActiveVersion() {
if(fApis != null && !fApis.isEmpty())
return getActiveApiVersion();
return super.getActiveVersion();
}
@Override
public void setActiveVersion(String version) {
if(fApis != null && !fApis.isEmpty())
setActiveApi(version);
else
super.setActiveVersion(version);
}
@Override
public boolean isUseLatestVersion() {
if(fApis != null && !fApis.isEmpty())
return fbUseLatesApi;
return super.isUseLatestVersion();
}
}