La lecci�n Federaci�n describe como determina un proveedor de servicio qu� componentes de un nombre mixto debe procesar y cuales pasar. La lecci�n Los Componentes Esenciales contiene dos ejemplos de c�mo una implementaci�n de contexto selecciona componentes del nombre de entrada para procesarlos. Estos ejemplos conciernen a las implementaciones de contexto en que soportan separaci�n fuerte y por lo tanto seleccionan el primer componente de un nombre mixto.
Para soportar separaci�n d�bil, necesitamos reescribir el m�todo de utilidad getMyComponents() y todos los m�todos del contexto para eliminar la presunci�n de componente simple. Abajo tenemos un m�todo m�s general que, dado un nombre compuesto o mixto devuelve un array de dos elementos. En ese array, el primer componente contiene los componentes a procesar por el sistema de nombres actual y el segundo componente contiene los componentes a procesar por los sistemas de nombres siguientes. Este ejemplo maneja separaci�n fuerte:
protected Name[] parseComponents(Name name) throws NamingException {
Name head, tail;
if (name instanceof CompositeName) {
int separator;
// If there is no name to parse, or
// if you're already at the boundary
if (name.isEmpty() || name.get(0).equals("")) {
separator = 0;
} else {
separator = 1;
}
head = name.getPrefix(separator);
tail = name.getSuffix(separator);
} else {
// Treat this like a compound name
head = new CompositeName().add(name.toString());
tail = null;
}
return new Name[]{head, tail};
}
Abajo tenemos el mismo m�todo reescrito para soportar separaci�n d�bil. Para esta implementaci�n de contexto particular, s�lo se seleccionan los primeros componentes que contenga el caracter igual ("=") para ser procesados por el sistema de nombres actual:
protected Name[] parseComponents(Name name) throws NamingException {
Name head, tail;
if (name instanceof CompositeName) {
int separator;
// If there is no name to parse, or
// if you're already at the boundary
if (name.isEmpty() || name.get(0).equals("")) {
separator = 0;
} else {
// Find the leading components that have "="
int total = name.size();
int i;
for (i = 0; i < total; i++) {
if (name.get(i).indexOf('=') < 0) {
break;
}
}
separator = i;
}
head = name.getPrefix(separator);
tail = name.getSuffix(separator);
} else {
// Treat this like a compound name
head = new CompositeName().add(name.toString());
tail = null;
}
return new Name[]{head, tail};
}
Si la implementaci�n de contexto soporta separaci�n d�bil din�mica (es decir, determina din�micamente los l�mites del sistema de nombres), parseComponents() devolver� todos los componentes como pertenecientes al sistema de nombres actual. Aqu� tenemos un ejemplo:
protected Name[] parseComponents(Name name) throws NamingException {
Name head, tail;
if (name instanceof CompositeName) {
int separator;
// If there is no name to parse, or
// if you're already at the boundary
if (name.isEmpty() || name.get(0).equals("")) {
separator = 0;
} else {
// All components are eligible
separator = name.size();
}
head = name.getPrefix(separator);
tail = name.getSuffix(separator);
} else {
// Treat this like a compound name
head = new CompositeName().add(name.toString());
tail = null;
}
return new Name[]{head, tail};
}
Una vez que hemos definido este m�todo, nuestros m�todos de contexto pueden usarlo para extraer los componentes. Aqu� tenemos un ejemplo:
Name[] nm = parseComponents(name); Name mine = nm[0]; Name rest = nm[1];