/**
* Copyright 2005 Open Cloud Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mobicents.eclipslee.util.slee.xml.components;
import org.mobicents.eclipslee.util.slee.xml.DTDHandler;
import org.mobicents.eclipslee.util.slee.xml.DTDXML;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* @author allenc
*/
public class SbbXML extends DTDXML {
protected SbbXML(Document document, Element root, DTDHandler dtd) {
super(document, root, dtd);
}
public void setReentrant(boolean reentrant) {
getRoot().setAttribute("reentrant", new Boolean(reentrant).toString());
}
public boolean getReentrant() {
String attr = getRoot().getAttribute("reentrant");
if (attr == null)
return false;
return Boolean.getBoolean(attr);
}
public String getName() {
return getChildText(getRoot(), "sbb-name");
}
public void setName(String name) {
setChildText(getRoot(), "sbb-name", name);
}
public String getVendor() {
return getChildText(getRoot(), "sbb-vendor");
}
public void setVendor(String vendor) {
setChildText(getRoot(), "sbb-vendor", vendor);
}
public String getVersion() {
return getChildText(getRoot(), "sbb-version");
}
public void setVersion(String version) {
setChildText(getRoot(), "sbb-version", version);
}
public String getDescription() {
return getChildText(getRoot(), "description");
}
public void setDescription(String description) {
setChildText(getRoot(), "description", description);
}
public SbbChildRelationXML getChildRelation(String methodName) {
SbbChildRelationXML children[] = getChildRelations();
for (int i = 0; i < children.length; i++)
if (methodName.equals(children[i].getChildRelationMethodName()))
return children[i];
return null;
}
public SbbChildRelationXML getChildRelation(SbbRefXML ref) {
SbbChildRelationXML children[] = getChildRelations();
for (int i = 0; i < children.length; i++) {
if (ref.getAlias().equals(children[i].getSbbAliasRef())) {
return children[i];
}
}
return null;
}
public void deleteChildRelation(SbbChildRelationXML child) {
child.getRoot().getParentNode().removeChild(child.getRoot());
}
private SbbChildRelationXML addChildRelation() {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
classes = addElement(getRoot(), "sbb-classes");
Element absClass = getChild(classes, "sbb-abstract-class");
if (absClass == null)
absClass = addElement(classes, "sbb-abstract-class");
Element childRelation = addElement(absClass,
"get-child-relation-method");
return new SbbChildRelationXML(document, childRelation, dtd);
}
public void removeChildRelation(SbbChildRelationXML child) {
child.getRoot().getParentNode().removeChild(child.getRoot());
}
public SbbChildRelationXML addChildRelation(SbbRefXML ref) {
SbbChildRelationXML childXML = addChildRelation();
childXML.setSbbAliasRef(ref);
return childXML;
}
public SbbChildRelationXML[] getChildRelations() {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
return new SbbChildRelationXML[0];
Element absClass = getChild(classes, "sbb-abstract-class");
if (absClass == null)
return null;
Element childRelations[] = getNodes(absClass,
"sbb-abstract-class/get-child-relation-method");
SbbChildRelationXML children[] = new SbbChildRelationXML[childRelations.length];
for (int i = 0; i < childRelations.length; i++)
children[i] = new SbbChildRelationXML(document, childRelations[i],
dtd);
return children;
}
public SbbRefXML[] getSbbRefs() {
Element refs[] = getNodes("sbb/sbb-ref");
SbbRefXML refXML[] = new SbbRefXML[refs.length];
for (int i = 0; i < refs.length; i++)
refXML[i] = new SbbRefXML(document, refs[i], dtd);
return refXML;
}
public SbbRefXML getSbbRef(String name, String vendor, String version) {
SbbRefXML refs[] = getSbbRefs();
for (int i = 0; i < refs.length; i++) {
if (name.equals(refs[i].getName())
&& vendor.equals(refs[i].getVendor())
&& version.equals(refs[i].getVersion()))
return refs[i];
}
return null;
}
public SbbRefXML getSbbRef(String alias) {
SbbRefXML refs[] = getSbbRefs();
for (int i = 0; i < refs.length; i++)
if (alias.equals(refs[i].getAlias()))
return refs[i];
return null;
}
public void removeSbbRef(SbbRefXML ref) {
ref.getRoot().getParentNode().removeChild(ref.getRoot());
}
/**
* Removes all unreferenced SbbRefs.
*/
public void removeUnusedSbbRefs() {
SbbRefXML refs[] = getSbbRefs();
SbbCMPField cmps[] = getCMPFields();
outer: for (int i = 0; i < refs.length; i++) {
SbbRefXML ref = refs[i];
// Children
SbbChildRelationXML child = getChildRelation(ref);
if (child != null)
continue;
// CMP Fields
for (int cmp = 0; cmp < cmps.length; cmp++) {
if (ref.getAlias().equals(cmps[cmp].getSbbAliasRef()))
continue outer;
}
// Unused by any CMP Field or Child Relation, remove it.
this.removeSbbRef(ref);
}
}
public SbbRefXML addSbbRef() {
Element ref = addElement(getRoot(), "sbb-ref");
SbbRefXML xml = new SbbRefXML(document, ref, dtd);
xml.setAlias(getUniqueSbbRefAlias());
return xml;
}
/* TODO: Remove
private SbbRefXML addSbbRef(String name, String vendor, String version) {
SbbRefXML xml = addSbbRef();
xml.setName(name);
xml.setVendor(vendor);
xml.setVersion(version);
return xml;
}*/
private String getUniqueSbbRefAlias() {
String template = "sbb_";
int count = 0;
while (true) {
SbbRefXML xml = getSbbRef(template + count);
if (xml == null)
return template + count;
count++;
}
}
public SbbProfileSpecRefXML[] getProfileSpecRefs() {
Element refs[] = getNodes("sbb/profile-spec-ref");
SbbProfileSpecRefXML refXML[] = new SbbProfileSpecRefXML[refs.length];
for (int i = 0; i < refs.length; i++)
refXML[i] = new SbbProfileSpecRefXML(document, refs[i], dtd);
return refXML;
}
public SbbProfileSpecRefXML getProfileSpecRef(String name, String vendor,
String version) {
SbbProfileSpecRefXML refs[] = getProfileSpecRefs();
for (int i = 0; i < refs.length; i++) {
if (name.equals(refs[i].getName())
&& vendor.equals(refs[i].getVendor())
&& version.equals(refs[i].getVersion()))
return refs[i];
}
return null;
}
public SbbProfileSpecRefXML getProfileSpecRef(String alias) {
SbbProfileSpecRefXML refs[] = getProfileSpecRefs();
for (int i = 0; i < refs.length; i++)
if (alias.equals(refs[i].getAlias()))
return refs[i];
return null;
}
public void removeProfileSpecRef(SbbProfileSpecRefXML ref) {
ref.getRoot().getParentNode().removeChild(ref.getRoot());
}
public SbbProfileSpecRefXML addProfileSpecRef() {
Element ref = addElement(getRoot(), "profile-spec-ref");
SbbProfileSpecRefXML xml = new SbbProfileSpecRefXML(document, ref, dtd);
xml.setAlias(getUniqueProfileSpecRefAlias());
return xml;
}
/* TODO: Remove
private SbbProfileSpecRefXML addProfileSpecRef(String name, String vendor,
String version) {
SbbProfileSpecRefXML xml = addProfileSpecRef();
xml.setName(name);
xml.setVendor(vendor);
xml.setVersion(version);
return xml;
}*/
private String getUniqueProfileSpecRefAlias() {
String template = "profile_spec_";
int count = 0;
while (true) {
SbbProfileSpecRefXML xml = getProfileSpecRef(template + count);
if (xml == null)
return template + count;
count++;
}
}
public SbbCMPField addCMPField() {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
classes = addElement(getRoot(), "sbb-classes");
Element absClass = getChild(classes, "sbb-abstract-class");
if (absClass == null)
absClass = addElement(classes, "sbb-abstract-class");
Element cmpElement = addElement(absClass, "cmp-field");
SbbCMPField cmp = new SbbCMPField(document, cmpElement, dtd);
return cmp;
}
public void removeCMPField(SbbCMPField cmpField) {
cmpField.getRoot().getParentNode().removeChild(cmpField.getRoot());
}
public SbbCMPField getCMPField(String name) {
SbbCMPField fields[] = getCMPFields();
if (fields == null)
return null;
for (int i = 0; i < fields.length; i++)
if (fields[i].getName().equals(name))
return fields[i];
return null;
}
public SbbCMPField[] getCMPFields() {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
return null;
Element absClass = getChild(classes, "sbb-abstract-class");
if (absClass == null)
return null;
Element fields[] = this.getNodes(absClass,
"sbb-abstract-class/cmp-field");
SbbCMPField cmpFields[] = new SbbCMPField[fields.length];
for (int i = 0; i < fields.length; i++)
cmpFields[i] = new SbbCMPField(document, fields[i], dtd);
return cmpFields;
}
public void setAbstractClassName(String name) {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
classes = addElement(getRoot(), "sbb-classes");
Element absClass = getChild(classes, "sbb-abstract-class");
if (absClass == null)
absClass = addElement(classes, "sbb-abstract-class");
setChildText(absClass, "sbb-abstract-class-name", name);
}
public String getAbstractClassName() {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
return null;
Element absClass = getChild(classes, "sbb-abstract-class");
if (absClass == null)
return null;
return getChildText(absClass, "sbb-abstract-class-name");
}
public void setUsageInterfaceName(String name) {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
classes = addElement(getRoot(), "sbb-classes");
Element absClass = getChild(classes, "sbb-usage-parameters-interface");
if (absClass == null)
absClass = addElement(classes, "sbb-usage-parameters-interface");
if (name == null) { // Remove this element
absClass.getParentNode().removeChild(absClass);
return;
}
setChildText(absClass, "sbb-usage-parameters-interface-name", name);
}
public String getUsageInterfaceName() {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
return null;
Element usageIface = getChild(classes, "sbb-usage-parameters-interface");
if (usageIface == null)
return null;
return getChildText(usageIface, "sbb-usage-parameters-interface-name");
}
public void setLocalInterfaceName(String name) {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
classes = addElement(getRoot(), "sbb-classes");
Element localIface = getChild(classes, "sbb-local-interface");
if (localIface == null)
localIface = addElement(classes, "sbb-local-interface");
if (name == null) {
localIface.getParentNode().removeChild(localIface);
return;
}
setChildText(localIface, "sbb-local-interface-name", name);
}
public String getLocalInterfaceName() {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
return null;
Element localIface = getChild(classes, "sbb-local-interface");
if (localIface == null)
return null;
return getChildText(localIface, "sbb-local-interface-name");
}
public void setActivityContextInterfaceName(String name) {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
classes = addElement(getRoot(), "sbb-classes");
Element localIface = getChild(classes, "sbb-activity-context-interface");
if (localIface == null)
localIface = addElement(classes, "sbb-activity-context-interface");
if (name == null) {
localIface.getParentNode().removeChild(localIface);
return;
}
setChildText(localIface, "sbb-activity-context-interface-name", name);
}
public String getActivityContextInterfaceName() {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
return null;
Element localIface = getChild(classes, "sbb-activity-context-interface");
if (localIface == null)
return null;
return getChildText(localIface, "sbb-activity-context-interface-name");
}
public SbbProfileCMPMethod[] getProfileCMPMethods() {
Element methods[] = getNodes("sbb/sbb-classes/sbb-abstract-class/get-profile-cmp-method");
SbbProfileCMPMethod cmp[] = new SbbProfileCMPMethod[methods.length];
for (int i = 0; i < methods.length; i++)
cmp[i] = new SbbProfileCMPMethod(document, methods[i], dtd);
return cmp;
}
public SbbProfileCMPMethod getProfileCMPMethod(String methodName) {
SbbProfileCMPMethod methods[] = getProfileCMPMethods();
for (int i = 0; i < methods.length; i++) {
if (methodName.equals(methods[i].getProfileCMPMethodName()))
return methods[i];
if (methodName.equals(methods[i].getProfileSpecAliasRef()))
return methods[i];
}
return null;
}
public SbbProfileCMPMethod addProfileCMPMethod(SbbProfileSpecRefXML ref) {
Element classes = getChild(getRoot(), "sbb-classes");
if (classes == null)
classes = addElement(getRoot(), "sbb-classes");
Element absClass = getChild(classes, "sbb-abstract-class");
if (absClass == null)
absClass = addElement(classes, "sbb-abstract-class");
Element child = addElement(absClass, "get-profile-cmp-method");
SbbProfileCMPMethod method = new SbbProfileCMPMethod(document, child,
dtd);
method.setProfileSpecAliasRef(ref);
return method;
}
public void removeProfileCMPMethod(SbbProfileCMPMethod method) {
method.getRoot().getParentNode().removeChild(method.getRoot());
}
public void setAddressProfileSpecAliasRef(SbbProfileSpecRefXML ref) {
setChildText(getRoot(), "address-profile-spec-alias-ref", ref
.getAlias());
}
public SbbProfileSpecRefXML getAddressProfileSpecAliasRef() {
String alias = getChildText(getRoot(), "address-profile-spec-alias-ref");
if (alias == null)
return null;
return this.getProfileSpecRef(alias);
}
public void removeAddressProfileSpecAliasRef() {
Element child = getChild(getRoot(), "address-profile-spec-alias-ref");
if (child != null)
child.getParentNode().removeChild(child);
}
public SbbEventXML[] getEvents() {
Element nodes[] = getNodes("sbb/event");
SbbEventXML xml[] = new SbbEventXML[nodes.length];
for (int i = 0; i < nodes.length; i++)
xml[i] = new SbbEventXML(document, nodes[i], dtd);
return xml;
}
public SbbEventXML getEvent(String name, String vendor, String version) {
SbbEventXML events[] = getEvents();
for (int i = 0; i < events.length; i++)
if (name.equals(events[i].getName())
&& vendor.equals(events[i].getVendor())
&& version.equals(events[i].getVersion()))
return events[i];
return null;
}
public SbbEventXML getEvent(String alias) {
SbbEventXML events[] = getEvents();
for (int i = 0; i < events.length; i++)
if (alias.equals(events[i].getScopedName()))
return events[i];
return null;
}
public SbbEventXML addEvent(EventXML event) {
Element ele = addElement(getRoot(), "event");
SbbEventXML xml = new SbbEventXML(document, ele, dtd);
xml.setName(event.getName());
xml.setVendor(event.getVendor());
xml.setVersion(event.getVersion());
String clazzName = event.getEventClassName();
clazzName = clazzName.substring(clazzName.lastIndexOf('.') + 1);
xml.setScopedName(clazzName);
return xml;
}
public void removeEvent(SbbEventXML event) {
event.getRoot().getParentNode().removeChild(event.getRoot());
}
public SbbEnvEntryXML addEnvEntry() {
Element ele = addElement(getRoot(), "env-entry");
SbbEnvEntryXML xml = new SbbEnvEntryXML(document, ele, dtd);
return xml;
}
public SbbEnvEntryXML[] getEnvEntries() {
Element nodes[] = getNodes("sbb/env-entry");
SbbEnvEntryXML xml[] = new SbbEnvEntryXML[nodes.length];
for (int i = 0; i < nodes.length; i++)
xml[i] = new SbbEnvEntryXML(document, nodes[i], dtd);
return xml;
}
public void removeEnvEntry(SbbEnvEntryXML xml) {
xml.getRoot().getParentNode().removeChild(xml.getRoot());
}
public String toString() {
return "SBB: " + getName() + "," + getVersion() + "," + getVendor();
}
public SbbResourceAdaptorTypeBindingXML addResourceAdaptorTypeBinding() {
Element ele = addElement(getRoot(), "resource-adaptor-type-binding");
return new SbbResourceAdaptorTypeBindingXML(document, ele, dtd);
}
public SbbResourceAdaptorTypeBindingXML[] getResourceAdaptorTypeBindings() {
Element nodes[] = getNodes("sbb/resource-adaptor-type-binding");
SbbResourceAdaptorTypeBindingXML xml[] = new SbbResourceAdaptorTypeBindingXML[nodes.length];
for (int i = 0; i < nodes.length; i++)
xml[i] = new SbbResourceAdaptorTypeBindingXML(document, nodes[i], dtd);
return xml;
}
public void removeResourceAdaptorTypeBinding(SbbResourceAdaptorTypeBindingXML xml) {
xml.getRoot().getParentNode().removeChild(xml.getRoot());
}
/* TODO: activity-context-attribute-alias
resource-adaptor-type-binding
resource-adaptor-type-ref
activity-context-interface-factory-name
resource-adaptor-entity-binding
ejb-ref
*/
}