Ao utilizar informações que estejam em um script de idioma bidirecional, pode ser
necessário transformar o formato dos dados. Este é um exemplo, etapa a etapa,
da codificação que desempenha uma transformação em dados do tipo DataObject.
Por Que e Quando Desempenhar Esta Tarefa
O módulo requer
que as informações do tipo DataObject sejam transformadas de um formato bidirecional
para outro.
Etapas para Esta Tarefa
- Inclua todas as classes bidirecionais que contenham a implementação do mecanismo bidirecional.
import com.ibm.bidiTools.bdlayout.*;
- Inclua todas as classes necessárias para manipular o objeto do tipo
DataObject.
import commonj.sdo.DataObject;
import commonj.sdo.Type;
import commonj.sdo.Property;
- Defina as variáveis de cadeia que conterão os diferentes tipos de cadeias
que um objeto do tipo DataObject contém. Esta etapa facilita a filtragem dos
atributos do tipo String ao atravessar recursivamente
o DataObject.
String STRING_STR_TYPE = "String";
String NORM_STRING_STR_TYPE = "normalizedString";
String TOKEN_STR_TYPE = "token";
String LANG_STR_TYPE = "language";
String NAME_STR_TYPE = "Name";
String NMTOKEN_STR_TYPE = "NMTOKEN";
String NCNANE_STR_TYPE = "NCName";
String ID_STR_TYPE = "ID";
String IDREF_STR_TYPE = "IDREF";
String IDREFS_STR_TYPE = "IDREFS";
String ENTITY_STR_TYPE = "ENTITY";
String ENTITIES_STR_TYPE = "ENTITIES";
- Defina a função que verifica se o tipo de uma propriedade é
String.
private static boolean isStringFamilyType (Property property) {
boolean rc = false;
if ((property.getType().getName().equalsIgnoreCase(STRING_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(NORM_STRING_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(TOKEN_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(LANG_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(NAME_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(NMTOKEN_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(NCNANE_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(ID_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(IDREF_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(IDREFS_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(ENTITY_STR_TYPE)) ||
(property.getType().getName().equalsIgnoreCase(ENTITIES_STR_TYPE)))
rc = true;
return rc;
}
- Defina a função recursiva que aplica a transformação bidirecional
no DataObject inteiro.
Nota: A seguir, são explicadas as premissas básicas
seguidas pela lógica do código.
- a transformação bidirecional é aplicada em propriedades apenas do tipo string
- as propriedades da cadeia de tipos no DataObject são armazenadas em um formato bidirecional
DataObject BiDiDataObjTransformationBO(DataObject boIn, String formatIn, String formatOut){
Type type;
Property property;
if (boIn == null) return null;
type = boIn.getType();
List propertyList = type.getProperties();
for (int propertyNumber = 0; propertyNumber < propertyList.size(); propertyNumber++){
property = (Property) propertyList.get(propertyNumber);
String propertyName = property.getName();
- Ignore todas as propriedades que não sejam de cadeia.
if (!isStringFamilyType(property))
continue;
if (property.isContainment()) {
if (property.isMany()) {
List childsList = boIn.getList(property);
- Chame recursivamente a transformação para manipular objetos-filho.
for (int childNumber = 0; childNumber < childsList.size();
childNumber++){ BiDiDataObjTransformationBO(connectionContext,
((DataObject)childsList.get(childNumber)),formatIn, formatOut);
}
} else {
- Chame recursivamente a transformação para manipular objetos-filho de
quaisquer objetos de negócios contidos.
BiDiDataObjTransformationBO(connectionContext,
((DataObject)boIn.get(property)),formatIn, formatOut);
}
} else {
- Transforme os atributos de cadeia simples.
String str = BiDiStringTransformation(
(boIn.getString(propertyName),formatIn, formatOut);
boIn.setString(propertyName, str);
}
}
return boIn;
}