directory-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Directory Server v1.5: Referral Handling Changes (page edited)
Date Tue, 07 Oct 2008 22:26:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence" />
    <style type="text/css">
    <!--
    body, p, td, table, tr, .bodytext, .stepfield {
	font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	color: #000000;
	font-weight: normal;
}
#PageContent {
	text-align: left;
	background-color: #fff;
	padding: 0px;
	margin: 0px;
    padding-bottom:20px;
}
/*
** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't
** use an id=PageContent or class=wiki-content, so we must
** set the body style to that used for PageContent, and p to that used for wiki-content.
*/

body {
	margin: 0px;
	padding: 0px;
	text-align: center;
    background-color: #f0f0f0;
}

@media print {

body {
    background-color: #fff;
}

}

.monospaceInput {
    font:12px monospace
}

.wiki-content p, .commentblock p {
    margin: 16px 0px 16px 0px;
    padding: 0px;
}

.wiki-content-preview {
    padding: 5px;
    border-left: 1px solid #3c78b5;
    border-right: 1px solid #3c78b5;
}

ul, ol {
    margin-top: 2px;
    margin-bottom: 2px;
    padding-top: 0px;
    padding-bottom: 0px;
}

pre {
    padding: 0px;
    margin-top: 5px;
    margin-left: 15px;
    margin-bottom: 5px;
    margin-right: 5px;
    text-align: left;
}

.helpheading {
    font-weight: bold;
    background-color: #D0D9BD;
        border-bottom: 1px solid #3c78b5;
        padding: 4px 4px 4px 4px;
        margin: 0px;
        margin-top: 10px;
}
.helpcontent {
        padding: 4px 4px 20px 4px;
    background-color: #f5f7f1;
}

.code {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.focusedComment {
    background: #ffffce;
}

.commentBox, .focusedComment {
    padding: 10px;
    margin: 5px 0 5px 0;
    border: 1px #bbb solid;
}

.codeHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.codeContent {
    text-align: left;
    background-color: #f0f0f0;
    padding: 3px;
}

.preformatted {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.preformattedHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.preformattedContent {
    background-color: #f0f0f0;
    padding: 3px;
}

.panel {
 	border: 1px dashed #3c78b5;
    margin: 10px;
    margin-top: 0px;
}

.panelHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.panelContent {
    background-color: #f0f0f0;
    padding: 5px;
}

.anonymousAlert {
    background-color: #f0f0f0;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}

.lockAlert {
    background-color: #f0f0f0;
    width: 50%;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}


.code-keyword {
  color: #000091;
  background-color: inherit;
}

.code-object {
  color: #910091;
  background-color: inherit;
}

.code-quote {
  color: #009100;
  background-color: inherit;
}

.code-comment {
  color: #808080;
  background-color: inherit;
}


.code-xml .code-keyword {
  color: inherit;
  font-weight: bold;
}

.code-tag {
  color: #000091;
  background-color: inherit;
}

.breadcrumbs {
    background-color: #f0f0f0;
 	border-color: #3c78b5;
	border-width: 1px 0px 1px 0px;
	border-style: solid;
    font-size: 11px;
    padding: 3px 0px 3px 0px;
}

.navmenu {
    border: 1px solid #ccc;
}

.menuheading {
    font-weight: bold;
    background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 2px 4px;
}

.menuitems {
	padding: 4px 4px 20px 4px;
}

.rightpanel {
    border-left: 1px solid #ccc;
    border-bottom: 1px solid #ccc;
}

#helpheading {
    text-align: left;
    font-weight: bold;
    background-color: #D0D9BD;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 4px 4px;
	margin: 0px;
}
#helpcontent {
	padding: 4px 4px 4px 4px;
    background-color: #f5f7f1;
}
.helptab-unselected {
    font-weight: bold;
	padding: 5px;
    background-color: #f5f7f1;
}
.helptab-selected {
    font-weight: bold;
    background-color: #D0D9BD;
	padding: 5px;
}
.helptabs {
    margin: 0px;
    background-color: #f5f7f1;
	padding: 5px;
}
.infopanel-heading {
    font-weight: bold;
	padding: 4px 0px 2px 0px;
}

.pagebody {
}

.pageheader {
	padding: 5px 5px 5px 0px;
 	border-bottom: 1px solid #3c78b5;
}

.pagetitle {
	font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.newpagetitle {
    color: #ccc !important;
}

.steptitle {
	font-size: 18px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
	margin-bottom: 7px;
}

.substeptitle {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
    margin: 2px 4px 4px 4px;
    padding: 2px 4px 1px 4px;
}

.stepdesc {
    font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	font-weight: normal;
    color: #666666;
    margin-top: 7px;
    margin-bottom: 7px;
}

.steplabel {
    font-weight: bold;
    margin-right: 4px;
    color: black;
    float: left;
    width: 15%;
    text-align: right;
}

.stepfield {
    background: #f0f0f0;
    padding: 5px;
}

.submitButtons{
    margin-top:5px;
    text-align:right;
}

.formtitle {
	font-size: 12px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.sectionbottom {
    border-bottom: 1px solid #3c78b5;
}

.topRow {
    border-top: 2px solid #3c78b5;
}

.tabletitle {
	font-size: 14px;
	font-weight: bold;
	font-family: Arial, sans-serif;
    padding: 3px 0px 2px 0px;
    margin: 8px 4px 2px 0px;
	color: #003366;
	border-bottom: 2px solid #3c78b5;
}
.pagesubheading {
    color: #666666;
    font-size: 10px;
    padding: 0px 0px 5px 0px;
}

HR {
	color: 3c78b5;
	height: 1;
}

A:link, A:visited, A:active, A:hover {
	color: #003366;
}

h1 A:link, h1 A:visited, h1 A:active {
	text-decoration: none;
}

h1 A:hover {
    border-bottom: 1px dotted #003366;
}

.wiki-content > :first-child, .commentblock > :first-child {
    margin-top: 3px;
}

.logocell {
    padding: 10px;
}

input {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #000000;
}

textarea, textarea.editor {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #333333;
}

/* use logoSpaceLink instead.
.spacenametitle {
	font: 21px/31px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle img {
  margin: 0 0 -4px 0;
}
.spacenametitle a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle a:visited {
    text-decoration: none;
    color: #999999;
}*/

.spacenametitle-printable {
	font: 20px/25px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle-printable a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle-printable a:visited {
    text-decoration: none;
    color: #999999;
}

.blogDate {
	font-weight: bold;
	text-decoration: none;
	color: black;
}

.blogSurtitle {
    background: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.blogHeading {
    font-size: 20px;
    line-height: normal;
    font-weight: bold;
    padding: 0px;
    margin: 0px;
}

.blogHeading a {
   text-decoration: none;
   color: black;
}

.endsection {
	align: right;
	color: #666666;
	margin-top: 10px;
}
.endsectionleftnav {
	align: right;
	color: #666666;
	margin-top: 10px;
}

h1 {
	font-size: 24px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	color: #003366;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 36px 0px 4px 0px;
}

h2 {
	font-size: 18px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 27px 0px 4px 0px;
}

h3 {
	font-size: 14px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 21px 0px 4px 0px;
}

h4 {
	font-size: 12px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 18px 0px 4px 0px;
}

h4.search {
	font-size: 12px;
	line-height: normal;
	font-weight: normal;
	background-color: #f0f0f0;
	padding: 4px;
	margin: 18px 0px 4px 0px;
}

h5 {
	font-size: 10px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

h6 {
	font-size: 8px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

.smallfont {
    font-size: 10px;
}
.descfont {
    font-size: 10px;
    color: #666666;
}
.smallerfont {
    font-size: 9px;
}
.smalltext {
    color: #666666;
    font-size: 10px;
}
.smalltext a {
    color: #666666;
}
.smalltext-blue {
    color: #3c78b5;
    font-size: 10px;
}
.surtitle {
    margin-left: 1px;
    margin-bottom: 5px;
    font-size: 14px;
    color: #666666;
}

/* css hack found here:  http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */
.navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;}
.navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; }
.navItem a { color: #ffffff; text-decoration: none; }
.navItem a:hover { color: #ffffff; text-decoration: none; }
.navItem a:visited { color: #ffffff; text-decoration: none; }

div.padded { padding: 4px; }
div.thickPadded { padding: 10px; }
h3.macrolibrariestitle {
    margin: 0px 0px 0px 0px;
}

div.centered { text-align: center; margin: 10px; }
div.centered table {margin: 0px auto; text-align: left; }

.tableview table {
    margin: 0;
}

.tableview th {
    text-align: left;
    color: #003366;
    font-size: 12px;
    padding: 5px 0px 0px 5px;
    border-bottom: 2px solid #3c78b5;
}
.tableview td {
    text-align: left;
    border-color: #ccc;
    border-width: 0px 0px 1px 0px;
    border-style: solid;
    margin: 0;
    padding: 4px 10px 4px 5px;
}

.grid {
    margin: 2px 0px 5px 0px;
    border-collapse: collapse;
}
.grid th  {
    border: 1px solid #ccc;
    padding: 2px 4px 2px 4px;
    background: #f0f0f0;
    text-align: center;
}
.grid td  {
    border: 1px solid #ccc;
    padding: 3px 4px 3px 4px;
}
.gridHover {
	background-color: #f9f9f9;
}

td.infocell {
    background-color: #f0f0f0;
}
.label {
	font-weight: bold;
	color: #003366;
}

label {
	font-weight: bold;
	color: #003366;
}

.error {
	background-color: #fcc;
}

.errorBox {
	background-color: #fcc;
    border: 1px solid #c00;
    padding: 5px;
    margin: 5px;
}

.errorMessage {
	color: #c00;
}

.success {
	background-color: #dfd;
}

.successBox {
	background-color: #dfd;
    border: 1px solid #090;
    padding: 5px;
    margin-top:5px;
    margin-bottom:5px;
}

blockquote {
	padding-left: 10px;
	padding-right: 10px;
	margin-left: 5px;
	margin-right: 0px;
	border-left: 1px solid #3c78b5;
}

table.confluenceTable
{
    margin: 5px;
    border-collapse: collapse;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

DIV.small {
	font-size: 9px;
}

H1.pagename {
	margin-top: 0px;
}

IMG.inline  {}

.loginform {
    margin: 5px;
    border: 1px solid #ccc;
}

/* The text how the "This is a preview" comment should be shown. */
.previewnote { text-align: center;
                font-size: 11px;
                    color: red; }

/* How the preview content should be shown */
.previewcontent { background: #E0E0E0; }

/* How the system messages should be shown (DisplayMessage.jsp) */
.messagecontent { background: #E0E0E0; }

/* How the "This page has been modified..." -comment should be shown. */
.conflictnote { }

.createlink {
    color: maroon;
}
a.createlink {
    color: maroon;
}
.templateparameter {
    font-size: 9px;
    color: darkblue;
}

.diffadded {
    background: #ddffdd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkgreen;
}
.diffdeleted {
    color: #999;
    background: #ffdddd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkred;
}
.diffnochange {
    padding: 1px 1px 1px 4px;
	border-left: 4px solid lightgrey;
}
.differror {
    background: brown;
}
.diff {
    font-family: lucida console, courier new, fixed-width;
	font-size: 12px;
	line-height: 14px;
}
.diffaddedchars {
    background-color:#99ff99;
    font-weight:bolder;
}
.diffremovedchars {
    background-color:#ff9999;
    text-decoration: line-through;
    font-weight:bolder;
}

.greybackground {
    background: #f0f0f0
}

.greybox {
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.borderedGreyBox {
    border: 1px solid #cccccc;
    background-color: #f0f0f0;
    padding: 10px;
}

.greyboxfilled {
 	border: 1px solid #ddd;
    background: #f0f0f0;
    padding: 3px;
	margin: 1px 1px 10px 1px;
}

.navBackgroundBox {
    padding: 5px 5px 5px 5px;
    font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: white;
    background: #3c78b5;
    text-decoration: none;
}

.previewBoxTop {
	background-color: #f0f0f0;
    border-width: 1px 1px 0px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 5px 0px 0px 0px;
    text-align: center;
}
.previewContent {
    background-color: #fff;
 	border-color: #3c78b5;
	border-width: 0px 1px 0px 1px;
	border-style: solid;
	padding: 10px;
	margin: 0px;
}
.previewBoxBottom {
	background-color: #f0f0f0;
    border-width: 0px 1px 1px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 0px 0px 5px 0px;
    text-align: center;
}

.functionbox {
    background-color: #f0f0f0;
 	border: 1px solid #3c78b5;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.functionbox-greyborder {
    background-color: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.search-highlight {
    background-color: #ffffcc;
}

/* normal (white) background */
.rowNormal {
    background-color: #ffffff;
 }

/* alternate (pale yellow) background */
.rowAlternate {
    background-color: #f7f7f7;
}

/* used in the list attachments table */
.rowAlternateNoBottomColor {
    background-color: #f7f7f7;
}

.rowAlternateNoBottomNoColor {
}

.rowAlternateNoBottomColor td {
    border-bottom: 0px;
}

.rowAlternateNoBottomNoColor td {
    border-bottom: 0px;
}

/* row highlight (grey) background */
.rowHighlight {
    background-color: #f0f0f0;

}

TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }

TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }

.toolbar  {
    margin: 0px;
    border-collapse: collapse;
}

.toolbar td  {
    border: 1px solid #ccc;
    padding: 2px 2px 2px 2px;
    color: #ccc;
}

td.noformatting {
    border-width: 0px;
    border-style: none;
    text-align: center;
	padding: 0px;
}

.commentblock {
    margin: 12px 0 12px 0;
}

/*
 * Divs displaying the license information, if necessary.
 */
.license-eval, .license-none, .license-nonprofit {
    border-top: 1px solid #bbbbbb;
    text-align: center;
    font-size: 10px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

.license-eval, .license-none {
    background-color: #ffcccc;
}

.license-eval b, .license-none b {
    color: #990000
}

.license-nonprofit {
    background-color: #ffffff;
}

/*
 * The shadow at the bottom of the page between the main content and the
 * "powered by" section.
 */
.bottomshadow {
    height: 12px;
    background-image: url("$req.contextPath/images/border/border_bottom.gif");
    background-repeat: repeat-x;
}

/*
 * Styling of the operations box
 */
.navmenu .operations li, .navmenu .operations ul {
    list-style: none;
    margin-left: 0;
    padding-left: 0;
}

.navmenu .operations ul {
    margin-bottom: 9px;
}

.navmenu .label {
    font-weight: inherit;
}

/*
 * Styling of ops as a toolbar
 */
.toolbar div {
    display: none;
}

.toolbar .label {
    display: none;
}

.toolbar .operations {
    display: block;
}

.toolbar .operations ul {
    display: inline;
    list-style: none;
    margin-left: 10px;
    padding-left: 0;
}

.toolbar .operations li {
    list-style: none;
    display: inline;
}

/* list page navigational tabs */
#foldertab {
padding: 3px 0px 3px 8px;
margin-left: 0;
border-bottom: 1px solid #3c78b5;
font: bold 11px Verdana, sans-serif;
}

#foldertab li {
list-style: none;
margin: 0;
display: inline;
}

#foldertab li a {
padding: 3px 0.5em;
margin-left: 3px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
text-decoration: none;
}

#foldertab li a:link { color: #ffffff; }
#foldertab li a:visited { color: #ffffff; }

#foldertab li a:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

#foldertab li a.current {
background: white;
border-bottom: 1px solid white;
color: black;
}

#foldertab li a.current:link { color: black; }
#foldertab li a.current:visited { color: black; }
#foldertab li a.current:hover {
background: white;
border-bottom: 1px solid white;
color: black;
}

/* alphabet list */
ul#squaretab {
margin-left: 0;
padding-left: 0;
white-space: nowrap;
font: bold 8px Verdana, sans-serif;
}

#squaretab li {
display: inline;
list-style-type: none;
}

#squaretab a {
padding: 2px 6px;
border: 1px solid #3c78b5;
}

#squaretab a:link, #squaretab a:visited {
color: #fff;
background-color: #3c78b5;
text-decoration: none;
}

#squaretab a:hover {
color: #ffffff;
background-color: #003366;
border-color: #003366;
text-decoration: none;
}

#squaretab li a#current {
background: white;
color: black;
}

.blogcalendar * {
    font-family:verdana, arial, sans-serif;
    font-size:x-small;
    font-weight:normal;
    line-height:140%;
    padding:2px;
}


table.blogcalendar {
    border: 1px solid #3c78b5;
}

.blogcalendar th.calendarhead, a.calendarhead {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    text-transform:uppercase;
    background-color: #3c78b5;
    color: #ffffff;
    letter-spacing: .3em;
    text-transform: uppercase;
}

.calendarhead:visited {color: white;}
.calendarhead:active {color: white;}
.calendarhead:hover {color: white;}

.blogcalendar th {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    background-color:#f0f0f0;
}

.blogcalendar td {
    font-size:x-small;
    font-weight:normal;
}

.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; }
.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; }
.searchItem { padding: 1px 4px 1px 4px; }
.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; }

/* permissions page styles */
.permissionHeading {
    border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left;
}
.permissionTab {
    border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px;
}
.permissionSuperTab {
    border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff;
}
.permissionCell {
    border-left: #bbb; border-width: 0 0 0 1px; border-style: solid;
}

/* warning panel */
.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
/* alert panel */
.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
/* info panel */
.infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; }

/* side menu highlighting (e.g. space content screen) */
.optionPadded { padding: 2px; }
.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; }
.optionSelected a { font-weight: bold; text-decoration: none; color: black; }

/* information macros */
.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
.informationMacroPadding { padding: 5px 0 0 5px; }

table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
    border: none;
}

table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;}

.pagecontent
{
    padding: 10px;
    text-align: left;
}

/* styles for links in the top bar */
.topBarDiv a:link {color: #ffffff;}
.topBarDiv a:visited {color: #ffffff;}
.topBarDiv a:active {color: #ffffff;}
.topBarDiv a:hover {color: #ffffff;}
.topBarDiv {color: #ffffff;}

.topBar {
    background-color: #003366;
}


/* styles for extended operations */
.greyLinks a:link {color: #666666; text-decoration:underline;}
.greyLinks a:visited {color: #666666; text-decoration:underline;}
.greyLinks a:active {color: #666666; text-decoration:underline;}
.greyLinks a:hover {color: #666666; text-decoration:underline;}
.greyLinks {color: #666666; display:block; padding: 10px}

.logoSpaceLink {color: #999999; text-decoration: none}
.logoSpaceLink a:link {color: #999999; text-decoration: none}
.logoSpaceLink a:visited {color: #999999; text-decoration: none}
.logoSpaceLink a:active {color: #999999; text-decoration: none}
.logoSpaceLink a:hover {color: #003366; text-decoration: none}

/* basic panel (basicpanel.vmd) style */
.basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%}
.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;}
.basicPanelBody {padding: 5px; margin: 0px}

.separatorLinks a:link {color: white}
.separatorLinks a:visited {color: white}
.separatorLinks a:active {color: white}

.greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px}

div.headerField {
    float: left;
    width: auto;
    height: 100%;
}

.headerFloat {
    margin-left: auto;
    width: 50%;
}

.headerFloatLeft {
    float: left;
    margin-right: 20px;
    margin-bottom: 10px;
}

#headerRow {
    padding: 10px;
}

div.license-personal {
   background-color: #003366;
   color: #ffffff;
}

div.license-personal a {
   color: #ffffff;
}

.greyFormBox {
    border: 1px solid #cccccc;
    padding: 5px;
}

/* IE automatically adds a margin before and after form tags. Use this style to remove that */
.marginlessForm {
    margin: 0px;
}

.openPageHighlight {
    background-color: #ffffcc;
    padding: 2px;
    border: 1px solid #ddd;
}

.editPageInsertLinks, .editPageInsertLinks a
{
    color: #666666;
    font-weight: bold;
    font-size: 10px;
}

/* Style for label heatmap. */
.top10 a {
    font-weight: bold;
    font-size: 2em;
    color: #003366;
}
.top25 a {
    font-weight: bold;
    font-size: 1.6em;
    color: #003366;
}
.top50 a {
    font-size: 1.4em;
    color: #003366;
}
.top100 a {
    font-size: 1.2em;
    color: #003366;
}

.heatmap {
    list-style:none;
    width: 95%;
    margin: 0px auto;
}

.heatmap a {
    text-decoration:none;
}

.heatmap a:hover {
    text-decoration:underline;
}

.heatmap li {
    display: inline;
}

.minitab {
padding: 3px 0px 3px 8px;
margin-left: 0;
margin-top: 1px;
margin-bottom: 0px;
border-bottom: 1px solid #3c78b5;
font: bold 9px Verdana, sans-serif;
text-decoration: none;
float:none;
}
.selectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
background: white;
border-bottom: 1px solid white;
color: #000000;
text-decoration: none;
}
.unselectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
color: #ffffff;
text-decoration: none;
}

a.unselectedminitab:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

a.unselectedminitab:link { color: white; }
a.unselectedminitab:visited { color: white; }

a.selectedminitab:link { color: black; }
a.selectedminitab:visited { color: black; }

.linkerror { background-color: #fcc;}

a.labelOperationLink:link {text-decoration: underline}
a.labelOperationLink:active {text-decoration: underline}
a.labelOperationLink:visited {text-decoration: underline}
a.labelOperationLink:hover {text-decoration: underline}

a.newLabel:link {background-color: #ddffdd}
a.newLabel:active {background-color: #ddffdd}
a.newLabel:visited {background-color: #ddffdd}
a.newLabel:hover {background-color: #ddffdd}

ul.square {list-style-type: square}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
}


.inline-control-link a:link {text-decoration: none}
.inline-control-link a:active {text-decoration: none}
.inline-control-link a:visited {text-decoration: none}
.inline-control-link a:hover {text-decoration: none}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
}

div.auto_complete {
    width: 350px;
    background: #fff;
}
div.auto_complete ul {
    border: 1px solid #888;
    margin: 0;
    padding: 0;
    width: 100%;
    list-style-type: none;
}
div.auto_complete ul li {
    margin: 0;
    padding: 3px;
}
div.auto_complete ul li.selected {
    background-color: #ffb;
}
div.auto_complete ul strong.highlight {
    color: #800;
    margin: 0;
    padding: 0;
}

/******* Edit Page Styles *******/
.toogleFormDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    padding:5px;
    margin-top: 5px;
}

.toogleInfoDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    display:none;
    padding:5px;
    margin-top: 10px;
}

.inputSection{
    margin-bottom:20px;
}

#editBox{
   border:1px solid lightgray;
   background-color:#F0F0F0;
}

/******* Left Navigation Theme Styles ********/
.leftnav li a {
    text-decoration:none;
    color:white;
    margin:0px;
    display:block;
    padding:2px;
    padding-left:5px;
    background-color: #3c78b5;
    border-top:1px solid #3c78b5;
}

.leftnav li a:active {color:white;}
.leftnav li a:visited {color:white;}
.leftnav li a:hover {background-color: #003366; color:white;}

/* Added by Shaun during i18n */
.replaced
{
    background-color: #33CC66;
}

.topPadding
{
    margin-top: 20px;
}

/* new form style */
.form-block {
    padding: 6px;
}
.form-error-block {
    padding: 6px;
    background: #fcc;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-element-large {
    font-size: 16px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-element-small {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-header {
    background: lightyellow;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-header p, .form-block p, .form-error-block p {
    line-height: normal;
    margin: 12px 0 12px 0;
}
.form-example {
    color: #888;
    font-size: 11px;
}
.form-divider {
    border-bottom: #ccc 1px solid;
    margin-bottom: 6px;
}
.form-buttons {
    margin-top: 6px;
    border-top: #ccc 1px solid;
    border-bottom: #ccc 1px solid;
    background: #f0f0f0;
    padding: 10px;
    text-align: center;
}
.form-buttons input {
    width: 100px;
}
.form-block .error {
    padding: 6px;
    margin-bottom: 6px;
}
    -->
    </style>
</head>
<body>

<div id="PageContent">
<table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%"><tr>
<td valign="top" class="pagebody">

    <div class="pageheader">
        <span class="pagetitle">
            Page Edited :
            <a href="http://cwiki.apache.org/confluence/display/DIRxSRVx11">DIRxSRVx11</a> :
            <a href="http://cwiki.apache.org/confluence/display/DIRxSRVx11/Referral+Handling+Changes">Referral Handling Changes</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/DIRxSRVx11/Referral+Handling+Changes">Referral Handling Changes</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~elecharny">Emmanuel Lécharny</a>
            <span class="smallfont">(Oct 07, 2008)</span>.
     </p>
    <p>
      Change summary:
      <div class="greybox wiki-content"><p>Fixed the tables where some missing tests where present</p></div>
    </p>
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=91733&originalVersion=32&revisedVersion=33">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h1><a name="ReferralHandlingChanges-Introduction"></a>Introduction</h1>

<p>Since 1.0 the way referrals are handled in the core and in various layers above have changed.  This document is intended to updater those interested in the details of handling referrals in the server.</p>
<table cellpadding='5' width='85%' cellspacing='8px' class='tipMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>According to RFC 2251/4511, a referral is returned inside a LdapResult, if the result code is set to <b>referral</b>, or as one or more <b>SearchResultReference</b>.</p></td></tr></table>

<h1><a name="ReferralHandlingChanges-InfoonReferralsandJNDI"></a>Info on Referrals and JNDI</h1>

<ul>
	<li><span class="nobr"><a href="http://www.faqs.org/rfcs/rfc2251.html" title="Visit page outside Confluence" rel="nofollow">RFC 2251<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li><span class="nobr"><a href="http://www.faqs.org/rfcs/rfc3296.html" title="Visit page outside Confluence" rel="nofollow">RFC 3296<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li><span class="nobr"><a href="http://java.sun.com/products/jndi/tutorial/ldap/referral/index.html" title="Visit page outside Confluence" rel="nofollow">JNDI Tutorial on Referral Behavoir<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
</ul>


<h1><a name="ReferralHandlingChanges-ApacheDSImplementationNotes"></a>ApacheDS Implementation Notes</h1>

<p>Referral handling must be accounted for in two respects. At the protocol level in the MINA LDAP protocol provider (protocol-ldap module) and at the JNDI level in the core ApacheDS JNDI Provider (core-jndi module). Both must behave according to their respective specifications when dealing with referrals.</p>

<h2><a name="ReferralHandlingChanges-ChangesSince1.0"></a>Changes Since 1.0</h2>

<p>The ReferralInterceptor has been removed.  The core of ApacheDS no longer handles referrals at all.  All entries stored in the core are represented as standard entries returned as ServerEntry objects.  No longer does the core handle modes of throwing of exceptions, chasing them or ignoring them.  They're just entries in the core.</p>

<p>It is completely the responsibility of the core-jndi module to handle the expected modes and behavior for JNDI LDAP providers while dealing with referrals.  Likewise the protocol-ldap module is responsible for complying with LDAP specification requirements concerning the handling of referral entries with and without the presence of the ManageDSAiT Control.</p>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>We will restore a ReferralInterceptor for another reason: to avoid a performance penalty we have when doing a lookup to determinate if an entry has a referral ancestor. This interceptor will manage the Reefrral cache when adding/deleting or modifying a referral.</p></td></tr></table>

<h2><a name="ReferralHandlingChanges-MotivationforChanges"></a>Motivation for Changes</h2>

<p>The big bang effort to refactor JNDI constructs out of the server achieved many of it's intended goals.  JNDI was complicating the picture and often causing an impedance mismatch if not complete confusion on how to bridge between JNDI and the protocol.  There was too much complexity as a result.</p>

<p>With referrals we were mixing into the core, the requirements of JNDI LDAP providers and the LDAP protocol resulting in a mess when handling referrals in a clear fashion.  The code was hard to maintain and difficult to understand.  So we removed all the referral handling code which was mostly JNDI specific out of the core which removed the need to have a ReferralInterceptor all together.</p>

<p>Now it's the job of the LDAP protocol fontend and the core JNDI provider to apply the appropriate behavior in their own specific way.  This is cleaner because it does not mix the two different ways in which these layers above the core must deal with referrals.</p>

<p>Before the protocol-ldap module sat on top of the core which included the JNDI provider implementation.  Now the core JNDI provider has been moved out of the core into it's own module: core-jndi.  The protocol-ldap module no longer sits on top of the core JNDI provider but uses a new API to directly tap into the core without having to understand JNDI and deal with it's quirks.</p>

<h2><a name="ReferralHandlingChanges-ManageDsaITControl"></a>ManageDsaIT Control</h2>

<p>The ASN.1 subsystem understands the ManageDsaIT control and the server publishes that it supports this control in the RootDSE. The control determines how the LDAP protocol provider handles responses when present and referrals are encountered. There is no longer any JNDI in the protocol provider, so it does not need to pass controls down into the JNDI provider for the core to make critical decisions about request handing behavior.</p>

<h2><a name="ReferralHandlingChanges-Context.REFERRALProperty"></a>Context.REFERRAL Property</h2>

<p>The <em>Context.REFERRAL</em> property in the JNDI environment affects the way referrals are handled by JNDI LDAP providers including the core JNDI provider. According to JNDI specifications:</p>
<div class="preformatted"><div class="preformattedContent">
<pre>A JNDI application uses the Context.REFERRAL(in the API reference documentation)
("java.naming.referral") environment property to indicate to the service providers how
to handle referrals. The following table shows the values defined for this property. If this
property has not been set, then the default is to ignore referrals.
</pre>
</div></div>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'> Property Setting </td>
<td class='confluenceTd'> Description </td>
</tr>
<tr>
<th class='confluenceTh'> ignore </th>
<th class='confluenceTh'> Ignore referrals (they are considered as normal entries) </th>
</tr>
<tr>
<th class='confluenceTh'> follow </th>
<th class='confluenceTh'> Automatically follow any referrals </th>
</tr>
<tr>
<th class='confluenceTh'> throw </th>
<th class='confluenceTh'> Throw a ReferralException(in the API reference documentation) for each referral </th>
</tr>
</tbody></table>
<p>Based on the entry point, (via protocol or embedded JNDI) two mechanisms exist for controlling the underlying Referral handing mechanism.&nbsp; One uses the ManageDsaIT control and the other uses the Context.REFERRAL property.&nbsp; The presence of the ManageDsaIT control is the same as setting the environment property to <b>ignore</b> or not even setting the property in the environment since by absence the property is defaulted to <b>ignore</b>.</p>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>Odd as it sounds, adding an entry which is a subordinate of an existing referral into the server seems to be a possibility, using the ManageDSAIT control. This is not the case. As any modification of the data should keep the server in a consistent state, such an addition is obviously forbidden. (this has been discussed <span class="nobr"><a href="http://www.ietf.org/mail-archive/web/ldapext/current/msg00081.html" title="Visit page outside Confluence" rel="nofollow">here<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p></td></tr></table>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>The core-JNDI provider does not, at the moment, support the 'follow' property.</p></td></tr></table>

<h1><a name="ReferralHandlingChanges-ReferralHandlingScenarios"></a>Referral Handling Scenarios</h1>

<table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr>
<td class="confluenceTd"  valign="top" width="70%">
<p>Here's a slightly modified example DIT used in RFC 3296. We'll also use this to elaborate on the behavior of operations based on the different scenarios outlined in 3296.</p>
<table cellpadding='5' width='85%' cellspacing='8px' class='infoMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/information.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Legend</b><br />
<p>Green nodes are actual entries. Red nodes are referrals.</p></td></tr></table>

<h2><a name="ReferralHandlingChanges-Findingtargetinnonsearchoperations"></a>Finding target in non-search operations</h2>

<p>The handling for <b>add</b>, <b>compare</b>, <b>delete</b>, <b>modify</b> and <b>modify DN</b> operations to the target entry operated on is the same. The RFC gets a bit confusing when describing different scenarios and it's examples are lacking. They could have picked referrals where the <b>DN</b> is not the same as the reference to better demonstrate what they exactly meant. Regardless there seems to be 3 cases worth considering (whether the added entry is a referral or not is irrelevant) :</p>
<ol>
	<li>target is present, and has no ancestor which is a referral</li>
	<li>target is not present, and no ancestor is a referral</li>
	<li>target is not present, but an ancestor is a referral</li>
</ol>


<p>(the special case "target is present, and has an ancestor which is a referral" is impossible...).</p>

<p>If we consider the tree we are using for our samples, those 3 cases can be represented as :</p>
<ol>
	<li>target's DN is "o=MNN,c=WW" or "ou=people, o=MNN, c=WW" (in this last example, the associated entry will be a referral.</li>
	<li>target's DN is "o=absent,c=WW"</li>
	<li>target's DN is "cn=Alex karasulu,ou=people,o=MNN,c=WW"</li>
</ol>
</td>
<td class="confluenceTd"  valign="top" width="30%"><p><div align="center"><img src="/confluence/download/attachments/91733/exampleDit.png" border="0" /></div></p>
<div class="code"><div class="codeHeader"><b>OU=People,O=MNN,C=WW</b></div><div class="codeContent">
<pre class="code-java">ou: People
ref: ldap:<span class="code-comment">//hostb/OU=People,DC=example,DC=com
</span>ref: ldap:<span class="code-comment">//hostc/OU=People,O=MNN,C=WW
</span>objectClass: referral
objectClass: extensibleObject</pre>
</div></div>
<div class="code"><div class="codeHeader"><b>OU=Roles,O=MNN,C=WW</b></div><div class="codeContent">
<pre class="code-java">ou: Roles
ref: ldap:<span class="code-comment">//hostd/ou=Roles,dc=apache,dc=org
</span>objectClass: referral
objectClass: extensibleObject</pre>
</div></div></td></tr></tbody></table>

<h2><a name="ReferralHandlingChanges-ReferralsandLDAPoperations"></a>Referrals and LDAP operations</h2>

<p>We now will describe the way Referrals are handled, depending on the operation the server will receive. We will consider the three different cases :</p>
<ul class="alternate" type="square">
	<li>through JNDI</li>
	<li>through the server own API (CoreAPI)</li>
</ul>


<h3><a name="ReferralHandlingChanges-AddOperationhandling"></a>Add Operation handling</h3>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> test <br clear="all" /> </th>
<th class='confluenceTh'> target exists </th>
<th class='confluenceTh'> is a referral </th>
<th class='confluenceTh'> has an ancestor </th>
<th class='confluenceTh'> JNDI/Core handling </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> 1 </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> Irrelevant </td>
<td class='confluenceTd'> Adds the entry into the server <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> JNDI ignore </td>
<td class='confluenceTd'> The JNDI provider will throw a PartialResultException <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 3 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI throw </td>
<td class='confluenceTd'> The JNDI provider will throw a LdapReferralException <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 4 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API <br clear="all" /> </td>
<td class='confluenceTd'> The Core API will throw a LdapReferralException <br clear="all" />
Equivalent to the JNDI throw handling <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 5 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> The Core API will throw a PartialResultException <br clear="all" />
Equivalent to the JNDI ignore handling <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 6 </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Throws an EntryAlreadyExists error </td>
</tr>
</tbody></table>

<h4><a name="ReferralHandlingChanges-Test1"></a>Test 1</h4>

<p>We try to add the following entry :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">dn: cn=Alex karasulu, c=MNN, c=WW
ObjectClass: top
ObjectClass:person
cn: Alex Karasulu
sn: alex</pre>
</div></div>
<p>As a result, we should be able to find the entry in the local server.</p>

<h4><a name="ReferralHandlingChanges-Test2%265"></a>Test 2 &amp; 5</h4>

<p>We try to add the following entry, using the Context.REFERRAL=ignore property (JNDI) or adding the ManageDsaIT control (Core API) :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">dn: cn=Alex karasulu, ou=users, ou=people , c=MNN, c=WW
ObjectClass: top
ObjectClass:person
cn: Alex Karasulu
sn: alex</pre>
</div></div>
<p>We should get a PartialResultException containing the <b>ou=people,c=MNN,c=WW</b> result</p>

<h4><a name="ReferralHandlingChanges-Test3%264"></a>Test 3 &amp; 4</h4>

<p>We try to add the following entry, using the Context.REFERRAL=throw property (JNDI) or without the ManageDsaIT control (Core API) : :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">dn: cn=Alex karasulu, ou=users, ou=people , c=MNN, c=WW
ObjectClass: top
ObjectClass:person
cn: Alex Karasulu
sn: alex</pre>
</div></div>
<p>We should get a LdapReferralException.</p>

<h4><a name="ReferralHandlingChanges-Test6"></a>Test 6</h4>

<p>We try to add the following entry twice :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">dn: cn=Alex karasulu, c=MNN, c=WW
ObjectClass: top
ObjectClass:person
cn: Alex Karasulu
sn: alex</pre>
</div></div>
<p>As a result, we should get an EntryAlreadyExist exception</p>

<h3><a name="ReferralHandlingChanges-DeleteOperationhandling"></a>Delete Operation handling</h3>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> test </th>
<th class='confluenceTh'> target exists </th>
<th class='confluenceTh'> is a referral </th>
<th class='confluenceTh'> has an ancestor </th>
<th class='confluenceTh'> JNDI/Core handling </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> 1 </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> Irrelevant </td>
<td class='confluenceTd'> Returns a NoSuchObject exception </td>
</tr>
<tr>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> JNDI+throw<br clear="all" /> </td>
<td class='confluenceTd'> Returns a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore<br clear="all" /> </td>
<td class='confluenceTd'> Throws a LdapReferralExceptionexception </td>
</tr>
<tr>
<td class='confluenceTd'> 3 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API </td>
<td class='confluenceTd'> Returns a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIt<br clear="all" /> </td>
<td class='confluenceTd'> Throws a LdapReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 4 </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> Irrelevant </td>
<td class='confluenceTd'> Remove the entry from the server </td>
</tr>
<tr>
<td class='confluenceTd'> 5 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> JND+throw </td>
<td class='confluenceTd'> Throw a LdapReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 6 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Remove the entry from the server </td>
</tr>
<tr>
<td class='confluenceTd'> 7 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> CoreAPI </td>
<td class='confluenceTd'> Throw a LdapReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 8 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIt </td>
<td class='confluenceTd'> Remove the entry from the server </td>
</tr>
</tbody></table>

<h4><a name="ReferralHandlingChanges-Test1"></a>Test 1</h4>

<p>Trying to delete dn: <b>cn=not present, c=MNN, c=WW</b> should fail</p>

<h4><a name="ReferralHandlingChanges-Test2%263"></a>Test 2 &amp; 3</h4>

<p>Trying to delete dn: <b>cn=alex karasulu, ou=people, c=MNN, c=WW</b> should throw a PartialResultException</p>

<h4><a name="ReferralHandlingChanges-Test4"></a>Test 4</h4>

<p>We should be able to delete dn: <b>o=MNN, c=WW</b></p>

<h4><a name="ReferralHandlingChanges-Test5%267"></a>Test 5 &amp; 7</h4>

<p>Trying to delete dn: <b>ou=people, c=MNN, c=WW</b> should throw a ReferralException</p>

<h4><a name="ReferralHandlingChanges-Test6%268"></a>Test 6 &amp; 8</h4>

<p>We should be able to delete dn: <b>ou=people, c=MNN, c=WW</b></p>

<h3><a name="ReferralHandlingChanges-CompareOperationhandling"></a>Compare Operation handling</h3>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> test </th>
<th class='confluenceTh'> target exists </th>
<th class='confluenceTh'> is a referral </th>
<th class='confluenceTh'> has an ancestor </th>
<th class='confluenceTh'> JNDI/Core handling </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> 1 </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> Irrelevant </td>
<td class='confluenceTd'> Returns a NoSuchObject exception </td>
</tr>
<tr>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Returns a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore<br clear="all" /> </td>
<td class='confluenceTd'> Throws a LdapReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 3 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API </td>
<td class='confluenceTd'> Returns a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT<br clear="all" /> </td>
<td class='confluenceTd'> Throws a LdapReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 4 </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> Irrelevant </td>
<td class='confluenceTd'> Returns the comparison result </td>
</tr>
<tr>
<td class='confluenceTd'> 5 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Throws a LdapReferralException exception<br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 6 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore<br clear="all" /> </td>
<td class='confluenceTd'> Returns the comparison result </td>
</tr>
<tr>
<td class='confluenceTd'> 7 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> CoreAPI </td>
<td class='confluenceTd'> Throws a LdapReferralException exception<br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 8 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Returns the comparison result </td>
</tr>
</tbody></table>

<h4><a name="ReferralHandlingChanges-test1"></a>test 1</h4>

<p>Doing a compare on attribute <b>Objectclass</b> for <b>cn=not present, c=MNN, c=WW</b> should fail with a NoSuchObject exception</p>

<h4><a name="ReferralHandlingChanges-test2%263"></a>test 2 &amp; 3</h4>

<p>Doing a compare on attribute <b>Objectclass</b> for <b>cn=alex karasulu, ou=people, c=MNN, c=WW</b> should throw a PartialResultexception</p>

<h4><a name="ReferralHandlingChanges-test4"></a>test 4</h4>

<p>Doing a compare on attribute <b>Objectclass</b> for <b>c=MNN, c=WW</b> should return a success</p>

<h4><a name="ReferralHandlingChanges-test5%267"></a>test 5 &amp; 7</h4>

<p>Doing a compare on attribute <b>Objectclass</b> for <b>ou=people, c=MNN, c=WW</b> should throw a ReferralException</p>

<h4><a name="ReferralHandlingChanges-test6%268"></a>test 6 &amp; 8</h4>

<p>Doing a compare on attribute <b>Objectclass</b> for <b>ou=people, c=MNN, c=WW</b> should should return a success</p>

<h3><a name="ReferralHandlingChanges-ModifyOperationhandling"></a>Modify Operation handling</h3>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> test </th>
<th class='confluenceTh'> Target exists </th>
<th class='confluenceTh'> is a referral </th>
<th class='confluenceTh'> has an ancestor </th>
<th class='confluenceTh'> JNDI/Protocol handling </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> 1 </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevent </td>
<td class='confluenceTd'> Throws a NoSuchObject exception </td>
</tr>
<tr>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Throws a PartialResultException </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore<br clear="all" /> </td>
<td class='confluenceTd'> Throws a LdapReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 3 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API </td>
<td class='confluenceTd'> Throws a PartialResultException </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Throws a LdapReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 4 </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Modify the entry on the server </td>
</tr>
<tr>
<td class='confluenceTd'> 5 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Throws a LdapReferralException </td>
</tr>
<tr>
<td class='confluenceTd'> 6 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore<br clear="all" /> </td>
<td class='confluenceTd'> Modify the referral on the server </td>
</tr>
<tr>
<td class='confluenceTd'> 7 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API </td>
<td class='confluenceTd'> Throws a LdapReferralException exception<br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 8 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Modify the referral on the server </td>
</tr>
</tbody></table>

<h4><a name="ReferralHandlingChanges-Test1"></a>Test 1</h4>

<p>Doing a modify on <b>cn=not present, c=MNN, c=WW</b> should fail with a NoSuchObjectException</p>

<h4><a name="ReferralHandlingChanges-Test2%263"></a>Test 2 &amp; 3</h4>

<p>Doing a modify on <b>cn=alex karasulu, ou=people, c=MNN, c=WW</b> should throw a LdapPartialResult exception</p>

<h4><a name="ReferralHandlingChanges-Test4"></a>Test 4</h4>

<p>Doing a modify on <b>c=MNN, c=WW</b> should modify the entry on the server</p>

<h4><a name="ReferralHandlingChanges-Test5%267"></a>Test 5 &amp; 7</h4>

<p>Doing a modify on <b>ou=people, c=MNN, c=WW</b> should throw a LdapReferral exception</p>

<h4><a name="ReferralHandlingChanges-Test6%268"></a>Test 6 &amp; 8</h4>

<p>Doing a modify on <b>ou=people, c=MNN, c=WW</b> should modify the referral on the server</p>

<h3><a name="ReferralHandlingChanges-ModifyDNOperationhandling"></a>ModifyDN Operation handling</h3>

<p>The ModifyDN operation is slightly more complicated, as we may change two things which might affect the operation :</p>

<p>&#45; the new DN (it's a rename)</p>

<p>&#45; the new Superior (it's a move)</p>

<p>And we can combine those two modifications (it's a move and rename).</p>

<p>One more important thing : the RFC states that :</p>
<div class="preformatted"><div class="preformattedHeader"><b>RFC 3296 Section 5.6.2</b></div><div class="preformattedContent">
<pre>If the newSuperior is a referral object or is subordinate to a
    referral object, the server SHOULD return affectsMultipleDSAs.  If
    the newRDN already exists but is a referral object, the server SHOULD
    return affectsMultipleDSAs instead of entryAlreadyExists.
</pre>
</div></div>
<p>We will analyze those three kind of modifications separately.</p>

<h4><a name="ReferralHandlingChanges-Renameoperation"></a>Rename operation</h4>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> test </th>
<th class='confluenceTh'> Entry exists </th>
<th class='confluenceTh'> New RDN exists </th>
<th class='confluenceTh'> is a referral </th>
<th class='confluenceTh'> has an ancestor </th>
<th class='confluenceTh'> JNDI/Protocol handling </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> 1 </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevent </td>
<td class='confluenceTd'> Throws a NameNotFoundException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Throws a ReferralException </td>
</tr>
<tr>
<td class='confluenceTd'> 3 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore<br clear="all" /> </td>
<td class='confluenceTd'> Throws a PartialResultException </td>
</tr>
<tr>
<td class='confluenceTd'> 4 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API </td>
<td class='confluenceTd'> Throws a ReferralException </td>
</tr>
<tr>
<td class='confluenceTd'> 5 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Throws a PartialResultException </td>
</tr>
<tr>
<td class='confluenceTd'> 6 </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Renames the entry on the server </td>
</tr>
<tr>
<td class='confluenceTd'> 7 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Throws a ReferralException </td>
</tr>
<tr>
<td class='confluenceTd'> 8 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Renames the referral on the server </td>
</tr>
<tr>
<td class='confluenceTd'> 9 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API </td>
<td class='confluenceTd'> Throws a ReferralException </td>
</tr>
<tr>
<td class='confluenceTd'> 10 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Renames the referral on the server </td>
</tr>
<tr>
<td class='confluenceTd'> 11 </td>
<td class='confluenceTd'> <br clear="all" /> </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Throws a NameAlreadyBoundException&nbsp; exception </td>
</tr>
<tr>
<td class='confluenceTd'> 12 </td>
<td class='confluenceTd'> <br clear="all" /> </td>
<td class='confluenceTd'> <br clear="all" /> </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Throws a ReferralException </td>
</tr>
<tr>
<td class='confluenceTd'> 13 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Throws a NameAlreadyBoundException&nbsp; exception </td>
</tr>
<tr>
<td class='confluenceTd'> 14 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API <br clear="all" /> </td>
<td class='confluenceTd'> Throws a ReferralException </td>
</tr>
<tr>
<td class='confluenceTd'> 15 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Throws a NameAlreadyBoundException&nbsp; exception </td>
</tr>
</tbody></table>

<h5><a name="ReferralHandlingChanges-Test1"></a>Test 1</h5>

<p>Renaming <b>cn=not present, c=MNN, c=WW</b> to <b>cn=akarasulu, c=MNN, c=WW</b> on  should fail with a NameNotFoundException</p>

<h5><a name="ReferralHandlingChanges-Test2%264"></a>Test 2 &amp; 4</h5>

<p>Renaming <b>cn=not present, ou=people, c=MNN, c=WW</b> to <b>cn=new name, ou=</b><b>people</b><b>, c=MNN, c=WW</b> should throw a ReferralException exception</p>

<h5><a name="ReferralHandlingChanges-Test3%265"></a>Test 3 &amp; 5</h5>

<p>Renaming <b>cn=</b><b>not present</b><b>, ou=people, c=MNN, c=WW</b> to <b>cn=new name, ou=</b><b>people</b><b>, c=MNN, c=WW</b> should throw a LdapPartialResult exception</p>

<h5><a name="ReferralHandlingChanges-Test6"></a>Test 6</h5>

<p>Renaming <b>cn=Alex Karasulu, c=MNN, o=WW</b> to <b>cn=Alex, c=MNN, o=WW</b> should rename the entry on the server</p>

<h5><a name="ReferralHandlingChanges-Test7%269"></a>Test 7 &amp; 9</h5>

<p>Renaming <b>ou=people, c=MNN, c=WW</b> to <b>cn=new name, c=MNN, c=WW</b> should throw a LdapReferral exception</p>

<h5><a name="ReferralHandlingChanges-Test8%2610"></a>Test 8 &amp; 10</h5>

<p>Renaming <b>ou=people, c=MNN, c=WW</b> to <b>cn=new name, c=MNN, c=WW</b> shouldrename the referral on the server</p>

<h5><a name="ReferralHandlingChanges-Test11"></a>Test 11</h5>

<p>Renaming <b>ou=Alex Karasulu, c=MNN, c=WW</b> to <b>cn=Emmanuel Lecharny, c=MNN, c=WW</b> should throw a NameAlreadyBoundException exception (both entry already exist)</p>

<h5><a name="ReferralHandlingChanges-Test12%2614"></a>Test 12 &amp; 14</h5>

<p>Renaming <b>ou=people, c=MNN, c=WW</b> to <b>ou=roles</b><b>, c=MNN, c=WW</b> should throw a ReferralException</p>

<h5><a name="ReferralHandlingChanges-Test13%2615"></a>Test 13 &amp; 15</h5>

<p>Renaming <b>ou=people, c=MNN, c=WW</b> to <b>ou=roles</b><b>, c=MNN, c=WW</b> should throw a NameAlreadyBoundException</p>

<h4><a name="ReferralHandlingChanges-Moveoperation"></a>Move operation</h4>

<p>It's a bit different than the rename operation, as we may have an existing new superior, but with a non existing combinaison of the oldRDN + new superior.</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> test </th>
<th class='confluenceTh'> OldSuperior <br clear="all" />
 exists </th>
<th class='confluenceTh'> OldSuperior <br clear="all" />
 has an ancestor </th>
<th class='confluenceTh'> OldSuperior <br clear="all" />
 is a referral </th>
<th class='confluenceTh'> New superior <br clear="all" />
 exists </th>
<th class='confluenceTh'> NewSuperior <br clear="all" />
 is a referral </th>
<th class='confluenceTh'> NewSuperior <br clear="all" />
 has an ancestor </th>
<th class='confluenceTh'> JNDI/Protocol <br clear="all" />
 handling </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> 1 </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevent </td>
<td class='confluenceTd'> Throws a NameNotFoundException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> JND+throw </td>
<td class='confluenceTd'> Throws a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 3 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Throws a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'> 4 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API <br clear="all" /> </td>
<td class='confluenceTd'> Throws a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 5 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Throws a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'> 6 </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevent </td>
<td class='confluenceTd'> Move the branch Handle inner referrals </td>
</tr>
<tr>
<td class='confluenceTd'> 7 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Returns a AffectMultipleDsasresult </td>
</tr>
<tr>
<td class='confluenceTd'> 8 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Returns a AffectMultipleDsasresult </td>
</tr>
<tr>
<td class='confluenceTd'> 9 <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> JND+throw </td>
<td class='confluenceTd'> Throws a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 10 <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Throws a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'> 11 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API <br clear="all" /> </td>
<td class='confluenceTd'> Throws a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 12 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Throws a PartialResult exception </td>
</tr>
</tbody></table>

<h5><a name="ReferralHandlingChanges-Test1"></a>Test 1</h5>

<p>Moving <b>c=MNN, cn=not present</b> to <b>c=MNN, c=XX</b> on  should fail with a NameNotFoundException</p>

<h5><a name="ReferralHandlingChanges-Test2%264"></a>Test 2 &amp; 4</h5>

<p>Moving <b>cn=Emmanuel Lecharny, ou=apache, ou=People, c=MNN, c=WW</b> to <b>cn=Emmanuel Lecharny, ou=apache, ou=org</b> should throw a ReferralException exception.</p>

<h5><a name="ReferralHandlingChanges-Test3%265"></a>Test 3 &amp; 5</h5>

<p>Moving <b>cn=alex karasulu, ou=apache, ou=people, c=MNN, c=WW</b> to <b>cn=alex karasulu, ou=asf, ou=people, c=MNN, c=WW</b> should throw a PartialResultException exception.</p>

<h5><a name="ReferralHandlingChanges-Test6"></a>Test 6</h5>

<p>Moving <b>cn=Alex Karasulu, c=MNN, c=WW</b> to <b>cn=Alex Karasulu, c=MNN, c=XX</b> should move the branch to it's new place, with all the children.</p>

<h5><a name="ReferralHandlingChanges-Test7"></a>Test 7</h5>

<p>Moving <b>cn=Alex, c=MNN, c=WW</b> to <b>cn=Alex, ou=people, c=MNN, c=WW</b> should throw a AffetcsMultipleDSAs result.</p>

<h5><a name="ReferralHandlingChanges-Test8"></a>Test 8</h5>

<p>&nbsp;Moving <b>cn=Alex, c=MNN, c=WW</b> to <b>cn=Alex, ou=apache, ou=people, c=MNN, c=WW</b> should throw a AffetcsMultipleDSAs result.</p>

<h5><a name="ReferralHandlingChanges-Test9%2611"></a>Test 9 &amp; 11</h5>

<p>Moving <b>cn=Alex, ou=apache, ou=people c=MNN, c=WW</b> to <b>cn=Alex, ou=people, c=MNN, c=WW</b> should throw a ReferralException exception.</p>

<h5><a name="ReferralHandlingChanges-Test10%2612"></a>Test 10 &amp; 12</h5>

<p>Moving <b>cn=Alex,ou=apache, ou=people, c=MNN, c=WW</b> to <b>cn=Alex, c=not present</b> should throw a PartialResult exception.</p>

<h4><a name="ReferralHandlingChanges-Moveandrenameoperation"></a>Move and rename operation</h4>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> test </th>
<th class='confluenceTh'> Old DN <br clear="all" />
 exists </th>
<th class='confluenceTh'> Old Superior <br clear="all" />
 is a referral <br clear="all" />
 or has an ancestor </th>
<th class='confluenceTh'> New DN <br clear="all" />
 exists </th>
<th class='confluenceTh'> New Superior <br clear="all" />
 is a referral <br clear="all" />
 or has an ancestor </th>
<th class='confluenceTh'> JNDI/Core API <br clear="all" /> </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> 1 </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant <br clear="all" /> </td>
<td class='confluenceTd'> Throws a NameNotFoundException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 2 <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes(has an ancestor) <br clear="all" /> </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant <br clear="all" /> </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Throws a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 3 <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Throws a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'> 4 <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API <br clear="all" /> </td>
<td class='confluenceTd'> Throws a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 5 <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Throws a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'> 6 <br clear="all" /> </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Moves and renames the entry, and the children </td>
</tr>
<tr>
<td class='confluenceTd'> 7 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> irrelevant <br clear="all" /> </td>
<td class='confluenceTd'> Throws a AffectMultipleDsas </td>
</tr>
<tr>
<td class='confluenceTd'> 8 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes <br clear="all" /> </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant <br clear="all" /> </td>
<td class='confluenceTd'> Throws an NameAlreadyBoundException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 9 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes (is a referral) <br clear="all" /> </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Throws a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 10 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Throws a PartialResult exception </td>
</tr>
<tr>
<td class='confluenceTd'> 11 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API <br clear="all" /> </td>
<td class='confluenceTd'> Throws a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 12 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Throws a PartialResult exception </td>
</tr>
</tbody></table>

<h5><a name="ReferralHandlingChanges-Test1"></a>Test 1</h5>

<p>Trying to move and rename <b>ou=not present, o=MNN, c=WW</b> to whatever DN should throw a NameNotFoundException exception</p>

<h5><a name="ReferralHandlingChanges-Test2%264"></a>Test 2 &amp; 4</h5>

<p>Trying to move and rename <b>cn=alex karasulu, ou=apache, ou=people, o=MNN, c=WW</b> to whatever DN should throw a ReferralException exception</p>

<h5><a name="ReferralHandlingChanges-test3%265"></a>test 3 &amp; 5</h5>

<p>Trying to move and rename <b>cn=alex karasulu,ou=apache,&nbsp; ou=people, o=MNN, c=WW</b> to whatever DN should throw a partialResultException exception</p>

<h5><a name="ReferralHandlingChanges-test6"></a>test 6</h5>

<p>Trying to move and rename <b>cn=alex karasulu,o=MNN, c=WW</b> to <b>cn=Alex,o=PNN,c=WW</b> should move and rename the entry</p>

<h5><a name="ReferralHandlingChanges-test7"></a>test 7</h5>

<p>Trying to move and rename <b>cn=alex karasulu,o=MNN, c=WW</b> to <b>cn=Alex, ou=People, o=MNN, c=WW</b> should give a AffectsMultipleDSAs result</p>

<h5><a name="ReferralHandlingChanges-test8"></a>test 8</h5>

<p>Trying to move and rename <b>cn=Alex Karasulu,o=MNN, c=WW</b> to <b>cn=Emmanuel Lecharny, o=PNN, c=WW</b> DN should throw a NameAlreadyBoundException exception</p>

<h5><a name="ReferralHandlingChanges-test9%2611"></a>test 9 &amp; 11</h5>

<p>Trying to move and rename <b>cn=Alex Karasulu,ou=People,c=MNN, c=WW</b> to <b>cn=Alex, c=PNN, c=WW</b> should throw a ReferralException exception</p>

<h5><a name="ReferralHandlingChanges-test10%2612"></a>test 10 &amp; 12</h5>

<p>Trying to move and rename<b>cn=Alex Karasulu,ou=People,c=MNN, c=WW</b> to <b>cn=Alex, c=PNN, c=WW</b> should throw a PartialResultException exception</p>

<h3><a name="ReferralHandlingChanges-SearchOperationhandling"></a>Search Operation handling</h3>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> test </th>
<th class='confluenceTh'> Target exists </th>
<th class='confluenceTh'> is a referral </th>
<th class='confluenceTh'> has an ancestor </th>
<th class='confluenceTh'> JNDI/Protocol handling </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> 1 </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Throws a NameNotFoundException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Returns a ReferralException exception </td>
</tr>
<tr>
<td class='confluenceTd'> 3 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Throws a PartialResultException </td>
</tr>
<tr>
<td class='confluenceTd'> 4 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API </td>
<td class='confluenceTd'> Returns a SearchResultReference </td>
</tr>
<tr>
<td class='confluenceTd'> 5 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Throws a PartialResultException </td>
</tr>
<tr>
<td class='confluenceTd'> 6 </td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> no </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> Returns the search result </td>
</tr>
<tr>
<td class='confluenceTd'> 7 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> yes </td>
<td class='confluenceTd'> irrelevant </td>
<td class='confluenceTd'> JNDI+throw </td>
<td class='confluenceTd'> Returns a SearchResultReference </td>
</tr>
<tr>
<td class='confluenceTd'> 8 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> JNDI+ignore </td>
<td class='confluenceTd'> Returns the entry </td>
</tr>
<tr>
<td class='confluenceTd'> 9 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API </td>
<td class='confluenceTd'> Returns a SearchResultReference </td>
</tr>
<tr>
<td class='confluenceTd'> 10 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Core API+ManageDsaIT </td>
<td class='confluenceTd'> Returns the entry </td>
</tr>
</tbody></table>

<h4><a name="ReferralHandlingChanges-Test1"></a>Test 1</h4>

<p>Searching for <b>cn=not present, c=WW</b> should return an empty result</p>

<h4><a name="ReferralHandlingChanges-Test2%264"></a>Test 2 &amp; 4</h4>

<p>Searching for <b>cn=alex karasulu, ou=apache, ou=people, c=MNN, c=WW</b> should return a SearchResultReference</p>

<h4><a name="ReferralHandlingChanges-Test3%265"></a>Test 3 &amp; 5</h4>

<p>Searching for <b>cn=alex karasulu, ou=apache, ou=people, c=MNN, c=WW</b> should throw a Partial Result Exception</p>

<h4><a name="ReferralHandlingChanges-Test6"></a>Test 6</h4>

<p>Searching for <b>c=MNN, c=WW</b> should return the entry.</p>

<h4><a name="ReferralHandlingChanges-Test7%269"></a>Test 7 &amp; 9</h4>

<p>Searching for &#42;ou=people, c=MNN, c=WW" should return a SearchResultReference</p>

<h4><a name="ReferralHandlingChanges-Test8%2610"></a>Test 8 &amp; 10</h4>

<p>Searching for &#42;ou=people, c=MNN, c=WW" should return the entry.</p>

<h2><a name="ReferralHandlingChanges-Othertechnicalconsiderations"></a>Other technical considerations</h2>

<p>case #1: Target is not a referral, has no ancestor which is a referraThe presence of the ManageDsaIT control is irrelevent.<br/>
&nbsp;JNDI handlingAs the entry is not a referral, whatever value is set to the Context.REFERRAL property, the response will be the same : the server simply returns the entry if it existsMINA provider handling &nbsp;</p>

<h4><a name="ReferralHandlingChanges-WithouttheManageDsaITcontrol"></a>Without the ManageDsaIT control</h4>

<p>When the target is a referral, the refs are returned back to the client with a resultCode of <b>REFFERAL</b> (example from RFC). If for example the client issues a <b>modify</b> for the target of "OU=People,O=MNN,C=WW", the server will return the following when the <b>ManageDsaIT</b> control is <b>NOT</b> present:</p>
<div class="code"><div class="codeHeader"><b>Server Response</b></div><div class="codeContent">
<pre class="code-java">ModifyResponse (referral) {
    ldap:<span class="code-comment">//hostb/OU=People,DC=example,DC=com
</span>    ldap:<span class="code-comment">//hostc/OU=People,O=MNN,C=WW
</span>}</pre>
</div></div>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Referral Modifications</b><br />
<p>The ref attribute values <b>SHOULD</b> be modified to exclude any scope, filter or attribute list from the URI if it is an LDAP URL. These search specific URL elements must be removed because the operation to be continued by chasing the referred are not be search operations.</p></td></tr></table>
<p>Let's consider how the request is handled regarding to the two layers : MINA provider and JNDI provider.</p>

<h5><a name="ReferralHandlingChanges-JNDIhandling"></a>JNDI handling</h5>

<p>In this situation, without the <b>ManageDsaIT</b> control, the ApacheDS LDAP frontend (MINA provider) will set the value of the Context.REFFERAL property to "<b>throw</b>" before issuing JNDI calls to the core. The JNDI operation on the ApacheDS JNDI DirContext will throw a ReferralException which shall contain everything needed for the LDAP frontend to respond properly. This also allows, embedding applications to see the same results they would encounter from the SUN JNDI LDAP Provider operating against a remote LDAP server.</p>

<h3><a name="ReferralHandlingChanges-Case%233%3ATarget%27sparentisareferral"></a>Case #3: Target's parent is a referral</h3>

<p>According to the RFC 3296 it appears as though the remaining name past the referral is appended to the DN of the ref attributes, if the values are LDAP URLs. Also if they are LDAP URLs the scope, filter and attribute terms are removed. The result is returned back. To illustrate this let's consider the example from the RFC where an add operation is performed with the target DN of "CN=Manager,OU=Roles,O=MNN,C=WW".</p>

<p>The dynamics of the add operation must be considered first WRT the ApacheDS JNDI provider. This operation can proceed in two ways. First via the lookup of the parent context, "OU=Roles,O=MNN,C=WW", followed by a createSubcontext() operation on it using the RDN of the target entry. Other way to perform the add operation is by looking up an ancestor context above the parent, "O=MNN,C=WW" for example, followed by a createSubcontext() operation using a name fragment like "CN=Manager,OU=Roles". The last situation is not performed by the ApacheDS LDAP frontend but it can be performed by an embedding application against the JNDI interfaces.</p>

<p>When the Context.REFERRAL environment property is not set (an implicit ignore) or is explicity set to the "<b>ignore</b>" String, the createSubcontext() operation, regardless of what parent or ancestor it is issued upon will create the target entry under the referral parent. Remember when referrals are ignored all referrals are processed as regular entries. The dynamics get interesting when the Context.REFFERAL property is set to "<b>throw</b>". Incidentally we will ignore the "<b>follow</b>" value for the property for the time being. In the first case where the createSubcontext() operation is performed on the parent, which is the the referral entry "OU=Roles,O=MNN,C=WW", the attempt to create a non-existing child will succeed unless logic is put into place. The logic must allow the Context implementation to detect the fact that it is a referral, and that the createSubcontext() operation being performed with the Context.REFERRAL property set to "<b>throw</b>" must be prevented. BTW If an attempt is made to lookup the parent context with the Context.REFERRAL property set to "<b>throw</b>" then a ReferralException will occur. So to get the parent we would have had to look it up with referral's ignored.</p>

<p>In the latter case, the createSubcontext() operation is being performed upon a (non-referral) ancestor with a name fragment for the target, "CN=Manager,OU=Role". The context used to perform the operation does not care what mode the Context.REFERRAL property is set to since it is not a referral itself. It will issue the add request against the nexus with the computed target DN. The only way to prevent incorrect creation of this entry, is to check through the target's lineage for an ancestor that is a referral. If no ancestor up to the root suffix context is a referral then the operation may proceed. We cannot just check if the parent is a referral because the parent may be a regular entry hidden under another referral: meaning the target's parent may have been created while ignoring referrals. So we must exhaust the entire lineage or short the process when we find a parent or ancestor that is a referral. This must happen within the JNDI provider when the Context.REFERRAL mode is set to "<b>ignore</b>".</p>

<h3><a name="ReferralHandlingChanges-Case%234%3ATarget%27sancestor%28notparent%29isareferral"></a>Case #4: Target's ancestor (not parent) is a referral</h3>

<p>This is very similar to the latter half of case #3 above. When Context.REFERRAL="<b>throw</b>", The ApacheDS JNDI provider must test to see if any ancestors of the target entry are referrals. The biggest difference here is in the processing of ref attribute value DN fields (if they are LDAP URLs). Here the remaining name after the referral ancestor is tacked onto the DN components of the ref value. So if we were performing a createSubcontext() to add "CN=OneDown,CN=Manager,OU=Role,O=MNN,C=WW", the ancestor "OU=Role,O=MNN,C=WW" is a referral. Now the parent "CN=Manager" may or may not exist. Whether the parent exists or not we have to check for the presence of a referral ancestor before allowing the add operation to proceed. Again the best place for this is within the JNDI provider. In this example the returned AddResponse would be:</p>
<div class="code"><div class="codeHeader"><b>AddResponse</b></div><div class="codeContent">
<pre class="code-java">AddResponse (referral) {
        ldap:<span class="code-comment">//hostd/CN=OneDown,CN=Manager,ou=Roles,dc=apache,dc=org
</span>    }</pre>
</div></div>
<table cellpadding='5' width='85%' cellspacing='8px' class='warningMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/forbidden.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">"Review &amp; update for 1.5 stopped here!!!"</b><br />
<p>&#126;akarasulu</p></td></tr></table>

<h3><a name="ReferralHandlingChanges-ProtocolHandlers"></a>Protocol Handlers</h3>

<p>Since the LDAP protocol provider no longer sits on the JNDI Provider it no longer delegates checks for referrals to the JNDI provider. Each handler must handle referral semantics as specified by the protocol where referrals are concerned. In most write based handlers this just means the handlers must check if the target entry is a referral and issue the correct result codes and URIs.</p>

<h2><a name="ReferralHandlingChanges-Findingbaseofsearchoperations"></a>Finding base of search operations</h2>

<p>Here we discuss referral handling for finding the search base which is very similar to finding the targets of other operations. Unlike the other operations if we encounter a referral while finding the search base we must add a search scope specifier to the ref if it's value is an LDAP URL. Also critical extensions MUST NOT be trimmed nor modified.</p>

<p>Another difference to calculating ref values is in factoring in alias dereferrencing. This is where things seem to get a little tricky but not really. Whether or not the name for the discovered referral is an aliased name or the primary processing of the URL DN in ref values is the same. Only the remaining name, the remaining part of the search base DN after the referral's DN, is needed and appended to the the DN of the URL in the ref value. Either it's easier in ApacheDS because of the architecture or we're way oversimplifying this. Now let's review the cases for referral handling while finding the search base.</p>
<ol>
	<li>base is a normal entry (<b>default</b>)</li>
	<li>base is a referral</li>
	<li>base's parent is a referral</li>
	<li>base's parent is or is not present, but an ancestor is a referral</li>
</ol>


<p>Case #1 is the default case and will be skipped for consideration/elaboration.</p>

<h3><a name="ReferralHandlingChanges-Case%232%3ASameasforfindingtargetentrieswithURLhandlingdifferences"></a>Case #2: Same as for finding target entries with URL handling differences</h3>

<p>An example is best for this case. We'll take the one in the RFC. If the client issues a subtree search in which the base object is "OU=Roles,O=MNN,C=WW", the server will return:</p>
<div class="code"><div class="codeHeader"><b>SearchResultDone</b></div><div class="codeContent">
<pre class="code-java">SearchResultDone (referral) {
        ldap:<span class="code-comment">//hostd/ou=Roles,dc=apache,dc=org??sub
</span>    }</pre>
</div></div>
<p>Notice the extra subtree scope parameter tacked onto the URL.</p>

<h3><a name="ReferralHandlingChanges-Case%233%3ASameasforfindingtargetentrieswithURLhandlingdifferences"></a>Case #3: Same as for finding target entries with URL handling differences</h3>

<p>Again an example is best for this case. We'll take the one in the RFC. If the client issues a base scoped search in which the base object is "CN=Manaager,OU=Roles,O=MNN,C=WW", the server will return:</p>
<div class="code"><div class="codeHeader"><b>SearchResultDone</b></div><div class="codeContent">
<pre class="code-java">SearchResultDone (referral) {
        ldap:<span class="code-comment">//hostd/CN=Manager,ou=Roles,dc=apache,dc=org??base
</span>    }</pre>
</div></div>
<p>Notice the extra subtree scope parameter tacked onto the URL.</p>

<p>I won't elaborate on Case #4 since it's pretty much the same concept.</p>

<h2><a name="ReferralHandlingChanges-Backontrackwithsearchcontinuations"></a>Back on track with search continuations</h2>

<p>So for each referral within scope, we have to return a SearchResultReference using the URI compoents of the ref attribute. Here's what we have to do to transform that URI:</p>
<ul>
	<li>If the URI component is not a LDAP URL, it should be<br/>
 returned as is.</li>
	<li>If the LDAP URL's DN part is absent or empty, the DN<br/>
 part must be modified to contain the DN of the referral object.</li>
	<li>If the URI component is a LDAP URL, the URI SHOULD be modified to<br/>
 add an explicit scope specifier.</li>
</ul>


<h3><a name="ReferralHandlingChanges-SubtreeExample%28FromRFC3296%29"></a>Subtree Example (From RFC 3296)</h3>

<p>Subtree search of "O=MNN,C=WW" with filter (objectClass=*) might return:</p>
<div class="code"><div class="codeHeader"><b>Subtree Results</b></div><div class="codeContent">
<pre class="code-java">SearchEntry <span class="code-keyword">for</span> O=MNN,C=WW
SearchResultReference {
    ldap:<span class="code-comment">//hostb/OU=People,DC=example,DC=com??sub
</span>    ldap:<span class="code-comment">//hostc/OU=People,O=MNN,C=WW??sub
</span>}
SearchEntry <span class="code-keyword">for</span> CN=Manager,O=MNN,C=WW
SearchResultReference {
    ldap:<span class="code-comment">//hostd/OU=Roles,dc=apache,dc=org??sub
</span>}
SearchResultDone (success)</pre>
</div></div>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Smart Filter Alteration</b><br />
<p>If the filter contains an objectClass=&#42; OR branch there is no point to altering it. Might want to look into a simple test for this before altering the filter to add a new branch node and OR term. (objectClass=*) is common and it makes (objectClass=referral) redundant.</p></td></tr></table>

<h3><a name="ReferralHandlingChanges-OneLevelExample%28FromRFC3296%29"></a>One Level Example (From RFC 3296)</h3>

<p>Same search but scope is one level on the same base:</p>
<div class="code"><div class="codeHeader"><b>Subtree Results</b></div><div class="codeContent">
<pre class="code-java">SearchResultReference {
    ldap:<span class="code-comment">//hostb/OU=People,DC=example,DC=com??sub
</span>    ldap:<span class="code-comment">//hostc/OU=People,O=MNN,C=WW??sub
</span>}
SearchEntry <span class="code-keyword">for</span> CN=Manager,O=MNN,C=WW
SearchResultReference {
    ldap:<span class="code-comment">//hostd/OU=Roles,dc=apache,dc=org??sub
</span>}
SearchResultDone (success)</pre>
</div></div>

<h1><a name="ReferralHandlingChanges-ProcessingConsiderationsforOtherOperations"></a>Processing Considerations for Other Operations</h1>


<h2><a name="ReferralHandlingChanges-Operations"></a>Operations</h2>

<p>We won't have to implement every operations in the interceptor : some of them are not necessary, like operations which do not modify the entries. For instance, <b>bind()</b> operation is not implemented.</p>

<p>Here is the list of operations defined in the interface, and the list of operations we implement in <b>ReferralInterceptor</b> (the missing methods are already implemented in the intermediate abstract class) :</p>
<table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr>
<td class="confluenceTd"  valign="top">
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Interface </th>
<th class='confluenceTh'> ReferralInterceptor </th>
</tr>
<tr>
<td class='confluenceTd'> add </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> addContextPartition </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> bind </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> compare </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> delete </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> destroy </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
</tbody></table></td>
<td class="confluenceTd"  valign="top">
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Interface </th>
<th class='confluenceTh'> ReferralInterceptor </th>
</tr>
<tr>
<td class='confluenceTd'> getMatchedName </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> getRootDSE </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> getSuffix </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> hasEntry </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> init </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
</tbody></table></td></tr></tbody></table>
<table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr>
<td class="confluenceTd"  valign="top">
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Interface </th>
<th class='confluenceTh'> ReferralInterceptor </th>
</tr>
<tr>
<td class='confluenceTd'> isSuffix </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> list </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> listSuffixes </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> lookup </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> modify </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
</tbody></table></td>
<td class="confluenceTd"  valign="top">
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Interface </th>
<th class='confluenceTh'> ReferralInterceptor </th>
</tr>
<tr>
<td class='confluenceTd'> modifyRn </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> move </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> removeContextPartition </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> search </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/check.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
<tr>
<td class='confluenceTd'> unbind </td>
<td class='confluenceTd'> <img class="emoticon" src="/confluence/images/icons/emoticons/error.gif" height="16" width="16" align="absmiddle" alt="" border="0"/> </td>
</tr>
</tbody></table></td></tr></tbody></table>

<h1><a name="ReferralHandlingChanges-Conclusion"></a>Conclusion</h1>

<p>We will need to alter the ApacheDS JNDI provider, and the LDAP server frontend (MINA LDAP protocol provider) to handle referrals correctly. Here are the changes required for each subsystem.</p>

<h2><a name="ReferralHandlingChanges-ChangestoJNDIProvider"></a>Changes to JNDI Provider</h2>

<ul>
	<li>Add logic to check for parent and ancestor referrals when referral handling is not ignored</li>
	<li>Throw the appropriate ReferralExceptions with ref modification with referral handling set to throw</li>
	<li>Implement follow handling to chase referrals</li>
	<li>Add special handling for search to properly modify referral LDAP URLs</li>
	<li>Add code to alter the search operation when referral handling is not ignored</li>
	<li>Create and add search result enumeration filter to collect referrals and save them for returning last after the underlying enumeration has been exhausted of regular entries. This way we can return named continuation referrences last as JNDI LDAP providers are supposed to do.</li>
</ul>


<h2><a name="ReferralHandlingChanges-ChangestoMINALDAPFrontend%28ProtocolProvider%29"></a>Changes to MINA LDAP Frontend (Protocol Provider)</h2>

<ul>
	<li>Make handlers set the Context.REFERRAL property approapriate (ignore or throw)</li>
	<li>Make handlers correctly deal with ReferralExceptions for non-search operations</li>
	<li>Handle search continuations properly</li>
</ul>
</div>


</td></tr></table></div>
<p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="http://cwiki.apache.org/confluence/images/border/spacer.gif" width="1" height="1" border="0"/></td>
    </tr>
</table>

<div class="smalltext">
    Powered by
    <a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer" class="smalltext">Atlassian Confluence</a>
    (Version: 2.2.9 Build:#527 Sep 07, 2006)
    -
    <a href="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="smalltext">Bug/feature request</a><br/>
    <br>
    <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action">Unsubscribe or edit your notifications preferences</a>

</div>

</body>
</html>


Mime
View raw message