Mantener datos limpios y confiables es crucial para operaciones fluidas en SAP Commerce Cloud. Pueden surgir consecuencias inesperadas cuando datos incorrectos se cuelan en el sistema, provocando problemas imprevistos que nuestro código no está preparado para manejar. Un error común es encontrar un StackOverflowError debido a bucles entre instancias primarias y secundarias de un tipo determinado. En este artículo, exploraremos las posibles complicaciones causadas por los bucles de categorías, exploraremos los mecanismos de detección y discutiremos estrategias para prevenir estos problemas de bucles.
Entender el enfoque por defecto de hybris
En SAP Commerce, obtener todas las subcategorías o supercategorías de un determinado CategoríaModelo es una tarea rutinaria. La práctica común implica el uso de atributos dinámicos y la interfaz CategoryService. Específicamente, los atributos dinámicos CategoríaTodosSubcategorías y CategoríaTodosSupercategorías manejar la colección de subcategorías y supercategorías, respectivamente. Estos atributos aprovechan la CategoríaServicio interfaz, invocando los métodos getAllSubcategoriesForCategory y getAllSupercategoriesForCategory internamente.
El recorrido recursivo de DefaultCategoryService

Ambos getAllSubcategoriesForCategory y getAllSupercategoriesForCategory métodos en el Servicio de categoría predeterminada La implementación realiza recorridos recursivos de la jerarquía de categorías. Estos métodos tienen como objetivo acumular categorías de todos los niveles secundarios o principales mediante la iteración sobre diferentes niveles de categorías. Sin embargo, una mirada más profunda revela una limitación crítica en la implementación predeterminada.
Detección y limitación de ciclos
La implementación predeterminada en DefaultCategoryService recopila de forma recursiva todas las subcategorías de todos los niveles de categoría, por lo que finaliza correctamente al procesar árboles de categorías bien formados como este:
- Categoría A
- Categoría B
- Categoría C
- Categoría D
- Categoría B
Sin embargo, este algoritmo recursivo no tiene en cuenta las categorías ya visitadas en niveles anteriores. En consecuencia, las referencias circulares en el árbol de categorías aún pueden generar bucles infinitos. Considere el siguiente escenario:
- Categoría A
- Categoría B
- Categoría C
- Categoría A (referencia anterior)
- Categoría C
- Categoría B
En este ejemplo, el bucle que involucra las categorías A, B y C conducirá sin duda a un bucle infinito que el mecanismo actual no puede evitar. Otro ejemplo que provocaría un bucle infinito es el siguiente:
- Categoría A
- Categoría B -> Categoría C
- Categoría C -> Categoría B
Un script para detectar bucles de categorías
Proporcionamos el siguiente script Groovy para ayudar a identificar bucles de categorías dentro de su sistema SAP Commerce. Este script se puede ejecutar en la sección Lenguajes de scripting de hAC (Hybris Consola de administración):
import de.hybris.platform.category.model.CategoryModel
class EturiaCategoryLoopDetector {
static String detectLoop(CategoryModel category, HashSet<CategoryModel> visited, CategoryModel superCategory) {
String result = null
if (visited.contains(category)) {
def categoryToCheck = category.getCode()
def parentCategory = superCategory.getCode()
println("Category '$categoryToCheck' is causing an infinite loop in '$parentCategory'.")
return parentCategory // Infinite loop detected, return the category code
}
visited.add(category)
for (CategoryModel subcategory : category.getCategories()) {
String loopCategory = detectLoop(subcategory, visited, category)
if (loopCategory != null) {
return loopCategory
}
}
visited.remove(category) // Backtrack
return result
}
static String findLoop(CategoryModel rootCategory) {
return detectLoop(rootCategory, new HashSet<>(), null)
}
}
// Example usage
catalogVersionService = spring.getBean("catalogVersionService")
categoryService = spring.getBean("categoryService")
def ROOT_CATEGORY_CODE = "<CATEGORY_CODE>"
def CATALOG_ID = "<CATALOG_ID>"
def CATALOG_VERSION = "<CATALOG_VERSION>"
def rootCategory = categoryService.getCategoryForCode(catalogVersionService.getCatalogVersion(CATALOG_ID, CATALOG_VERSION), ROOT_CATEGORY_CODE)
String loopCategoryCode = EturiaCategoryLoopDetector.findLoop(rootCategory)
if (loopCategoryCode == null) {
println("No infinite loop was detected in the category hierarchy starting from the root category.")
}
Este script ayuda a detectar bucles de categorías y puede ser una herramienta valiosa para identificar posibles puntos problemáticos dentro de su jerarquía de categorías.
Mejorar la detección de ciclos de categorías
Si bien el código SAP Commerce predeterminado proporciona una solución básica para recopilar subcategorías y supercategorías, los escenarios complejos exigen una solución más sólida. Surge la necesidad de proyectos con jerarquías y árboles de categorías intrincados para mejorar los mecanismos de detección de ciclos. Un enfoque recomendado implica utilizar un conjunto visitado para realizar un seguimiento de las categorías atravesadas durante la exploración de la jerarquía. Este enfoque ofrece un mecanismo de detección de ciclos más completo al considerar todo el recorrido transversal y verificar referencias circulares. El pseudocódigo para ese enfoque podría verse así:
// Pseudocode for cycle detection and prevention
private Collection<CategoryModel> getAllSubcategories(
final Collection<CategoryModel> categories,
Set<CategoryModel> visited) {
// ... existing code ...
while (!CollectionUtils.isEmpty(currentLevel)) {
for (final Iterator<CategoryModel> iterator = currentLevel.iterator(); iterator.hasNext();) {
final CategoryModel categoryModel = iterator.next();
if (visited.contains(categoryModel)) {
iterator.remove(); // Already visited, skip processing
continue;
}
visited.add(categoryModel); // Mark as visited
// ... existing code ...
}
// ... existing code ...
}
}
Conclusión
Garantizar una experiencia fluida SAP Commerce depende de una gestión diligente de los datos. Como hemos visto, el mecanismo de recorrido de categorías predeterminado podría resultar insuficiente en escenarios con datos erráticos en el sistema. Sea proactivo a la hora de identificar y resolver bucles de categorías aprovechando el script que se proporciona aquí y considerando estrategias avanzadas de detección de ciclos. La implementación de un mecanismo integral de detección de ciclos garantizará que su sistema SAP Commerce permanezca estable y resistente, incluso en relaciones de categorías desafiantes.
E-Turia está listo para ayudar si usted o su equipo necesitan ayuda con un proyecto SAP Commerce Cloud. No dude en ponerse en contacto con nosotros por correo electrónico a info [at] eturia.es o contáctenos en el siguiente formulario y nos comunicaremos con usted para una consulta gratuita.