docs: private static String[] parseParts(final String portletWindowIdString) {
          // Note that we cannot simply use the ID_PART_SEPARATOR_PATTERN on 'portletWindowIdString'
          // because it may have a
          // 'delegate' layout node id that itself has a portlet window instance id, and thus the
          // period in the layout node ID part
          // will mess up the parsing.
          // Example:  "146_dlg-5-ctf1-18.tw_18.1" would parse into { "146_dlg-5-ctf1-18", "tw_18",
          // "1"} instead of { "146_dlg-5-ctf1-18.tw_18", "1" }
          final UserIdAndOtherParts userIdAndOtherParts =
                  parseUserIdAndOtherParts(portletWindowIdString);
          if (userIdAndOtherParts.portletWindowInstanceId == null) {
              return new String[] {portletWindowIdString};
          } else {
              final String portletDefinitionId =
                      PortletEntityIdStringUtils.parsePortletDefinitionId(portletWindowIdString);
              final String layoutNodeId =
                      PortletEntityIdStringUtils.parseLayoutNodeId(portletWindowIdString);
              final String portletEntityId =
                      PortletEntityIdStringUtils.format(
                              portletDefinitionId, layoutNodeId, userIdAndOtherParts.userId);
              return createPartsArray(
                      portletEntityId,
                      userIdAndOtherParts.portletWindowInstanceId,
                      userIdAndOtherParts.extraParts);
          }
      }