/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.xpathchooser.model;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Simplified representation of an XSD element. An XSD element only has a name, sub-Elements and/or Attributes. All other XSD elements are
* removed.
*
* @author Heinrich Wendel
* @author Arne Bachmann
* @author Markus Kunde
*/
public class XSDElement extends AbstractXSDValueHolder {
/**
* Reuse.
*/
public static final String[] EMPTY_STRING = new String[0];
/**
* Inheritable.
*/
private static final long serialVersionUID = -6618584152825821109L;
/**
* List of subelements.
*/
private List<XSDElement> elements = new ArrayList<XSDElement>();
/**
* List of attributes.
*/
private List<XSDAttribute> attributes = new ArrayList<XSDAttribute>();
/**
* Contains the currently selected attribute (or custom value).
*/
private String idAttribute = null;
/**
* The currently selected attribute value.
*/
private String idValue = null;
/**
* Contains the names of all uid attribute values in the document (or custom values).
*/
private Map<String, Set<String>> idValues = new Hashtable<String, Set<String>>();
/**
* Construct a new XSDElement by name and parent.
*
* @param name The name to set.
* @param parent The parent to set.
*/
public XSDElement(XSDElement parent, String name) {
super(parent, name);
}
/**
* Returns the elements.
*
* @return Returns the elements.
*/
public List<XSDElement> getElements() {
return elements;
}
/**
* The elements to set.
*
* @param theElements The elements to set.
*/
public void setElements(final List<XSDElement> theElements) {
elements = theElements;
}
/**
* Returns the attributes.
*
* @return Returns the attributes.
*/
public List<XSDAttribute> getAttributes() {
return attributes;
}
/**
* The attributes to set.
*
* @param theAttributes The attributes to set.
*/
public void setAttributes(final List<XSDAttribute> theAttributes) {
attributes = theAttributes;
}
/**
* {@inheritDoc}
*
* @see de.rcenvironment.core.gui.xpathchooser.model.XSDTreeItem#getPath()
*/
@Override
public String getPath() {
if (getParent() == null) {
return "/" + name;
}
return getParent().getPath() + "/" + name;
}
/**
* Get the currently set attribute name.
*
* @return The attribute name from the document or a custom value
*/
public String getCurrentAttributeName() {
return idAttribute;
}
/**
* GEt the currently set attribute value.
*
* @return The attribute value from the document or a custom value
*/
public String getCurrentAttributeValue() {
return idValue;
}
/**
* Set the current attribute name.
*
* @param value The value to set
*/
public void setCurrentAttributeName(final String value) {
idAttribute = value.intern();
}
/**
* Set the current attribute value.
*
* @param value The value to set
*/
public void setCurrentAttributeValue(final String value) {
idValue = value.intern();
}
/**
* Get all available attribute names for the selected element in the document. If a custom name was provided by the user, it is included
* in the return array.
*
* @return The set of all attribute names in the document plus the user input
*/
public String[] getAttributeNames() {
final Set<String> names = new HashSet<String>();
names.addAll(idValues.keySet());
if (idAttribute != null) {
names.add(idAttribute);
}
return names.toArray(EMPTY_STRING);
}
/**
* Get all values for the currently set attribute name in the document. If a custom value was provided by the user, it is included in
* the return array.
*
* @return The set of all attribute values in the document plus the user input, or just the user input if the attribute name is also
* custom
*/
public String[] getAttributeValues() {
if (idValues.containsKey(idAttribute)) {
final Set<String> values = new HashSet<String>();
values.addAll(idValues.get(idAttribute));
if (idValue != null) {
values.add(idValue);
}
return values.toArray(EMPTY_STRING);
}
return new String[] { idValue };
}
/**
* When modifying the model, this needs to be set here.
*
* @param name The new name to set
*/
public void setAttributeName(final String name) {
if ((name == null) || name.equals("")) {
setCurrentAttributeName("");
return;
}
if (!idValues.containsKey(name)) {
idValues.put(name, new LinkedHashSet<String>());
}
setCurrentAttributeName(name);
// always add "current value" to values when changing attribute name first
if ((idValue != null) && !idValue.equals("")) {
idValues.get(idAttribute).add(idValue);
}
}
/**
* When modifying the model, this needs to be set here.
*
* @param value The value to set for the current attribute name
*/
public void setAttributeValue(final String value) {
if ((value == null) || value.equals("")) {
setCurrentAttributeValue("");
return;
}
if (!idValues.containsKey(idAttribute)) {
idValues.put(idAttribute, new LinkedHashSet<String>());
}
setCurrentAttributeValue(value);
idValues.get(idAttribute).add(idValue);
}
/**
* When lazily creating meta data, we need to set all allowed values on the attribute.
*
* @param name The attribute name
* @param values The allowed values
*/
public void setAttributeValues(final String name, final Set<String> values) {
if (!idValues.containsKey(name)) {
idValues.put(name, new HashSet<String>());
}
idValues.get(name).addAll(values);
}
}