/**
*
*/
package org.openntf.domino.design.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import org.openntf.domino.design.XspXmlContent;
import org.openntf.domino.utils.xml.ModifiableStringNodeList;
import org.openntf.domino.utils.xml.XMLNode;
import org.xml.sax.SAXException;
/**
* @author jgallagher
*
*/
// TODO Make the "remove" methods mark the object as unusable in some way
// TODO Verify that null-value is actually legal in XPages
public class FacesConfig extends XspXmlContent implements org.openntf.domino.design.FacesConfig {
@SuppressWarnings("unused")
private static final Logger log_ = Logger.getLogger(FacesConfig.class.getName());
/**
* @param document
* The design note used to represent an existing faces-config.xml file
*/
public FacesConfig(final DatabaseDesign databaseDesign) {
FileResourceWebContent facesConfig = databaseDesign
.getDesignElementByName(FileResourceWebContent.class, "WEB-INF/faces-config.xml");
if (facesConfig != null) {
setContainer(facesConfig);
} else {
facesConfig = new org.openntf.domino.design.impl.FileResourceWebContent(databaseDesign.getAncestorDatabase());
facesConfig.setName("WEB-INF/faces-config.xml");
setContainer(facesConfig);
try {
getXml().loadString("<faces-config/>");
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
}
// /**
// * @param database
// * The database in which to create a new faces-config file
// */
//
// public FacesConfig(final Database database) {
// super(database);
// try {
// getXml().loadString("<faces-config/>");
// } catch (SAXException e) {
// DominoUtils.handleException(e);
// } catch (IOException e) {
// DominoUtils.handleException(e);
// } catch (ParserConfigurationException e) {
// DominoUtils.handleException(e);
// }
// }
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getActionListeners()
*/
@Override
public List<String> getActionListeners() {
return new ModifiableStringNodeList(getXml(), "/faces-config/application", "action-listener");
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#addConverter()
*/
@Override
public org.openntf.domino.design.FacesConfig.Converter addConverter() {
return new Converter(getXml().selectSingleNode("/faces-config").addChildElement("converter"));
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getConverters()
*/
@Override
public List<org.openntf.domino.design.FacesConfig.Converter> getConverters() {
return new ModifiableObjectNodeList<org.openntf.domino.design.FacesConfig.Converter>(this, getXml(), "/faces-config", "converter",
Converter.class);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#addManagedBean()
*/
@Override
public org.openntf.domino.design.FacesConfig.ManagedBean addManagedBean() {
return new ManagedBean(getXml().selectSingleNode("/faces-config").addChildElement("managed-bean"));
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getManagedBeans()
*/
@Override
public List<org.openntf.domino.design.FacesConfig.ManagedBean> getManagedBeans() {
return new ModifiableObjectNodeList<org.openntf.domino.design.FacesConfig.ManagedBean>(this, getXml(), "/faces-config",
"managed-bean", ManagedBean.class);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getMessageBundles()
*/
@Override
public List<String> getMessageBundles() {
return new ModifiableStringNodeList(getXml(), "/faces-config/application", "message-bundle");
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getNavigationHandlers()
*/
@Override
public List<String> getNavigationHandlers() {
return new ModifiableStringNodeList(getXml(), "/faces-config/application", "navigation-handler");
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getPhaseListeners()
*/
@Override
public List<String> getPhaseListeners() {
return new ModifiableStringNodeList(getXml(), "/faces-config/application", "phase-listener");
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getPropertyResolvers()
*/
@Override
public List<String> getPropertyResolvers() {
return new ModifiableStringNodeList(getXml(), "/faces-config/application", "property-resolver");
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getVariableResolvers()
*/
@Override
public List<String> getVariableResolvers() {
return new ModifiableStringNodeList(getXml(), "/faces-config/application", "variable-resolver");
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig#getViewHandlers()
*/
@Override
public List<String> getViewHandlers() {
return new ModifiableStringNodeList(getXml(), "/faces-config/application", "view-handler");
}
public class ManagedBean implements org.openntf.domino.design.FacesConfig.ManagedBean {
private final XMLNode node_;
public ManagedBean(final XMLNode node) {
node_ = node;
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#getName()
*/
@Override
public String getName() {
XMLNode valueNode = node_.selectSingleNode("managed-bean-name");
if (valueNode == null) {
return "";
}
return valueNode.getText();
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#setName(java.lang.String)
*/
@Override
public void setName(final String name) {
XMLNode valueNode = node_.selectSingleNode("managed-bean-name");
if (valueNode == null) {
valueNode = node_.addChildElement("managed-bean-name");
}
valueNode.setText(name);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#getClassName()
*/
@Override
public String getClassName() {
XMLNode valueNode = node_.selectSingleNode("managed-bean-class");
if (valueNode == null) {
return "";
}
return valueNode.getText();
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#setClassName()
*/
@Override
public void setClassName(final String className) {
XMLNode valueNode = node_.selectSingleNode("managed-bean-class");
if (valueNode == null) {
valueNode = node_.addChildElement("managed-bean-class");
}
valueNode.setText(className);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#getScope()
*/
@Override
public Scope getScope() {
XMLNode valueNode = node_.selectSingleNode("managed-bean-scope");
if (valueNode == null) {
return Scope.NONE;
}
try {
return Scope.valueOf(valueNode.getText().toUpperCase());
} catch (IllegalArgumentException iae) {
// This will crop up if the scope has an illegal/unknown value
return Scope.NONE;
}
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#setScope(org.openntf.domino.design.FacesConfig.ManagedBean.Scope)
*/
@Override
public void setScope(final Scope scope) {
XMLNode valueNode = node_.selectSingleNode("managed-bean-scope");
if (valueNode == null) {
valueNode = node_.addChildElement("managed-bean-scope");
}
valueNode.setText(scope.toString().toLowerCase());
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#addProperty()
*/
@Override
public org.openntf.domino.design.FacesConfig.ManagedBean.Property addProperty() {
XMLNode propertyNode = node_.addChildElement("managed-property");
return new Property(propertyNode);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#getProperties()
*/
@Override
public List<org.openntf.domino.design.FacesConfig.ManagedBean.Property> getProperties() {
return new ModifiableObjectNodeList<org.openntf.domino.design.FacesConfig.ManagedBean.Property>(this, node_, "/",
"managed-property", Property.class);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#getListEntries()
*/
@Override
public List<String> getListEntries() {
List<String> result = new ArrayList<String>();
List<XMLNode> nodes = node_.selectNodes("list-entries/value | list-entries/null-value");
for (XMLNode node : nodes) {
if ("value".equals(node.getNodeName())) {
result.add(node.getText());
} else {
result.add(null);
}
}
return Collections.unmodifiableList(result);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#setListEntries(java.util.Collection)
*/
@Override
public void setListEntries(final Collection<?> listEntries) {
XMLNode listEntriesNode = node_.selectSingleNode("list-entries");
String valueClassName = getListValueClassName();
if (listEntriesNode != null) {
node_.removeChild(listEntriesNode);
}
listEntriesNode = node_.addChildElement("list-entries");
XMLNode valueClassNode = listEntriesNode.addChildElement("value-class");
valueClassNode.setText(valueClassName);
for (Object entry : listEntries) {
if (entry == null) {
listEntriesNode.addChildElement("null-value");
} else {
XMLNode valueNode = listEntriesNode.addChildElement("value");
valueNode.setText(String.valueOf(entry));
}
}
// Clear out any map-entries, as they're mutually incompatible with list-entries
XMLNode mapEntries = node_.selectSingleNode("map-entries");
if (mapEntries != null) {
node_.removeChild(mapEntries);
}
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#getValueClassName()
*/
@Override
public String getListValueClassName() {
XMLNode valueNode = node_.selectSingleNode("list-entries/value-class");
if (valueNode == null) {
return "";
}
return valueNode.getText();
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#setValueClassName(java.lang.String)
*/
@Override
public void setListValueClassName(final String className) {
XMLNode valueNode = node_.selectSingleNode("list-entries/value-class");
if (valueNode == null) {
XMLNode listEntries = node_.selectSingleNode("list-entries");
if (listEntries == null) {
listEntries = node_.addChildElement("list-entries");
}
valueNode = listEntries.addChildElement("value-class");
}
valueNode.setText(className);
// Clear out any map-entries, as they're mutually incompatible with list-entries
XMLNode mapEntries = node_.selectSingleNode("map-entries");
if (mapEntries != null) {
node_.removeChild(mapEntries);
}
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#getMapEntries()
*/
@Override
public Map<String, String> getMapEntries() {
Map<String, String> result = new LinkedHashMap<String, String>();
List<XMLNode> mapEntries = node_.selectNodes("map-entries/map-entry");
for (XMLNode entry : mapEntries) {
XMLNode keyNode = entry.selectSingleNode("key");
XMLNode valueNode = entry.selectSingleNode("value | null-value");
if (keyNode != null) {
if (valueNode == null || "null-value".equals(valueNode.getNodeName())) {
result.put(keyNode.getText(), null);
} else {
result.put(keyNode.getText(), valueNode.getText());
}
}
}
return Collections.unmodifiableMap(result);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#setMapEntries(java.util.Map)
*/
@Override
public void setMapEntries(final Map<?, ?> mapEntries) {
XMLNode mapEntriesNode = node_.selectSingleNode("map-entries");
if (mapEntriesNode != null) {
node_.removeChild(mapEntriesNode);
}
mapEntriesNode = node_.addChildElement("map-entries");
for (Map.Entry<?, ?> entry : mapEntries.entrySet()) {
XMLNode entryNode = mapEntriesNode.addChildElement("map-entry");
XMLNode keyNode = entryNode.addChildElement("key");
keyNode.setText(String.valueOf(entry.getKey()));
if (entry.getValue() == null) {
entryNode.addChildElement("null-value");
} else {
XMLNode valueNode = entryNode.addChildElement("value");
valueNode.setText(String.valueOf(entry.getValue()));
}
}
// Clear out any list-entries, as they're mutually incompatible with map-entries
XMLNode listEntries = node_.selectSingleNode("list-entries");
if (listEntries != null) {
node_.removeChild(listEntries);
}
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean#remove()
*/
@Override
public void remove() {
node_.getParentNode().removeChild(node_);
}
public class Property implements org.openntf.domino.design.FacesConfig.ManagedBean.Property {
private final XMLNode node_;
public Property(final XMLNode node) {
node_ = node;
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#getName()
*/
@Override
public String getName() {
XMLNode valueNode = node_.selectSingleNode("property-name");
if (valueNode == null) {
return "";
}
return valueNode.getText();
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#setName(java.lang.String)
*/
@Override
public void setName(final String name) {
XMLNode valueNode = node_.selectSingleNode("property-name");
if (valueNode == null) {
valueNode = node_.addChildElement("property-name");
}
valueNode.setText(name);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#getValue()
*/
@Override
public String getValue() {
XMLNode valueNode = node_.selectSingleNode("null-value");
if (valueNode != null) {
return null;
}
valueNode = node_.selectSingleNode("value");
if (valueNode == null) {
return "";
}
return valueNode.getText();
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#setValue(java.lang.String)
*/
@Override
public void setValue(final String value) {
if (value == null) {
XMLNode valueNode = node_.selectSingleNode("value");
if (valueNode != null) {
node_.removeChild(valueNode);
}
node_.addChildElement("null-value");
} else {
XMLNode nullNode = node_.selectSingleNode("null-value");
if (nullNode != null) {
node_.removeChild(nullNode);
}
XMLNode valueNode = node_.selectSingleNode("value");
if (valueNode == null) {
valueNode = node_.addChildElement("value");
}
valueNode.setText(value);
}
// Clear out any list-entries and map-entries, as they're mutually incompatible with single values
XMLNode listEntries = node_.selectSingleNode("list-entries");
if (listEntries != null) {
node_.removeChild(listEntries);
}
listEntries = node_.selectSingleNode("map-entries");
if (listEntries != null) {
node_.removeChild(listEntries);
}
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#getValueClassName()
*/
@Override
public String getListValueClassName() {
XMLNode valueNode = node_.selectSingleNode("list-entries/value-class");
if (valueNode == null) {
return "";
}
return valueNode.getText();
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#setValueClassName(java.lang.String)
*/
@Override
public void setListValueClassName(final String className) {
XMLNode valueNode = node_.selectSingleNode("list-entries/value-class");
if (valueNode == null) {
XMLNode listEntries = node_.selectSingleNode("list-entries");
if (listEntries == null) {
listEntries = node_.addChildElement("list-entries");
}
valueNode = listEntries.addChildElement("value-class");
}
valueNode.setText(className);
// Clear out any value and map-entries, as they're mutually incompatible with list-entries
XMLNode value = node_.selectSingleNode("value");
if (value != null) {
node_.removeChild(value);
}
value = node_.selectSingleNode("null-value");
if (value != null) {
node_.removeChild(value);
}
value = node_.selectSingleNode("map-entries");
if (value != null) {
node_.removeChild(value);
}
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#getListEntries()
*/
@Override
public List<String> getListEntries() {
List<String> result = new ArrayList<String>();
List<XMLNode> nodes = node_.selectNodes("list-entries/value | list-entries/null-value");
for (XMLNode node : nodes) {
if ("value".equals(node.getNodeName())) {
result.add(node.getText());
} else {
result.add(null);
}
}
return Collections.unmodifiableList(result);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#setListEntries(java.util.Collection)
*/
@Override
public void setListEntries(final Collection<?> listEntries) {
XMLNode listEntriesNode = node_.selectSingleNode("list-entries");
String valueClassName = getListValueClassName();
if (listEntriesNode != null) {
node_.removeChild(listEntriesNode);
}
listEntriesNode = node_.addChildElement("list-entries");
XMLNode valueClassNode = listEntriesNode.addChildElement("value-class");
valueClassNode.setText(valueClassName);
for (Object entry : listEntries) {
if (entry == null) {
listEntriesNode.addChildElement("null-value");
} else {
XMLNode valueNode = listEntriesNode.addChildElement("value");
valueNode.setText(String.valueOf(entry));
}
}
// Clear out any value and map-entries, as they're mutually incompatible with list-entries
XMLNode value = node_.selectSingleNode("value");
if (value != null) {
node_.removeChild(value);
}
value = node_.selectSingleNode("null-value");
if (value != null) {
node_.removeChild(value);
}
value = node_.selectSingleNode("map-entries");
if (value != null) {
node_.removeChild(value);
}
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#getMapEntries()
*/
@Override
public Map<String, String> getMapEntries() {
Map<String, String> result = new LinkedHashMap<String, String>();
List<XMLNode> mapEntries = node_.selectNodes("map-entries/map-entry");
for (XMLNode entry : mapEntries) {
XMLNode keyNode = entry.selectSingleNode("key");
XMLNode valueNode = entry.selectSingleNode("value | null-value");
if (keyNode != null) {
if (valueNode == null || "null-value".equals(valueNode.getNodeName())) {
result.put(keyNode.getText(), null);
} else {
result.put(keyNode.getText(), valueNode.getText());
}
}
}
return Collections.unmodifiableMap(result);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#setMapEntries(java.util.Map)
*/
@Override
public void setMapEntries(final Map<?, ?> mapEntries) {
XMLNode mapEntriesNode = node_.selectSingleNode("map-entries");
if (mapEntriesNode != null) {
node_.removeChild(mapEntriesNode);
}
mapEntriesNode = node_.addChildElement("map-entries");
for (Map.Entry<?, ?> entry : mapEntries.entrySet()) {
XMLNode entryNode = mapEntriesNode.addChildElement("map-entry");
XMLNode keyNode = entryNode.addChildElement("key");
keyNode.setText(String.valueOf(entry.getKey()));
if (entry.getValue() == null) {
entryNode.addChildElement("null-value");
} else {
XMLNode valueNode = entryNode.addChildElement("value");
valueNode.setText(String.valueOf(entry.getValue()));
}
}
// Clear out any value or list-entries, as they're mutually incompatible with map-entries
XMLNode value = node_.selectSingleNode("value");
if (value != null) {
node_.removeChild(value);
}
XMLNode listEntries = node_.selectSingleNode("list-entries");
if (listEntries != null) {
node_.removeChild(listEntries);
}
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.ManagedBean.Property#remove()
*/
@Override
public void remove() {
node_.getParentNode().removeChild(node_);
}
}
}
public class Converter implements org.openntf.domino.design.FacesConfig.Converter {
private final XMLNode node_;
public Converter(final XMLNode node) {
node_ = node;
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.Converter#getId()
*/
@Override
public String getId() {
XMLNode valueNode = node_.selectSingleNode("converter-id");
if (valueNode == null) {
return "";
}
return valueNode.getText();
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.Converter#setId(java.lang.String)
*/
@Override
public void setId(final String id) {
XMLNode valueNode = node_.selectSingleNode("converter-id");
if (valueNode == null) {
valueNode = node_.addChildElement("converter-id");
}
valueNode.setText(id);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.Converter#getClassName()
*/
@Override
public String getClassName() {
XMLNode valueNode = node_.selectSingleNode("converter-class");
if (valueNode == null) {
return "";
}
return valueNode.getText();
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.Converter#setClassName(java.lang.String)
*/
@Override
public void setClassName(final String className) {
XMLNode valueNode = node_.selectSingleNode("converter-class");
if (valueNode == null) {
valueNode = node_.addChildElement("converter-class");
}
valueNode.setText(className);
}
/* (non-Javadoc)
* @see org.openntf.domino.design.FacesConfig.Converter#remove()
*/
@Override
public void remove() {
node_.getParentNode().removeChild(node_);
}
}
}