Double Curly Braces Anti Pattern

Is that the Double Curly Braces Anti Pattern in Liferay?

It was a beautiful raining morning, when I took advantage of the long weekend to poke around and check how Liferay is using its new taglib Clay, in Liferay 7.1 and 7.2. As beautiful as the morning was, the experience was not that great.

As I loved their website and was looking forward to start using Clay, I started browsing... Especially due to this note from their website:

Note: AUI taglibs are deprecated as of Liferay Portal CE 7.1. We recommend that you use Clay taglibs to avoid future compatibility issues.

One of my first conclusions was, AUI is going to stay, at least for a while. Clay is not a replacement as the note might indicate, and it is still pretty incomplete if compared to AUI. Missing capabilities are evident and most importantly, Liferay itself is written with aui tags, everywhere. I could not spot a significant reduction if any.

The second point I did not appreciate, as one might possibly have, was the fact that when I found usages of Clay in the source code, the attributes where all coming from Java objects. So figuring out how to use the tags involved not only going through the JSPs, but the Java code as well. And we know, among render methods in portlets, doViews, render commands, filters and the massive scriptlets, this task is not always trivial, specially when the massive scriptlets also generate JS that manipulate the same components in ways that the Java code is already doing or could do.

When checking the TLD (http://liferay.com/tld/clay) no signs of documentation, no comments or simple pointers.  Although it is not new that documentation is not one of Liferay's strongest traits when it comes to new tech, this was still disappointing as it seemed the doc website finally got the attention it deserved this year. 

But then, looking for how to create these "context" objects I found an unfortunate pattern, everywhere: the Double Curly Braces Anti Pattern.

Ok, I know, there is no such thing as a Double Curly Braces Syntax, and I am aware of the combined object instantiation from anonymous class + initialization block. The point here is not that, it is that the code is marked by laziness and sugar that would not be otherwise welcomed in code people look at as reference. Liferay is know to come with beautiful code, with some questionable style and patterns, but overall, it is a code base that people came to trust and learn from.

Let's see an example:


public List<ViewTypeItem> getViewTypeItems() {
        return new ViewTypeItemList(getPortletURL(), _displayStyle) {
            {
                addCardViewTypeItem();
                addListViewTypeItem();
                addTableViewTypeItem();
            }
        };
}

Now, another one:


public CreationMenu getCreationMenu() throws PortalException {
        return new CreationMenu() {
            {
                addPrimaryDropdownItem(
                    dropdownItem -> {
                        dropdownItem.setHref(
                            _renderResponse.createRenderURL(),
                            "mvcRenderCommandName", "/users_admin/edit_user");
                        dropdownItem.setLabel(
                            LanguageUtil.get(_request, "add-user"));
                    });
            }
        };
}

A different one, but the same:


<clay:navigation-bar
    inverted="<%= true %>"
    navigationItems="<%=
        new JSPNavigationItemList(pageContext) {
            {
                add(
                    navigationItem -> {
                        navigationItem.setActive(!actionRequired);
                        navigationItem.setHref(renderResponse.createRenderURL(), "actionRequired", StringPool.FALSE);
                        navigationItem.setLabel(LanguageUtil.format(request, "notifications-list-x", UserNotificationEventLocalServiceUtil.getDeliveredUserNotificationEventsCount(themeDisplay.getUserId(), UserNotificationDeliveryConstants.TYPE_WEBSITE, true, false)));
                    });
                add(
                    navigationItem -> {
                        navigationItem.setActive(actionRequired);
                        navigationItem.setHref(renderResponse.createRenderURL(), "actionRequired", StringPool.TRUE);
                        navigationItem.setLabel(LanguageUtil.format(request, "requests-list-x", String.valueOf(UserNotificationEventLocalServiceUtil.getArchivedUserNotificationEventsCount(themeDisplay.getUserId(), UserNotificationDeliveryConstants.TYPE_WEBSITE, true, false))));
                    });
            }
        }
    %>"
/>

Ok, this code was clearly not reviewed.

CreationMenu is not abstract or an interface, it is just a regular class. And somehow, one felt the need to declare an anonymous class, to save typing inside an initialization block. Why do that to complicate matters for garbage collection? 

Why create a new scope by using an anonymous inner class while opening the declaring class to so many classes? Encapsulation should be better preserved.

Is it necessary to be sending a this reference along with all methods that create components for the toolbar? I clearly have my doubts about the advantages of using such sugar in any piece of code for the sake of questionable beauty. (let's not mention the exception that is not thrown or the question: if this is such a common need, why not an interface or other means of abstraction? such as their own com.liferay.frontend.taglib.clay.servlet.taglib.display.context.ManagementToolbarDisplayContext)

Maybe...


public CreationMenu getCreationMenu( ) {

   CreationMenu menu = new CreationMenu( );

   menu.addPrimaryDropdownItem( dropdownItem -> {
      dropdownItem.setHref( renderResponse.createRenderURL( ), "mvcRenderCommandName", "/users_admin/edit_user");
      dropdownItem.setLabel( LanguageUtil.get( request, "add-user" ) );
   } );

   return menu;
}

But I also wish the library would not use consumers as suppliers...


public class NavigationItemList extends ArrayList<NavigationItem> {

   public void add(Consumer<NavigationItem> consumer) {
      NavigationItem navigationItem = new NavigationItem();

      consumer.accept(navigationItem);

      add(navigationItem);
   }

}

...

public List<NavigationItem> getNavigationItems(String url, String label) {
		return new NavigationItemList() {
			{
				add(
					navigationItem -> {
						navigationItem.setActive(true);
						navigationItem.setHref(url);
						navigationItem.setLabel(
							LanguageUtil.get(_request, label));
					});
			}
		};
}

But anyway, as always, I do love Liferay, but I would like to conclude by saying that if anyone is browsing the code while looking for guidance with regards to how to use Clay, that person does need to be aware and avoid repeating this pattern.


Example


/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 */

package com.liferay.users.admin.web.internal.display.context;

import com.liferay.frontend.taglib.clay.servlet.taglib.util.CreationMenu;
import com.liferay.frontend.taglib.clay.servlet.taglib.util.DropdownItem;
import com.liferay.frontend.taglib.clay.servlet.taglib.util.DropdownItemList;
import com.liferay.frontend.taglib.clay.servlet.taglib.util.ViewTypeItem;
import com.liferay.frontend.taglib.clay.servlet.taglib.util.ViewTypeItemList;
import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.dao.search.EmptyOnClickRowChecker;
import com.liferay.portal.kernel.dao.search.RowChecker;
import com.liferay.portal.kernel.dao.search.SearchContainer;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.portlet.PortletURLUtil;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.service.permission.PortalPermissionUtil;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.util.PropsValues;
import com.liferay.portlet.usersadmin.search.UserSearch;
import com.liferay.portlet.usersadmin.search.UserSearchTerms;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;

import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import javax.servlet.http.HttpServletRequest;

/**
 * @author Pei-Jung Lan
 */
public class ViewUsersManagementToolbarDisplayContext {

    public ViewUsersManagementToolbarDisplayContext(
        HttpServletRequest request, RenderRequest renderRequest,
        RenderResponse renderResponse, String displayStyle, String navigation,
        int status) {

        _request = request;
        _renderRequest = renderRequest;
        _renderResponse = renderResponse;
        _displayStyle = displayStyle;
        _navigation = navigation;
        _status = status;

        _currentURL = PortletURLUtil.getCurrent(
            _renderRequest, _renderResponse);
    }

    public List<DropdownItem> getActionDropdownItems() {
        return new DropdownItemList() {
            {
                if (isShowRestoreButton()) {
                    add(
                        dropdownItem -> {
                            dropdownItem.setHref(
                                StringBundler.concat(
                                    "javascript:",
                                    _renderResponse.getNamespace(),
                                    "deleteUsers('", Constants.RESTORE, "');"));
                            dropdownItem.setIcon("icon-undo");
                            dropdownItem.setLabel(
                                LanguageUtil.get(_request, "restore"));
                            dropdownItem.setQuickAction(true);
                        });
                }

                if (isShowDeleteButton()) {
                    add(
                        dropdownItem -> {
                            UserSearchTerms userSearchTerms =
                                (UserSearchTerms)_userSearch.getSearchTerms();

                            String action = Constants.DELETE;
                            String icon = "times-circle";

                            if (userSearchTerms.isActive()) {
                                action = Constants.DEACTIVATE;
                                icon = "hidden";
                            }

                            dropdownItem.setHref(
                                StringBundler.concat(
                                    "javascript:",
                                    _renderResponse.getNamespace(),
                                    "deleteUsers('", action, "');"));
                            dropdownItem.setIcon(icon);
                            dropdownItem.setLabel(
                                LanguageUtil.get(_request, action));
                            dropdownItem.setQuickAction(true);
                        });
                }
            }
        };
    }

    public String getClearResultsURL() {
        PortletURL clearResultsURL = getPortletURL();

        clearResultsURL.setParameter("keywords", StringPool.BLANK);

        return clearResultsURL.toString();
    }

    public CreationMenu getCreationMenu() throws PortalException {
        return new CreationMenu() {
            {
                addPrimaryDropdownItem(
                    dropdownItem -> {
                        dropdownItem.setHref(
                            _renderResponse.createRenderURL(),
                            "mvcRenderCommandName", "/users_admin/edit_user");
                        dropdownItem.setLabel(
                            LanguageUtil.get(_request, "add-user"));
                    });
            }
        };
    }

    public List<DropdownItem> getFilterDropdownItems() {
        return new DropdownItemList() {
            {
                addGroup(
                    dropdownGroupItem -> {
                        dropdownGroupItem.setDropdownItems(
                            _getFilterNavigationDropdownItems());
                        dropdownGroupItem.setLabel(
                            LanguageUtil.get(_request, "filter-by-navigation"));
                    });

                addGroup(
                    dropdownGroupItem -> {
                        dropdownGroupItem.setDropdownItems(
                            _getOrderByDropdownItems());
                        dropdownGroupItem.setLabel(
                            LanguageUtil.get(_request, "order-by"));
                    });
            }
        };
    }

    public String getOrderByCol() {
        return _userSearch.getOrderByCol();
    }

    public String getOrderByType() {
        return _userSearch.getOrderByType();
    }

    public PortletURL getPortletURL() {
        try {
            PortletURL portletURL = PortletURLUtil.clone(
                _currentURL, _renderResponse);

            portletURL.setParameter("orderByCol", getOrderByCol());
            portletURL.setParameter("orderByType", getOrderByType());

            return portletURL;
        }
        catch (Exception e) {
            if (_log.isWarnEnabled()) {
                _log.warn(e, e);
            }

            return _renderResponse.createRenderURL();
        }
    }

    public String getSearchActionURL() {
        PortletURL searchActionURL = getPortletURL();

        return searchActionURL.toString();
    }

    public SearchContainer getSearchContainer() {
        if (_userSearch != null) {
            return _userSearch;
        }

        PortletURL portletURL = (PortletURL)_request.getAttribute(
            "view.jsp-portletURL");

        UserSearch userSearch = new UserSearch(
            _renderRequest, "cur2", portletURL);

        RowChecker rowChecker = new EmptyOnClickRowChecker(_renderResponse);

        rowChecker.setRowIds("rowIdsUser");

        userSearch.setRowChecker(rowChecker);

        ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
            WebKeys.THEME_DISPLAY);

        UserSearchTerms searchTerms =
            (UserSearchTerms)userSearch.getSearchTerms();

        if (_navigation.equals("active")) {
            searchTerms.setStatus(WorkflowConstants.STATUS_APPROVED);
        }
        else if (_navigation.equals("inactive")) {
            searchTerms.setStatus(WorkflowConstants.STATUS_INACTIVE);
        }

        int total = UserLocalServiceUtil.searchCount(
            themeDisplay.getCompanyId(), searchTerms.getKeywords(),
            searchTerms.getStatus(), new LinkedHashMap<String, Object>());

        userSearch.setTotal(total);

        List<User> results = UserLocalServiceUtil.search(
            themeDisplay.getCompanyId(), searchTerms.getKeywords(),
            searchTerms.getStatus(), new LinkedHashMap<String, Object>(),
            userSearch.getStart(), userSearch.getEnd(),
            userSearch.getOrderByComparator());

        userSearch.setResults(results);

        _userSearch = userSearch;

        return _userSearch;
    }

    public String getSortingURL() {
        PortletURL sortingURL = getPortletURL();

        sortingURL.setParameter(
            "orderByType",
            Objects.equals(getOrderByType(), "asc") ? "desc" : "asc");

        return sortingURL.toString();
    }

    public List<ViewTypeItem> getViewTypeItems() {
        return new ViewTypeItemList(getPortletURL(), _displayStyle) {
            {
                addCardViewTypeItem();
                addListViewTypeItem();
                addTableViewTypeItem();
            }
        };
    }

    public boolean isShowDeleteButton() {
        UserSearchTerms searchTerms =
            (UserSearchTerms)getSearchContainer().getSearchTerms();

        if ((searchTerms.getStatus() != WorkflowConstants.STATUS_ANY) &&
            (searchTerms.isActive() ||
             (!searchTerms.isActive() && PropsValues.USERS_DELETE))) {

            return true;
        }

        return false;
    }

    public boolean isShowRestoreButton() {
        UserSearchTerms searchTerms =
            (UserSearchTerms)getSearchContainer().getSearchTerms();

        if ((searchTerms.getStatus() != WorkflowConstants.STATUS_ANY) &&
            !searchTerms.isActive()) {

            return true;
        }

        return false;
    }

    public boolean showCreationMenu() throws PortalException {
        ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
            WebKeys.THEME_DISPLAY);

        return PortalPermissionUtil.contains(
            themeDisplay.getPermissionChecker(), ActionKeys.ADD_USER);
    }

    private List<DropdownItem> _getFilterNavigationDropdownItems() {
        DropdownItemList navigationDropdownitems = new DropdownItemList();

        for (String navigation : new String[] {"active", "inactive"}) {
            navigationDropdownitems.add(
                dropdownItem -> {
                    dropdownItem.setActive(navigation.equals(_navigation));
                    dropdownItem.setHref(
                        getPortletURL(), "navigation", navigation);
                    dropdownItem.setLabel(
                        LanguageUtil.get(_request, navigation));
                });
        }

        return navigationDropdownitems;
    }

    private List<DropdownItem> _getOrderByDropdownItems() {
        return new DropdownItemList() {
            {
                add(
                    dropdownItem -> {
                        dropdownItem.setActive(
                            Objects.equals(getOrderByCol(), "first-name"));
                        dropdownItem.setHref(
                            getPortletURL(), "orderByCol", "first-name");
                        dropdownItem.setLabel(
                            LanguageUtil.get(_request, "first-name"));
                    });

                add(
                    dropdownItem -> {
                        dropdownItem.setActive(
                            Objects.equals(getOrderByCol(), "last-name"));
                        dropdownItem.setHref(
                            getPortletURL(), "orderByCol", "last-name");
                        dropdownItem.setLabel(
                            LanguageUtil.get(_request, "last-name"));
                    });

                add(
                    dropdownItem -> {
                        dropdownItem.setActive(
                            Objects.equals(getOrderByCol(), "screen-name"));
                        dropdownItem.setHref(
                            getPortletURL(), "orderByCol", "screen-name");
                        dropdownItem.setLabel(
                            LanguageUtil.get(_request, "screen-name"));
                    });
            }
        };
    }

    private static final Log _log = LogFactoryUtil.getLog(
        ViewUsersManagementToolbarDisplayContext.class);

    private final PortletURL _currentURL;
    private final String _displayStyle;
    private final String _navigation;
    private final RenderRequest _renderRequest;
    private final RenderResponse _renderResponse;
    private final HttpServletRequest _request;
    private final int _status;
    private UserSearch _userSearch;

}


The TLD 

  • http://liferay.com/tld/clay

<?xml version="1.0"?>

<taglib
   version="2.1"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
>
   <tlib-version>1.0</tlib-version>
   <short-name>liferay-clay</short-name>
   <uri>http://liferay.com/tld/clay</uri>
   <tag>
      <description></description>
      <name>alert</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.AlertTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>autoClose</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>closeable</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>destroyOnHide</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>message</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>style</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>title</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>type</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>badge</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.BadgeTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>style</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>button</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.ButtonTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>ariaLabel</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>block</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>icon</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>iconAlignment</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>monospaced</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>name</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>size</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>style</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>type</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>value</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>checkbox</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.CheckboxTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>checked</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>indeterminate</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inline</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>name</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>showLabel</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>value</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>dropdown-actions</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.DropdownActionsTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>buttonLabel</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>buttonStyle</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>buttonType</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>caption</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>dropdownItems</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>expanded</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>helpText</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>triggerCssClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>dropdown-menu</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.DropdownMenuTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>buttonLabel</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>buttonStyle</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>buttonType</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>dropdownItems</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>expanded</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>icon</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>itemsIconAlignment</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>searchable</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>style</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>triggerCssClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>type</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>file-card</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.FileCardTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>actionDropdownItems</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>groupName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>href</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>icon</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inputName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inputValue</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>labels</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>labelStylesMap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>resultRow</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>rowChecker</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selectable</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selected</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>stickerLabel</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>stickerShape</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>stickerStyle</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>subtitle</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>title</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>horizontal-card</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.HorizontalCardTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>actionDropdownItems</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>groupName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>href</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>icon</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inputName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inputValue</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>resultRow</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>rowChecker</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selectable</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selected</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>title</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>icon</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.IconTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>monospaced</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>symbol</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>image-card</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.ImageCardTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>actionDropdownItems</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>groupName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>href</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>icon</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>imageAlt</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>imageSrc</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inputName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inputValue</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>labels</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>labelStylesMap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>resultRow</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>rowChecker</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selectable</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selected</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>stickerLabel</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>stickerShape</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>stickerStyle</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>subtitle</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>title</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>label</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.LabelTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>closeable</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>href</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>message</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>size</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>style</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>link</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.LinkTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>ariaLabel</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>buttonStyle</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>download</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>href</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>icon</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>iconAlignment</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>style</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>target</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>title</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>management-toolbar</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.ManagementToolbarTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>actionDropdownItems</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>clearResultsURL</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>contentRenderer</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>creationMenu</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>displayContext</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>filterDropdownItems</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>infoPanelId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>itemsTotal</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>namespace</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>searchActionURL</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>searchContainerId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>searchFormMethod</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>searchFormName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>searchInputName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>searchValue</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selectable</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selectedItems</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>showAdvancedSearch</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>showCreationMenu</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>showFiltersDoneButton</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>showInfoButton</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>showSearch</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>sortingOrder</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>sortingURL</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>viewTypeItems</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>navigation-bar</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.NavigationBarTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inverted</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>navigationItems</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>progressbar</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.ProgressBarTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>maxValue</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>minValue</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>status</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>value</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>radio</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.RadioTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>checked</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inline</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>name</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>showLabel</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>value</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>select</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.SelectTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>multiple</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>name</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>options</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>wrapperType</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>sticker</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.StickerTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>icon</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>label</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>outside</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>position</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>shape</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>size</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>style</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>stripe</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.StripeTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>autoClose</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>destroyOnHide</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>message</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>style</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>title</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
   <tag>
      <description></description>
      <name>user-card</name>
      <tag-class>com.liferay.frontend.taglib.clay.servlet.taglib.soy.UserCardTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
         <description></description>
         <name>actionDropdownItems</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>componentId</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>data</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>disabled</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>elementClasses</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>groupName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>href</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>icon</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>id</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>imageAlt</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>imageSrc</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>initials</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inputName</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>inputValue</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>name</name>
         <required>true</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>resultRow</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>rowChecker</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selectable</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>selected</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>spritemap</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>subtitle</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <description></description>
         <name>userColor</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
   </tag>
</taglib>

More Blog Entries

0 Comments