private String _getBreadcrumbLayoutURL(
      Layout selLayout, String selLayoutParam, PortletURL portletURL, ThemeDisplay themeDisplay)
      throws Exception {
    if (portletURL == null) {
      return PortalUtil.getLayoutURL(selLayout, themeDisplay);
    } else {
      portletURL.setParameter(selLayoutParam, String.valueOf(selLayout.getPlid()));

      if (selLayout.isTypeControlPanel()) {
        if (themeDisplay.getDoAsGroupId() > 0) {
          portletURL.setParameter("doAsGroupId", String.valueOf(themeDisplay.getDoAsGroupId()));
        }

        if (themeDisplay.getRefererPlid() != LayoutConstants.DEFAULT_PLID) {
          portletURL.setParameter("refererPlid", String.valueOf(themeDisplay.getRefererPlid()));
        }
      }

      return portletURL.toString();
    }
  }
  protected long getRefererGroupId(ThemeDisplay themeDisplay) throws Exception {

    long refererGroupId = 0;

    try {
      Layout refererLayout = LayoutLocalServiceUtil.getLayout(themeDisplay.getRefererPlid());

      refererGroupId = refererLayout.getGroupId();
    } catch (NoSuchLayoutException nsle) {
    }

    return refererGroupId;
  }
  @Override
  public void addAndStoreSelection(
      PortletRequest portletRequest, String className, long classPK, int assetEntryOrder)
      throws Exception {

    String referringPortletResource =
        ParamUtil.getString(portletRequest, "referringPortletResource");

    if (Validator.isNull(referringPortletResource)) {
      return;
    }

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

    Layout layout = LayoutLocalServiceUtil.getLayout(themeDisplay.getRefererPlid());

    PortletPreferences portletPreferences =
        PortletPreferencesFactoryUtil.getPortletSetup(
            themeDisplay.getScopeGroupId(), layout, referringPortletResource, null);

    String selectionStyle = portletPreferences.getValue("selectionStyle", "dynamic");

    if (selectionStyle.equals("dynamic")) {
      return;
    }

    AssetEntry assetEntry = AssetEntryLocalServiceUtil.getEntry(className, classPK);

    addSelection(
        themeDisplay,
        portletPreferences,
        referringPortletResource,
        assetEntry.getEntryId(),
        assetEntryOrder,
        className);

    portletPreferences.store();
  }
  @Override
  public void addSelection(
      ThemeDisplay themeDisplay,
      PortletPreferences portletPreferences,
      String portletId,
      long assetEntryId,
      int assetEntryOrder,
      String assetEntryType)
      throws Exception {

    AssetEntry assetEntry = AssetEntryLocalServiceUtil.getEntry(assetEntryId);

    String[] assetEntryXmls = portletPreferences.getValues("assetEntryXml", new String[0]);

    String assetEntryXml = _getAssetEntryXml(assetEntryType, assetEntry.getClassUuid());

    if (!ArrayUtil.contains(assetEntryXmls, assetEntryXml)) {
      if (assetEntryOrder > -1) {
        assetEntryXmls[assetEntryOrder] = assetEntryXml;
      } else {
        assetEntryXmls = ArrayUtil.append(assetEntryXmls, assetEntryXml);
      }

      portletPreferences.setValues("assetEntryXml", assetEntryXmls);
    }

    long plid = themeDisplay.getRefererPlid();

    if (plid == 0) {
      plid = themeDisplay.getPlid();
    }

    List<AssetEntry> assetEntries = new ArrayList<AssetEntry>();

    assetEntries.add(assetEntry);

    notifySubscribers(portletPreferences, plid, portletId, assetEntries);
  }