/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
*/
package org.opends.guitools.controlpanel.ui.nodes;
import javax.swing.Icon;
import javax.swing.tree.DefaultMutableTreeNode;
import org.opends.guitools.controlpanel.browser.BasicNodeError;
import org.opends.server.types.DN;
import org.opends.server.types.LDAPURL;
import org.opends.server.types.RDN;
/**
* The basic node used to render entries in the 'Manage Entries' tree.
*
*/
public class BasicNode extends DefaultMutableTreeNode {
private static final long serialVersionUID = 5441658731908509872L;
private String localDn;
private String localRdn;
private String localRdnWithAttributeName;
private LDAPURL remoteUrl;
private String remoteRdn;
private String remoteRdnWithAttributeName;
private boolean isLeaf;
private boolean refreshNeededOnExpansion = true;
private boolean obsolete;
private BasicNodeError error;
private String[] referral;
private int numSubOrdinates;
// This is required for the case where there is an undefined number of
// subordinates (for instance in the case of the changelog).
private boolean hasSubOrdinates;
private String displayName;
private Icon icon;
private int fontStyle;
private boolean sizeLimitReached = false;
private String[] objectClassValues;
/**
* Constructor.
* @param dn the DN of the entry.
*/
public BasicNode(String dn) {
localDn = dn;
localRdn = extractRDN(localDn);
localRdnWithAttributeName = extractRDN(localDn, true);
isLeaf = true;
refreshNeededOnExpansion = true;
numSubOrdinates = -1;
hasSubOrdinates = false;
displayName = "";
}
/**
* Returns the DN of the local entry.
* @return the DN of the local entry.
*/
public String getDN() {
return localDn;
}
/**
* Returns the RDN value of the local entry.
* @return the RDN value of the local entry.
*/
public String getRDN() {
return localRdn;
}
/**
* Returns the RDN (with the attribute name) of the local entry.
* @return the RDN (with the attribute name) of the local entry.
*/
public String getRDNWithAttributeName() {
return localRdnWithAttributeName;
}
/**
* Returns the URL of the remote entry (if the node does not represent a
* referral it will be <CODE>null</CODE>).
* @return the URL of the remote entry (if the node does not represent a
* referral it will be <CODE>null</CODE>).
*/
public LDAPURL getRemoteUrl() {
return remoteUrl;
}
/**
* Sets the remote URL of the node.
* @param url the remote URL of the node.
*/
public void setRemoteUrl(LDAPURL url) {
remoteUrl = url;
if (remoteUrl != null)
{
remoteRdn = extractRDN(remoteUrl.getRawBaseDN());
remoteRdnWithAttributeName = extractRDN(remoteUrl.getRawBaseDN(), true);
}
else
{
remoteRdn = null;
remoteRdnWithAttributeName = null;
}
}
/**
* Sets the remote URL of the node.
* @param url the remote URL of the node.
*/
public void setRemoteUrl(String url) {
try
{
if (url == null)
{
remoteUrl = null;
}
else
{
remoteUrl = LDAPURL.decode(url, false);
}
if (remoteUrl == null) {
remoteRdn = null;
remoteRdnWithAttributeName = null;
}
else {
remoteRdn = extractRDN(remoteUrl.getRawBaseDN());
remoteRdnWithAttributeName = extractRDN(remoteUrl.getRawBaseDN(), true);
}
}
catch (Throwable t)
{
throw new IllegalArgumentException(
"The provided url: "+url+" is not valid:"+t, t);
}
}
/**
* Returns the RDN value of the remote entry. If the node does not
* represent a referral it will return <CODE>null</CODE>.
* @return the RDN value of the remote entry.
*/
public String getRemoteRDN() {
return remoteRdn;
}
/**
* Returns the RDN value of the remote entry (with the name of the attribute).
* If the node does not represent a referral it will return <CODE>null</CODE>.
* @return the RDN value of the remote entry (with the name of the attribute).
*/
public String getRemoteRDNWithAttributeName() {
return remoteRdnWithAttributeName;
}
/**
* Sets whether the node is a leaf or not.
* @param isLeaf whether the node is a leaf or not.
*/
public void setLeaf(boolean isLeaf) {
this.isLeaf = isLeaf;
}
/**
* Returns <CODE>true</CODE> if the node is a leaf and <CODE>false</CODE>
* otherwise.
* @return <CODE>true</CODE> if the node is a leaf and <CODE>false</CODE>
* otherwise.
*/
public boolean isLeaf() {
return isLeaf;
}
/**
* Returns <CODE>true</CODE> if the node must be refreshed when it is expanded
* and <CODE>false</CODE> otherwise.
* @return <CODE>true</CODE> if the node must be refreshed when it is expanded
* and <CODE>false</CODE> otherwise.
*/
public boolean isRefreshNeededOnExpansion() {
return refreshNeededOnExpansion;
}
/**
* Sets whether the node must be refreshed when it is expanded or not.
* @param refreshNeededOnExpansion whether the node must be refreshed when it
* is expanded or not.
*/
public void setRefreshNeededOnExpansion(boolean refreshNeededOnExpansion) {
this.refreshNeededOnExpansion = refreshNeededOnExpansion;
}
/**
* Returns whether the node is obsolete (and must be refreshed) or not.
* @return <CODE>true</CODE> if the node is obsolete and <CODE>false</CODE>
* otherwise.
*/
public boolean isObsolete() {
return obsolete;
}
/**
* Sets whether this is node is obsolete (and must be refreshed) or not.
* @param obsolete whether this is node is obsolete (and must be refreshed) or
* not.
*/
public void setObsolete(boolean obsolete) {
this.obsolete = obsolete;
}
/**
* Returns the error that occurred when updating the node. Returns
* <CODE>null</CODE> if no error occurred.
* @return the error that occurred when updating the node. Returns
* <CODE>null</CODE> if no error occurred.
*/
public BasicNodeError getError() {
return error;
}
/**
* Sets the error that occurred when updating the node.
* @param error the error.
*/
public void setError(BasicNodeError error) {
this.error = error;
}
/**
* Cached LDAP attributes
*/
/**
* Returns the number of subordinates of the entry.
* @return the number of subordinates of the entry.
*/
public int getNumSubOrdinates() {
return numSubOrdinates;
}
/**
* Sets the number of subordinates of the entry.
* @param number the number of subordinates of the entry.
*/
public void setNumSubOrdinates(int number) {
numSubOrdinates = number;
}
/**
* Returns whether the entry has subordinates or not.
* @return {@code true} if the entry has subordinates and {@code false}
* otherwise.
*/
public boolean hasSubOrdinates() {
return hasSubOrdinates;
}
/**
* Sets the whether the entry has subordinates or not.
* @param hasSubOrdinates whether the entry has subordinates or not.
*/
public void setHasSubOrdinates(boolean hasSubOrdinates) {
this.hasSubOrdinates = hasSubOrdinates;
}
/**
* Returns the referrals of the entry. Returns <CODE>null</CODE> if this node
* is not a referral.
* @return the referrals of the entry. Returns <CODE>null</CODE> if this node
* is not a referral.
*/
public String[] getReferral() {
return referral;
}
/**
* Sets the referrals of the entry.
* @param referral the referrals of the entry.
*/
public void setReferral(String[] referral) {
this.referral = referral;
}
/**
* Rendering
*/
/**
* {@inheritDoc}
*/
public String toString() {
return getDisplayName();
}
/**
* Returns the label that will be used to display the entry.
* @return the label that will be used to display the entry.
*/
public String getDisplayName() {
return displayName;
}
/**
* Sets the label that will be used to display the entry.
* @param name the label that will be used to display the entry.
*/
public void setDisplayName(String name) {
displayName = name;
}
/**
* Returns the icon associated with this node.
* @return the icon associated with this node.
*/
public Icon getIcon() {
return icon;
}
/**
* Sets the icon associated with this node.
* @param icon the icon associated with this node.
*/
public void setIcon(Icon icon) {
this.icon = icon;
}
/**
* Returns the font style to be used to render this node.
* @return the font style to be used to render this node.
*/
public int getFontStyle() {
return fontStyle;
}
/**
* Sets the font style to be used to render this node.
* @param style the font style to be used to render this node.
*/
public void setFontStyle(int style) {
fontStyle = style;
}
/**
* Returns the object class values associated with the entry.
* @return the object class values associated with the entry.
*/
public String[] getObjectClassValues() {
return objectClassValues;
}
/**
* Sets the object class values associated with the entry.
* @param objectClassValues the object class values associated with the entry.
*/
public void setObjectClassValues(String[] objectClassValues) {
this.objectClassValues = objectClassValues;
}
/**
* Extracts the RDN value from a DN.
* @param dn the DN.
* @param showAttributeName whether the result must include the attribute name
* or not.
* @return the RDN value from the DN.
*/
public static String extractRDN(String dn, boolean showAttributeName) {
String result;
if (dn == null)
{
result = null;
}
else
{
try
{
DN dnObj = DN.decode(dn);
if (dnObj.getNumComponents() >= 1) {
RDN rdn = dnObj.getRDN();
if (showAttributeName)
{
result = rdn.toString();
}
else
{
result = rdn.getAttributeValue(0).getValue().toString();
}
}
else {
result = "";
}
}
catch (Throwable t)
{
throw new IllegalArgumentException(
"The provided argument is not a valid dn: "+t, t);
}
}
return result;
}
/**
* Extracts the RDN value from the DN. The value does not include the name
* of the attribute.
* @param dn the DN.
* @return the RDN value from the DN.
*/
public static String extractRDN(String dn) {
return extractRDN(dn, false);
}
/**
* Returns <CODE>true</CODE> if the size limit was reached updating this node
* (and searching its children) and <CODE>false</CODE> otherwise.
* @return <CODE>true</CODE> if the size limit was reached updating this node
* (and searching its children) and <CODE>false</CODE> otherwise.
*/
public boolean isSizeLimitReached()
{
return sizeLimitReached;
}
/**
* Sets whether the size limit was reached updating this node
* (and searching its children).
* @param sizeLimitReached whether the size limit was reached updating this
* node (and searching its children).
*/
public void setSizeLimitReached(boolean sizeLimitReached)
{
this.sizeLimitReached = sizeLimitReached;
}
}