/* * gvNIX is an open source tool for rapid application development (RAD). * Copyright (C) 2010 Generalitat Valenciana * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package org.gvnix.web.menu.roo.addon; import java.util.List; import java.util.logging.Logger; import org.apache.commons.lang3.Validate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Service; import org.springframework.roo.addon.web.mvc.jsp.menu.MenuOperations; import org.springframework.roo.addon.web.mvc.jsp.roundtrip.XmlRoundTripFileManager; import org.springframework.roo.model.JavaSymbolName; import org.springframework.roo.project.LogicalPath; import org.springframework.roo.support.logging.HandlerUtils; import org.springframework.roo.support.util.XmlUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * gvNIX implementation of standard Roo menu operation service. * <p> * This class extends and replace the services that * {@link org.springframework.roo.addon.web.mvc.jsp.menu.MenuOperationsImpl} * offers. * * @author <a href="http://www.disid.com">DISID Corporation S.L.</a> made for <a * href="http://www.dgti.gva.es">General Directorate for Information * Technologies (DGTI)</a> */ @Component @Service public class MenuOperationsImpl implements MenuOperations { private static Logger logger = HandlerUtils .getLogger(MenuOperationsImpl.class); /** * Property to identify this service in {@link FilterMenuOperationsHook} and * {@link MenuOperationsProxy} */ @Property(boolValue = true) public static final String GVNIX_COMPONENT = "gvNIXComponent"; /** * Use AddonOperations delegate to operations this add-on offers */ @Reference private MenuEntryOperations operations; @Reference private XmlRoundTripFileManager xmlFileManager; /** * Waits until all required references are available */ private void waitToReferences() { if (operations != null && xmlFileManager != null) { return; } while (!(operations != null && xmlFileManager != null)) { try { Thread.sleep(100); } catch (InterruptedException e) { break; } } } /** {@inheritDoc} */ public void addMenuItem(JavaSymbolName menuCategoryName, JavaSymbolName menuItemId, String globalMessageCode, String link, String idPrefix, LogicalPath logicalPath) { waitToReferences(); // TODO Added logicalPath param to method: related methods modification // required ? operations.addMenuItem(menuCategoryName, menuItemId, globalMessageCode, link, idPrefix); } /** {@inheritDoc} */ public void addMenuItem(JavaSymbolName menuCategoryName, JavaSymbolName menuItemId, String menuItemLabel, String globalMessageCode, String link, String idPrefix, LogicalPath logicalPath) { waitToReferences(); // TODO Added logicalPath param to method: related methods modification // required ? operations.addMenuItem(menuCategoryName, menuItemId, menuItemLabel, globalMessageCode, link, idPrefix); } public void cleanUpFinderMenuItems(JavaSymbolName menuCategoryName, List<String> allowedFinderMenuIds, LogicalPath logicalPath) { waitToReferences(); // TODO Added logicalPath param to method: related methods modification // required ? Validate.notNull(menuCategoryName, "Menu category identifier required"); Validate.notNull(allowedFinderMenuIds, "List of allowed menu items required"); Document document = operations.getMenuDocument(); StringBuilder categoryId = new StringBuilder( MenuEntryOperations.CATEGORY_MENU_ITEM_PREFIX); categoryId.append(menuCategoryName.getSymbolName().toLowerCase()); // find any menu items under this category which have an id that starts // with the menuItemIdPrefix List<Element> elements = XmlUtils.findElements( "//menu-item[@id='".concat(categoryId.toString()) .concat("']//menu-item[starts-with(@id, '") .concat(FINDER_MENU_ITEM_PREFIX).concat("')]"), document.getDocumentElement()); if (elements.size() == 0) { return; } for (Element element : elements) { if (!allowedFinderMenuIds.contains(element.getAttribute("id"))) { element.getParentNode().removeChild(element); } } xmlFileManager.writeToDiskIfNecessary(operations.getMenuConfigFile(), document); } /** * Attempts to locate a menu item and remove it. * * @param menuCategoryName the identifier for the menu category (required) * @param menuItemName the menu item identifier (required) * @param idPrefix the prefix to be used for this menu item (optional, * MenuOperations.DEFAULT_MENU_ITEM_PREFIX is default) */ public void cleanUpMenuItem(JavaSymbolName menuCategoryName, JavaSymbolName menuItemName, String idPrefix, LogicalPath logicalPath) { waitToReferences(); // TODO Added logicalPath param to method: related methods modification // required ? Validate.notNull(menuCategoryName, "Menu category identifier required"); Validate.notNull(menuItemName, "Menu item id required"); if (idPrefix == null || idPrefix.length() == 0) { idPrefix = DEFAULT_MENU_ITEM_PREFIX; } Document document = operations.getMenuDocument(); StringBuilder categoryId = new StringBuilder( MenuEntryOperations.CATEGORY_MENU_ITEM_PREFIX); categoryId.append(menuCategoryName.getSymbolName().toLowerCase()); StringBuilder itemId = new StringBuilder(idPrefix); itemId.append(menuCategoryName.getSymbolName().toLowerCase()) .append("_").append(menuItemName.getSymbolName().toLowerCase()); // find menu item under this category if exists Element element = XmlUtils.findFirstElement( "//menu-item[@id='".concat(categoryId.toString()) .concat("']//menu-item[@id='") .concat(itemId.toString()).concat("']"), document.getDocumentElement()); if (element == null) { return; } else { element.getParentNode().removeChild(element); } operations.writeXMLConfigIfNeeded(document); } /** * Informs if gvNIX menu is activated * * @return */ public boolean isGvNixMenuAvailable() { waitToReferences(); return operations.isGvNixMenuAvailable(); } }