/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.navigator.decorator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IConfigurationElement;
import org.jboss.tools.common.model.XModelObject;
/**
* @author Viacheslav Kabanovich
*/
public class XModelObjectDecorator implements DecoratorConstants {
String name;
String partition;
Set<String> entities = new HashSet<String>();
Variable[] variables = new Variable[0];
Map<String, Variable> variableByName = new HashMap<String, Variable>();
String defaultValue;
String value;
List<IDecoratorPart> parts = null;
XModelObject[] examples = new XModelObject[0];
public XModelObjectDecorator() {}
public String getName() {
return name;
}
public String getPartition() {
return partition;
}
public Set<String> getEntities() {
return entities;
}
public Variable[] getVariables() {
return variables;
}
public Variable getVariableByName(String name) {
return variableByName.get(name);
}
public XModelObject[] getExamples() {
return examples;
}
public String getDefaultValue() {
return defaultValue;
}
public String getValue() {
return value;
}
public void setValue(String value) {
if(value != null && value.equals(this.value)) {
return;
}
this.value = value;
if(value == null || value.length() == 0) {
value = Variable.NAME.getRuleText();
}
parts = null;
}
void load(IConfigurationElement element) {
name = element.getAttribute(ATTR_NAME);
partition = element.getAttribute(ATTR_PARTITION);
defaultValue = element.getAttribute(ATTR_DEFAULT);
setValue(defaultValue);
value = defaultValue;
String s = element.getAttribute(ATTR_ENTITIES);
if(s != null) {
String[] es = s.split(","); //$NON-NLS-1$
for (int i = 0; i < es.length; i++) entities.add(es[i]);
}
IConfigurationElement[] cs = element.getChildren(NODE_VARIABLE);
List<Variable> vs = new ArrayList<Variable>();
vs.add(Variable.NAME);
variableByName.put(Variable.NAME.getName(), Variable.NAME);
for (int i = 0; i < cs.length; i++) {
Variable v = new Variable();
v.load(cs[i]);
vs.add(v);
variableByName.put(v.getName(), v);
}
variables = vs.toArray(new Variable[0]);
List<XModelObject> es = new ArrayList<XModelObject>();
cs = element.getChildren(NODE_EXAMPLE);
for (int i = 0; i < cs.length; i++) {
XModelObject o = Example.load(cs[i]);
if(o != null) es.add(o);
}
examples = es.toArray(new XModelObject[0]);
}
List<IDecoratorPart> compile() {
if(this.parts != null) return this.parts;
List<IDecoratorPart> parts = new ArrayList<IDecoratorPart>();
String v = value;
if(value == null || value.length() == 0) v = defaultValue;
if(v == null) v = ""; //$NON-NLS-1$
if(v.indexOf(RULE_OPENING) < 0) {
if(v.length() > 0) v = " " + v; //$NON-NLS-1$
v = Variable.NAME.getRuleText() + v;
}
StringTokenizer s = new StringTokenizer(v, RULE_OPENING + RULE_CLOSING, true);
boolean inVariable = false;
while(s.hasMoreTokens()) {
String t = s.nextToken();
if(t.equals(RULE_OPENING)) {
inVariable = true;
} else if(t.equals(RULE_CLOSING)) {
inVariable = false;
} else if(inVariable) {
String n = t;
String p = ""; //$NON-NLS-1$
int i = t.indexOf('(');
int j = t.indexOf(')');
if(i >= 0 && j > i) {
n = t.substring(0, i);
p = t.substring(i + 1, j);
}
Variable variable = getVariableByName(n);
if(variable == Variable.NAME) {
parts.add(NameDecoratorPart.INSTANCE);
} else if(variable != null){
AttributeDecoratorPart part = new AttributeDecoratorPart(variable);
part.setParameters(p);
parts.add(part);
} else {
parts.add(new DecoratorPart(RULE_OPENING + t + RULE_CLOSING));
}
} else {
parts.add(new DecoratorPart(t));
}
}
boolean hasSignificantPart = false;
for (IDecoratorPart p: parts) {
if(p != NameDecoratorPart.INSTANCE && !(p instanceof AttributeDecoratorPart)) continue;
hasSignificantPart = true;
break;
}
if(!hasSignificantPart) {
parts.add(NameDecoratorPart.INSTANCE);
}
return this.parts = parts;
}
public String getLabel(XModelObject object) {
List<IDecoratorPart> parts = compile();
StringBuffer sb = new StringBuffer();
for (IDecoratorPart d: parts) {
sb.append(d.getLabelPart(object));
}
String s = sb.toString().trim();
if(s.length() == 0) s = object.getPresentationString();
return s;
}
/**
* Needed only to work with value
* @return
*/
public XModelObjectDecorator getWorkingCopy() {
XModelObjectDecorator copy = new XModelObjectDecorator();
copy.name = name;
copy.partition = partition;
copy.defaultValue = defaultValue;
copy.value = value;
copy.entities = entities;
copy.variables = variables;
copy.variableByName = variableByName;
return copy;
}
}