/*******************************************************************************
* 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.item;
import java.util.Collection;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.item.ICmsisVisitor.VisitResult;
/**
* Base class for all CMSIS items
*/
public class CmsisItem implements ICmsisItem {
protected String fTag = CmsisConstants.EMPTY_STRING;
protected String fText = CmsisConstants.EMPTY_STRING;
protected volatile Object[] cachedChildArray = null;
/**
* Default constructor
*/
public CmsisItem() {
}
@Override
public void clear() {
cachedChildArray = null;
}
@Override
public void destroy() {
clear();
fTag = null;
fText = null;
}
@Override
public boolean purge() {
return false; // default does nothing
}
@Override
public Object getParent() {
return null; // default has no parent
}
@Override
public String getTag() {
return fTag;
}
@Override
public void setTag(String tag) {
fTag = tag;
}
@Override
public String getText() {
return fText;
}
@Override
public void setText(String text) {
fText = text;
}
@Override
public String getName() {
return getTag();
}
@Override
public String getEffectiveName() {
return getName();
}
@Override
public String getDescription() {
return getText();
}
@Override
public String getUrl() {
return null;
}
@Override
public String getDoc() {
return null;
}
@Override
public Collection<? extends ICmsisItem> getChildren() {
// default has no children
return null;
}
@Override
public boolean isExclusive() {
return false; // default is non-exclusive
}
@Override
public boolean hasChildren() {
Collection<? extends ICmsisItem> collection = getChildren();
return collection != null && !collection.isEmpty();
}
@Override
public int getChildCount() {
Collection<? extends ICmsisItem> collection = getChildren();
if(collection != null) {
return collection.size();
}
return 0;
}
@Override
public synchronized Object[] getChildArray() {
if(cachedChildArray == null) {
cachedChildArray = createChildArray();
}
return cachedChildArray;
}
/**
* Create child array that in general can be different than actual children.
* Default creates array out of child collection
* @return created array
*/
protected Object[] createChildArray() {
Collection<? extends ICmsisItem> collection = getChildren();
if(collection != null) {
return collection.toArray();
}
return EMPTY_OBJECT_ARRAY;
}
@Override
public VisitResult accept(ICmsisVisitor visitor) {
if(visitor == null) {
return VisitResult.CANCEL;
}
switch( visitor.visit(this)) {
case CANCEL:
return VisitResult.CANCEL;
case SKIP_CHILDREN:
return VisitResult.CONTINUE; // skip children, but parent should continue
case SKIP_LEVEL:
return VisitResult.SKIP_CHILDREN; // instruct parent to skip its remaining children
default:
break;
}
// process children
return accept(visitor, getItemsToVisit());
}
/**
* Returns collection of items to visit
* @return collection of items to visit
*/
protected Collection<? extends ICmsisItem> getItemsToVisit(){
// default returns children
return getChildren();
}
/**
* Visit collection of items (usually children)
* @param visitor ICmsisVisitor to visit
* @param items collection
* @return VisitResult
*/
protected VisitResult accept(ICmsisVisitor visitor, Collection<? extends ICmsisItem> items) {
if(items != null) {
for(ICmsisItem item : items){
VisitResult result = VisitResult.CONTINUE;
if(item != null) {
result = item.accept(visitor);
} else {
result = visitor.visit(null);
}
switch( result) {
case CANCEL:
return VisitResult.CANCEL;
case SKIP_CHILDREN:
case SKIP_LEVEL:
return VisitResult.CONTINUE; // skip children, but parent should continue
default:
break;
}
}
}
return VisitResult.CONTINUE;
}
}